Reentrant-Attacks

2016 年 6 月 17 日的可重入攻擊次數

  • June 28, 2016

這篇文章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 是如何阻止這種情況的。

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