Security

重現遞歸呼叫漏洞

  • August 14, 2016

這是我想使用遞歸呼叫攻擊的合約:

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``publicpublic

引用自:https://ethereum.stackexchange.com/questions/8032