2018年12月19日,眾多游戲類DApp遭遇交易回滾攻擊,其中包括BetDice,EOSMax,ToBet等。按當時18元人民幣的價格計算,損失超過500萬人民幣。期間BetDice通過鏈金術平臺發出多次公告,一度造成恐慌。
與此同時,慢霧安全團隊對交易所和中心化錢包給出了暫時性的方案。此刻,攻擊手法依舊是一個謎團。那么,攻擊手段究竟是怎樣的呢?在進行攻擊回顧之前,需要先了解一點技術背景。
技術背景
1、我們知道EOS采用的共識算法是DPOS算法,采用的是21個超級節點輪流出塊的方式。除了21個超級節點外的其他全節點,并沒有出塊的權限。起到的作用是將收到的交易廣播出去,然后超級節點將其進行打包。
說到這里,很容易看出,如果一筆交易是發給除了超級節點外的其他全節點,這筆交易會經歷兩個過程。首先,這筆交易先被全節點接收,然后交易再被節點廣播出去進行打包。而一筆交易是需要超級節點中超過2/31的節點進行確認之后才是不可回滾的,也就是不可逆的。
這個過程大概需要3分鐘左右,也就是說,交易發到除了超級節點外的全節點的時候,由于全節點沒有打包的權利,此時此刻交易仍然處于可逆狀態。這是一個核心關鍵點。
慢霧:過去一周Web3生態系統因安全事件損失近160萬美元:6月26日消息,慢霧發推稱,過去一周Web3生態系統因安全事件損失近160萬美元,包括MidasCapital、Ara、VPANDADAO、Shido、Slingshot、IPO、Astaria。[2023/6/26 22:00:21]
2、每一個bp,都可以在自己的節點的config.ini文件內進行黑名單的配置,在黑名單中的帳號是不能進行交易的,也就是說無論怎樣,黑名單的交易都會被回滾。
黑名單配置路徑:
MacOS:
~/Library/ApplicationSupport/eosio/nodeos/config/config.ini
Linux:
~/.local/share/eosio/nodeos/config/config.ini
配置方法:將config.ini文件內的actor-blacklist填入黑名單帳號,如下圖中,將attacker這個帳號作為黑名單帳號。
慢霧:利用者通過執行惡意提案控制了Tornado.Cash的治理:金色財經報道,SlowMist發布Tornado.Cash治理漏洞解析。 5月20日,Tornado.Cash遭受了治理攻擊,利用者通過執行惡意提案控制了Tornado.Cash的治理。5月13日,利用者發起了20提案,并在提案中說明20提案是對16提案的補充,具有相同的執行邏輯。但實際上,提案合約多了一個自毀邏輯,其創建者是通過create2創建的,具有自毀功能,所以在與提案合約自毀后,利用者仍可以部署不同的以與以前相同的方式將字節碼發送到相同的地址。不幸的是,社區沒有看到擬議合約中的犯規行為,許多用戶投票支持該提案。
在5月18日,利用者通過創建具有多個交易的新地址,反復將0代幣鎖定在治理中。利用提案合約可以銷毀并重新部署新邏輯的特性,利用者在5月20日7:18(UTC)銷毀了提案執行合約,并在同一地址部署了一個惡意合約,其邏輯是修改用戶在治理中鎖定的代幣數量。
攻擊者修改完提案合約后,于5月20日7:25(UTC)執行惡意提案合約。該提案的執行是通過 Delegatecall 執行的,因此,該提案的執行導致治理合約中由開發者控制的地址的代幣鎖定量被修改為 10,000。提案執行完成后,攻擊者從治理庫中解鎖了TORN代幣。金庫中的TORN代幣儲備已經耗盡,同時利用者控制了治理。[2023/5/21 15:17:00]
了解了以上的知識點之后,我們就可以進行整個攻擊事件的回顧了。
慢霧:疑似Gemini相關地址在過去5小時內共轉出逾20萬枚ETH:金色財經消息,慢霧監測顯示,疑似加密交易所Gemini相關地址(0xea3ec2a08fee18ff4798c2d4725ded433d94151d)已在過去5小時內歸集并轉出逾20萬枚ETH(超3億美元)。[2022/7/19 2:22:08]
攻擊回顧
跟蹤攻擊者的其中一個攻擊帳號,發現帳號合約內只有一個transfer函數
同時,我們可以通過復盤這個帳號的所有交易記錄發現,這個帳號只有開獎記錄,而沒有下注記錄,看起來就好像項目方故意給這個帳號進行開獎一樣。然而事實上并非如此。那為什么會出現這樣的情況呢?這就需要上面的技術背景的知識了。以下是詳細的攻擊手法:
1、首先:攻擊者調用非黑名單合約的transfer函數,函數內部有一個inlineaction進行下注,from填寫的是攻擊者控制的非黑名單合約帳號,to填寫的是游戲合約帳號。這時,攻擊者發送交易是發向游戲合約自己的全節點服務器。使用的是黑名單帳號進行。
2、游戲節點讀取到了這筆交易,立刻進行開獎,如果中獎,將對攻擊者控制的非黑名單帳號發送EOS。
慢霧:Badger DAO黑客已通過renBTC將約1125 BTC跨鏈轉移到10 個BTC地址:12月2日消息,Badger DAO遭遇黑客攻擊,用戶資產在未經授權的情況下被轉移。據慢霧MistTrack分析,截止目前黑客已將獲利的加密貨幣換成 renBTC,并通過renBTC 將約 1125 BTC 跨鏈轉移到 10 個 BTC 地址。慢霧 MistTrack 將持續監控被盜資金的轉移。[2021/12/2 12:46:11]
3、在經歷了一個1,2兩個操作之后。理論上攻擊者控制的非黑名單帳號是進行了余額扣除。然后進行正常的開獎邏輯。到這里之前,一切都是正常的。也許有讀者會問,為什么配置了黑名單,交易還能正常發起?原因是這個黑名單生效范圍是在bp內,普通的全節點的config.ini內是沒有黑名單的配置的。所以攻擊者依然可以發起交易。
4、到此為止,攻擊正式開始,也到了最關鍵的地方,由于項目方節點在收到下注交易的時候已經立馬完成了開獎邏輯,而且采用的是線下開獎的模式,即下注交易和開獎交易是兩筆不同的交易。但是,這兩筆交易僅僅是在項目方的節點內完成,仍然是可逆的。當項目方節點向bp廣播這兩筆交易的時候,由于第一筆下注交易的發起者在bp節點的黑名單內,這一筆交易將被回滾,也就是打包失敗,而開獎交易的發起者是項目方,不在黑名單之內,會被正常打包。因此兩筆交易中的第一筆下注交易一定會被回滾,而開獎交易依舊會被打包,這也就解釋了為什么只有開獎記錄,而沒有下注記錄。因為下注記錄都被回滾了。
慢霧:Cover協議被黑問題出在rewardWriteoff具體計算參數變化導致差值:2020年12月29日,慢霧安全團隊對整個Cover協議被攻擊流程進行了簡要分析。
1.在Cover協議的Blacksmith合約中,用戶可以通過deposit函數抵押BPT代幣;
2.攻擊者在第一次進行deposit-withdraw后將通過updatePool函數來更新池子,并使用accRewardsPerToken來記錄累計獎勵;
3.之后將通過_claimCoverRewards函數來分配獎勵并使用rewardWriteoff參數進行記錄;
4.在攻擊者第一次withdraw后還留有一小部分的BPT進行抵押;
5.此時攻擊者將第二次進行deposit,并通過claimRewards提取獎勵;
6.問題出在rewardWriteoff的具體計算,在攻擊者第二次進行deposit-claimRewards時取的Pool值定義為memory,此時memory中獲取的Pool是攻擊者第一次withdraw進行updatePool時更新的值;
7.由于memory中獲取的Pool值是舊的,其對應記錄的accRewardsPerToken也是舊的會賦值到miner;
8.之后再進行新的一次updatePool時,由于攻擊者在第一次進行withdraw后池子中的lpTotal已經變小,所以最后獲得的accRewardsPerToken將變大;
9.此時攻擊者被賦值的accRewardsPerToken是舊的是一個較小值,在進行rewardWriteoff計算時獲得的值也將偏小,但攻擊者在進行claimRewards時用的卻是池子更新后的accRewardsPerToken值;
10.因此在進行具體獎勵計算時由于這個新舊參數之前差值,會導致計算出一個偏大的數值;
11.所以最后在根據計算結果給攻擊者鑄造獎勵時就會額外鑄造出更多的COVER代幣,導致COVER代幣增發。具體accRewardsPerToken參數差值變化如圖所示。[2020/12/29 15:58:07]
整個過程可以參考下面的圖:
攻擊復現
本次攻擊復現參考EOSLIVE錢包團隊的文章:https://eos.live/detail/19255
1、環境準備
本地準備兩個節點,一個出塊節點,一個同步節點,出塊節點用于模擬真實bp,而同步節點則用于模擬項目方,其中出塊節點需要開啟history插件,方便后續的debug,并且把attacker加入節點黑名單。方便后續的debug。打包節點則需要開啟自動開獎插件,自動開獎插件配置詳見:
https://github.com/superoneio/security
本次復現用到的代碼:
https://github.com/superoneio/security
本地多節點配置方法官方參考:
https://developers.eos.io/eosio-nodeos/docs/local-multi-node-testnet
三個測試帳號,分別是tobetioadmin,tobetiologs1,attackproxy1,分別為項目方帳號,項目方log帳號,和攻擊代理帳號,其中tobetioadmin部署tobet游戲合約,tobetiologs1部署logs合約,attackproxy1部署attack合約。注意除了攻擊代理帳號外的其他兩個帳號不要改為其他帳號,如果改為其他帳號需要對自動開獎插件進行修改,自動開獎插件是攔截tobetioadmin這個帳號的。
附上我的雙節點的配置:
其中nodeos_main為出塊節點,nodeos_second為同步節點。
2、啟動節點
看到以上信息則代表dice_plugin配置成功
3、首先對正常的邏輯進行測試。
使用attackproxy1對tobetioadmin帳號進行正常的轉賬交易
可以看到,攻擊代理合約進行了正常的轉賬。
4、開始攻擊,使用黑名單帳號調用攻擊代理合約,向項目方合約發起攻擊。查詢初始余額
為保證攻擊成功,連續向項目方發起4起攻擊
再次查詢余額
查詢attacker帳號記錄
可見,并沒有attacker對attackproxy1的調用記錄,最后兩條記錄是我測試直接使用黑名單向tobetadmin發起攻擊的時候留下的記錄。與本次測試無關。但是通過查詢發現,本地記錄和鏈上記錄是相吻合的,即無下注記錄。
查詢attackproxy1的帳號記錄
可以看到的是,這個也與鏈上記錄吻合,只有開獎記錄,就像tobetadmio故意給attackproxy1開獎一般。
通過以上的復現及和鏈上記錄的對比,我們可以證明上文說的攻擊手法,就是黑客本次進行攻擊的手法,采用的就是使用黑名單進行回滾的操作。
防御建議
1、針對DApp的防御建議
節點開啟readonly模式,防止節點服務器上出現未確認的塊建立開獎依賴,如訂單依賴,開獎的時候判斷訂單是否存在,就算在節點服務器上開獎成功,由于在bp上下注訂單被回滾,所以相應的開獎記錄也會被回滾。
2、針對交易所和中心化錢包的防御建議
慢霧安全團隊建議EOS交易所及中心化錢包在通過RPC接口get_actions查詢熱錢包充值記錄時,應檢查充值transaction所在的block_num是否小于last_irreversible_block,如果block_num大于last_irreversible_block則表示該區塊仍然是可逆的,存在「假充值」風險。
本文來源于非小號媒體平臺:
慢霧科技
現已在非小號資訊平臺發布1篇作品,
非小號開放平臺歡迎幣圈作者入駐
入駐指南:
/apply_guide/
本文網址:
/news/3627097.html
免責聲明:
1.資訊內容不構成投資建議,投資者應獨立決策并自行承擔風險
2.本文版權歸屬原作所有,僅代表作者本人觀點,不代表非小號的觀點或立場
上一篇:
再提Mt.Gox,糟糕的「里程碑事件」正提升區塊鏈世界的安全意識
下一篇:
復盤數十萬EOS被盜過程,背后是其架構設計缺陷?
親愛的用戶: BigONE已經在2019年5月24日中午12:00對平臺賬戶的CRO持有量進行快照,排名前50且持有量≥10,000CRO的用戶,每人都可領取4666.66的CRO代幣獎勵.
1900/1/1 0:00:002019年1月,黑客攻擊了新西蘭的虛擬貨幣交易所Cryptopia,盜取了以ETH為主的數字資產之后銷聲匿跡。近日,隨著幣價的攀升,該黑客在沉寂了數月后,開始密集的洗錢行動.
1900/1/1 0:00:00據彭博社報道,比特幣的支持者們現在已開始宣稱比特幣的下一次“區塊獎勵減半”將成為比特幣價格上漲的催化劑.
1900/1/1 0:00:00為了慶祝LBank期權交易火熱上線,并拓展PHV的交易場景。我們啟動了預算共10BTC的「PHV期權補償基金」激勵補償活動.
1900/1/1 0:00:00要點速覽: 1.資金在2018年下半年風險偏好降低,資金趨向于回流美國,比特幣作為風險資產同樣受到資金回流的極大影響.
1900/1/1 0:00:00近日,沃爾頓鏈與首個基于區塊鏈的互聯網底層協議項目Blockcloud達成戰略合作。雙方就區塊鏈技術的應用及拓展達成合作,雙方將發揮各自技術優勢,整合雙方渠道及平臺資源,推動區塊鏈行業發展.
1900/1/1 0:00:00