> 本次事件發生原因是由於社區在檢查提案時未能發現提案中存在的風險,並沒有認真核實提案合約的代碼是否存在安全漏洞。**撰文:SharkTeam**北京時間2023 年5 月20 日,Tornado.Cash 遭受提案攻擊,攻擊者已獲利約68 萬美元。 SharkTeam 對此事件第一時間進行了技術分析,並總結了安全防範手段,希望後續項目可以引以為戒,共築區塊鏈行業的安全防線。## 一、事件分析攻擊者地址:0x092123663804f8801b9b086b03B98D706f77bD590x592340957eBC9e4Afb0E9Af221d06fDDDF789de9攻擊合約:0xAF54612427d97489707332efe0b6290F129DbAcb0x03ecf0d22f9ccd21144a7d492cf63b471916497a0x7dc86183274b28e9f1a100a0152dac975361353d(部署合約)0xc503893b3e3c0c6b909222b45f2a3a259a52752d(假提案合約)被攻擊合約:0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce發起提案交易:0x34605f1d6463a48b818157f7b26d040f8dd329273702a0618e9e74fe350e6e0d攻擊交易:0x3274b6090685b842aca80b304a4dcee0f61ef8b6afee10b7c7533c32fb75486d攻擊流程:(1)首先,攻擊者(0x08e80ecb)先向被攻擊合約(0x5efda50f)發起了一個提案,並宣稱此提案是16 號提案的補充(2)但提案中實際上存在一個額外的自毀函數。(3)很遺憾的是社區並沒有發現此提案中存在問題,大多數成員都投票通過了這次提案。(4)攻擊者創建了很多個合約來實行代幣的轉移(5)攻擊者(0x08e80ecb)銷毀了提案合約(0xc503893b)和他的創建合約(0x7dc86183)。隨後在相同的地址重新部署了攻擊合約(0xc503893b)。(6)修改完提案合約後,攻擊者(0x08e80ecb)執行提案並將自己所控制的合約地址的代幣鎖定量都修改為10000。(7)提案執行完成後,攻擊者(0x08e80ecb)將代幣轉移到自己的地址,並獲得被攻擊合約的所有權。漏洞分析:由於提案合約(0xc503893b)的創建合約(0x7dc86183)是通過creat2 進行部署的,所以兩個合約銷毀之後,在同一地址上可以部署新的邏輯合約,並且提案執行是通過delegatecall 的形式調用,攻擊合約可任意修改被攻擊合約中的值。事件總結:本次事件發生原因是由於社區在檢查提案時未能發現提案中存在的風險,並沒有認真核實提案合約的代碼是否存在安全漏洞。## 二、安全建議針對本次攻擊事件,我們在開發過程中應遵循以下注意事項:* 在進行提案設計時充分考慮提案機制的安全性並儘量降低提案被中心化控制的風險,可以考慮通過降低攻擊的價值,增加獲得投票權的成本,以及增加執行攻擊的成本等方式結合實際妥善設計。* 在進行提案的投票前,社區應慎重檢查合約代碼是否有後門。* 在提案通過前,可聯繫第三方安全審計公司對合約邏輯代碼進行安全審計。
SharkTeam:Tornado.Cash 提案攻擊原理分析
撰文:SharkTeam
北京時間2023 年5 月20 日,Tornado.Cash 遭受提案攻擊,攻擊者已獲利約68 萬美元。 SharkTeam 對此事件第一時間進行了技術分析,並總結了安全防範手段,希望後續項目可以引以為戒,共築區塊鏈行業的安全防線。
一、事件分析
攻擊者地址:
0x092123663804f8801b9b086b03B98D706f77bD59
0x592340957eBC9e4Afb0E9Af221d06fDDDF789de9
攻擊合約:
0xAF54612427d97489707332efe0b6290F129DbAcb
0x03ecf0d22f9ccd21144a7d492cf63b471916497a
0x7dc86183274b28e9f1a100a0152dac975361353d(部署合約)
0xc503893b3e3c0c6b909222b45f2a3a259a52752d(假提案合約)
被攻擊合約:
0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce
發起提案交易:
0x34605f1d6463a48b818157f7b26d040f8dd329273702a0618e9e74fe350e6e0d
攻擊交易:
0x3274b6090685b842aca80b304a4dcee0f61ef8b6afee10b7c7533c32fb75486d
攻擊流程:
(1)首先,攻擊者(0x08e80ecb)先向被攻擊合約(0x5efda50f)發起了一個提案,並宣稱此提案是16 號提案的補充
(2)但提案中實際上存在一個額外的自毀函數。
(3)很遺憾的是社區並沒有發現此提案中存在問題,大多數成員都投票通過了這次提案。
(4)攻擊者創建了很多個合約來實行代幣的轉移
(5)攻擊者(0x08e80ecb)銷毀了提案合約(0xc503893b)和他的創建合約(0x7dc86183)。隨後在相同的地址重新部署了攻擊合約(0xc503893b)。
(6)修改完提案合約後,攻擊者(0x08e80ecb)執行提案並將自己所控制的合約地址的代幣鎖定量都修改為10000。
(7)提案執行完成後,攻擊者(0x08e80ecb)將代幣轉移到自己的地址,並獲得被攻擊合約的所有權。
漏洞分析:由於提案合約(0xc503893b)的創建合約(0x7dc86183)是通過creat2 進行部署的,所以兩個合約銷毀之後,在同一地址上可以部署新的邏輯合約,並且提案執行是通過delegatecall 的形式調用,攻擊合約可任意修改被攻擊合約中的值。
事件總結:本次事件發生原因是由於社區在檢查提案時未能發現提案中存在的風險,並沒有認真核實提案合約的代碼是否存在安全漏洞。
二、安全建議
針對本次攻擊事件,我們在開發過程中應遵循以下注意事項: