Vulnerability
無氣體發送:錯誤地保存乙太
我從以下程式碼中獲得了以下程式碼: 來自乙太坊智能合約的攻擊調查
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
發送n
weiD1
- 結果,實例
d.send
的回退函式將被執行D1
- 此函式更改
D1
實例的狀態變數,該操作至少花費 5000 gas- 由於這超過了 2300 個 gas 津貼,因此備用功能將因 gas 不足而恢復
C
實例會將這些wei保留n
給自己,即使它本應將它們洩露出去