Vulnerability

無氣體發送:錯誤地保存乙太

  • June 15, 2019

我從以下程式碼中獲得了以下程式碼: 來自乙太坊智能合約的攻擊調查

contract C { 
function pay(uint n, address d){ 
   d.send(n);  
} 
}
contract D1 {
 uint public count = 0;
 function(){ 
  count++; 
 }

}

一篇文章: Contract Fuzzer: Fuzzing Smart Contracts…. 說:

如果這種異常沒有得到適當的檢查和傳播,惡意的發件人可能會在看似無辜的情況下錯誤地保留乙太幣。

發送氣體津貼為 2300。因此,如果由於代價高昂的回退功能控制發送失敗,則將返回到“契約 C”。在“發送”的情況下不會傳播異常。“發送”返回假。有人可以指導我“在這種情況下,惡意發件人如何錯誤地保留乙太幣?”

pay如果有人用C實例的地址呼叫實例的函式D1

  • 實例應該向實例C發送nweiD1
  • 結果,實例d.send的回退函式將被執行D1
  • 此函式更改D1實例的狀態變數,該操作至少花費 5000 gas
  • 由於這超過了 2300 個 gas 津貼,因此備用功能將因 gas 不足而恢復
  • C實例會將這些wei保留n給自己,即使它本應將它們洩露出去

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