Dao
是否拋出了 DAO(被攻擊)程式碼的一部分?
我附上了一張與DAO攻擊有關的圖片。我從以下連結A Survey on Ethereum Systems Security: Vulnerabilities, Attacks and Defenses獲得了圖像 。該圖像顯示了一個包含“throw”的程式碼。我對 throw 感到困惑,因為它會導致反轉。DOA 攻擊是否使用了“投擲”?有人請指導我在 DAO 攻擊中使用了 throw,為什麼它沒有導致所有交易的逆轉(和退款)?
不。
如果我正確理解圖表,它只是顯示契約檢查
msg.sender.call.value(reward)
結果以確保它有效,並且如果轉移被拒絕,它打算拋出,這是正確的做法。它沒有失敗。它呼叫了攻擊者(成功),這給了攻擊者一個考慮重新進入的機會。攻擊者需要觀察剩餘的氣體,以確保它不會因循環而耗盡,否則一切都會放鬆。
當它決定停止重新進入並返回時,執行緒將通過
Y
路徑下降並從balances[msg.sender]
. 那沒有下溢保護,所以如圖所示的語句不會失敗。在最壞的情況下,msg.sender 最終會出現巨大的餘額,這將成為更多惡作劇的機會。
throw
在那之後,即使圖表排序使它看起來可能存在,也沒有路徑。“失去”箭頭不是疏忽。如果他們添加了“結束”塊,可能會更清楚。希望能幫助到你。