Security
重現遞歸呼叫漏洞
這是我想使用遞歸呼叫攻擊的合約:
contract Abstract { function foobar(); } contract B { uint stateVar; function foo(Abstract someAddress){ someAddress.foobar(); } function bar(uint x) { stateVar = x; } }
這是部署在其他地址的惡意合約:
contract MaliciousContract { function foobar() { //What do I need to put here to make **B.bar(255)** possible? } }
來自solidity docs:
與另一個合約的任何互動都會帶來潛在的危險,特別是如果事先不知道合約的原始碼。目前的合約將控制權移交給被呼叫的合約,這可能會做任何事情。即使被呼叫的合約繼承自已知的父合約,也只需要繼承的合約有正確的介面即可。然而,契約的執行可能是完全任意的,因此會造成危險。此外,請做好準備,以防它在第一次呼叫返回之前呼叫系統的其他合約,甚至返回呼叫合約。這意味著被呼叫合約可以通過其函式改變呼叫合約的狀態變數。以某種方式編寫函式,例如,
我想要實現的是:
這意味著被呼叫合約可以通過其函式改變呼叫合約的狀態變數。
所以,我的行動是:
- 我打電話給 B.foo(‘maliciousContractAddress’);
- …
contract MaliciousContract { function foobar() { //What do I need to put here to make **B.bar(255)** possible? B(msg.sender).bar(255); } }
這是一個很好的例子來提醒將漏洞稱為“遞歸呼叫”可能會產生誤導,因為漏洞不會呼叫
foo
,它會呼叫bar
.重入攻擊
foo
可以使用初始函式****(****external``public
public