Reentrant-Attacks
2016 年 6 月 17 日的可重入攻擊次數
這篇文章2016 年 6 月 17 日 The DAO 攻擊中使用的第二個漏洞是什麼?說 :
從問答
$$ … $$,每個事務(至少來自我的手動計數的第一個和第二個)呼叫 splitDAO(…) 29 次。但是 29 x splitDAO(…) 呼叫被重複呼叫,創建 > 27996 個內部交易,13996 個非零內部交易。計算:13996 筆交易 x 258.05656476 ETH = 3,611,759.68038 乙太幣,這大約是 3,641,694.241898506 乙太幣(59,578,117.80 美元)被轉移到賬戶 0x304a554a310c7e546dfe434669c0d68208320
但是乙太坊的呼叫堆棧的呼叫深度大小最大大小不是上限為 1024 嗎?大多數部落格文章都說這種遞歸只能完成〜30次……
2016 年 6 月 17 日 The DAO 攻擊中使用的第二個漏洞是什麼?.
攻擊者所做的是將他們的代幣從一個賬戶轉移到另一個賬戶,這樣他們就可以遞歸地反複呼叫 SplitDAO 29 x,例如:
for (i = 1 to 482) { call wallet default function () // which performed the following: // transfer tokens to another account // call splitDAO(...) with recursion to the depth of 29x. }
從上面的連結:
這不是一個漏洞,但攻擊巧妙地在兩個賬戶之間轉移了它的 DAO 令牌,通過使用函式 transfer(address _to, uint256 _amount)。
所以攻擊合約的回退函式如下所示:
function() { transfer DAO tokens to other attacking contract invoke splitDAO }
有 2 個攻擊合約將 DAO 代幣相互轉移。當一個攻擊合約的交易完成時,餘額
$$ msg.sender $$= 0 將被正確設置,但代幣已轉移到另一個合約。現在另一個合約執行攻擊,直到它的交易完成。進攻契約交替進行。 來源
@Roland 的回答提到了 TheDAO 是如何阻止這種情況的。