在私有以太坊上實現針對ERC20數字貨幣ProxyOverflow漏洞的攻擊
ERC20的ProxyOverflow漏洞造成影響廣泛,本文將對其攻擊方法進行分析,以便於智慧合約釋出者提高自身程式碼安全性以及其他研究人員進行測試。本文選擇傳播廣泛、影響惡劣的SMT漏洞(CVE-2018–10376)作為樣本進行分析,文中所涉及的程式碼截圖均來自於SMT程式碼。由於目前各大交易平臺已經將ERC20協議的數字貨幣交易叫停,本文的釋出不會對這些貨幣帶來直接影響。
1 ERC20貨幣及transferProxy函式
1.1 ERC20貨幣簡介
基於ERC20協議的數字貨幣(以下簡稱為ERC20貨幣)實際上是以太坊上執行的智慧合約,合約中對於每個賬戶擁有的貨幣數目是通過 賬戶地址→貨幣數 的對映關係進行的記錄:
mapping (address => uint256) balances
ERC20貨幣的擁有者要想進行貨幣交易、餘額查詢等操作時,需要向智慧合約對應的地址傳送訊息,宣告呼叫的函式和相應引數。這一訊息將會礦機接收,並執行智慧合約中相應的函式程式碼。在這一過程中,訊息傳送者需要向挖礦成功的礦機支付相應的報酬。這筆報酬在以太坊中被稱作gas,其支付貨幣為以太幣。也就是說,ERC20的貨幣擁有者要想傳送貨幣交易訊息,就需要擁有一定數量的以太幣。
然而,ERC20貨幣擁有者並不一定擁有以太幣。為了滿足他們發起貨幣交易的需求,ERC20 協議提供了transferProxy函式。利用該函式,ERC20貨幣擁有者可以簽署一個交易訊息,並交由擁有以太幣的第三方節點將其傳送到以太坊上。訊息的傳送者會從擁有者那裡獲取一定數量的ERC20貨幣作為其傳送訊息的代理費用。
1.2 transferProxy函式程式碼分析
SMT的transferProxy函式程式碼如下圖所示:
該函式的各個引數解釋如下,該函式程式碼邏輯較為簡單,此處不做贅述。
- address _from:ERC20 貨幣的擁有者和交易的發起者;
- address _to:貨幣交易中的接收者;
- uint256 _value:貨幣交易的數額;
- uint256 _feeSmt:交易資訊傳送者(即函式中msg.sender)收取的代理費用;
- uint _v,bytes32 _r,bytes32 _s:交易發起者(即_from)生成的簽名資料。
需注意的是,程式碼215行中的transferAllowed(_from)是transferProxy()執行前必會執行的驗證函式。該函式程式碼如下:
程式碼117行中的exclude為對映結構,僅合約的建立者將為設定為True,其他地址預設均為False。
程式碼118行判定transferEnabled標誌符是否為true,該標誌只能通過enableTransfer函式設定,且該函式只能被合約建立者呼叫,該函式的作用是使得ERC20合約的交易過程可控,這也是SMT等貨幣出現問題時能夠在後續中止交易的原因:
程式碼119-121行對於交易傳送者(即_from)帳號是否被鎖定進行了檢查,lockFlag和locked都只能被合約建立者所控制:
Lock相關操作函式Lock相關操作函式
綜上所述,只有整個合約在允許交易且攻擊者帳號未被鎖定的情況下,攻擊者才能真正呼叫transferProxy函式。在引數處理過程中發生漏洞的原因可參見我們之前的分析文章:《SMT整型溢位漏洞分析筆記》。
2 攻擊重現
為了重現攻擊,我們選擇了基於go語言編寫的以太坊客戶端geth進行以太坊私有網路的部署。為了便於實現可程式設計的自動化互動,我們選擇了Web3.py作為與以太坊節點互動的中介軟體。
2.1 漏洞驗證環境的搭建
S1. 從連結頁面下載SMT智慧合約原始碼;
S2. 建立兩臺Linux虛擬機器;
S3. 準備Python執行環境,在兩臺虛擬機器上安裝python3,並利用pip安裝web3、py-solc、hexbytes、attrdict;
S4. 準備合約編譯環境,在兩臺虛擬機器上安裝智慧合約程式碼編譯器solc,參考連結;
S5. 在兩臺虛擬機器上搭建以太坊私有網路,可參考連結,其中:
-- 1) 節點1用於釋出SMT合約程式碼,為其建立以太坊賬戶並分配一定數量以太幣,啟動挖礦;
-- 2) 節點2用於部署攻擊程式碼,建立兩個以太坊賬戶,分別作為transferProxy中的from賬戶(轉賬訊息簽署者,記為Signer)和transferProxy呼叫者(即轉賬訊息的傳送者,記為Sender),為Sender分配一定數量以太幣,並啟動挖礦。
2.2 SMT智慧合約釋出
在節點1上,利用deploy_SMT.py指令碼中的程式碼實現SMT智慧合約的一鍵部署。
關於執行前的配置的介紹:
1) sol_path,代表合約程式碼路徑;
2) account,代表用於釋出合約的賬戶,如1.2所示,只有該賬戶才能呼叫部署好的智慧合約函式,進行控制交易開啟和關閉,維護被鎖賬戶列表等操作;
3) pin,用於解鎖account的密碼。
關於執行過程與結果的分析:
1) tx_receipt,該變數用於獲取部署智慧合約(23行)和傳送啟動交易訊息(35行)的結果,當這兩行程式碼被呼叫後,以太坊網路中會發布相應的訊息,只有在下一個區塊被挖掘出來後,tx_receipt才能獲取非空的結果;
2) contract_address,代表該合約被順利部署到以太坊網路後的合約地址,其他節點要想呼叫合約程式碼,需要獲知該地址以便傳送函式呼叫訊息。
合約程式碼部署結果的截圖如下:
合約部署結果截圖
2.3 ProxyOverflow漏洞攻擊
在節點2上,利用test_SMT.py指令碼中的程式碼可實現針對SMT合約的一鍵攻擊。
關於執行前的配置的介紹:
1) contract_address,來自2.2中SMT部署完成後的輸出值;
2) sol_path,代表合約程式碼路徑;
3) signer,交易資訊的簽署者,也將作為呼叫transferProxy時的_from和_to的實參;
4) sender,交易資訊的傳送者,需要擁有一定數量以太坊以支付gas費用;
5) signer_pin,signer的金鑰解鎖口令,以便對交易資訊進行簽名;
6) sender_pin,sender的金鑰解鎖口令,以便解鎖sender賬戶,支付gas費用;
7) value,代表發生交易的金額;
8) fee,代表支付給sender的代理費用;
9) signer_key_path,代表signer的金鑰檔案路徑。
關於執行過程與結果的分析:
1) 30-35行,基於目標智慧合約地址和程式碼,建立智慧合約物件;
2) 37-38行,獲取並列印sender和signer在攻擊前的SMT幣數目;
3) 40-43行,獲取signer現有的nonce的值,並將其擴充為64字元的字串;
4) 46-62行,構建要進行簽名的資料的Hash值,獲取signer的私有金鑰,並對Hash值進行簽名,獲得簽名資料s,r,v;
5) 63-77行,構造transferProxy函式呼叫引數,進行函式呼叫,並獲取交易回執;
6) 79-80行,獲取並列印sender和signer在攻擊後的SMT幣數目。
攻擊結果的截圖如下:
攻擊結果截圖
相關文章
- 攻擊者正利用已修復的 Drupal 漏洞挖掘數字貨幣
- 以太坊客戶端 Geth 出漏洞,超過 2000 萬美元的數字貨幣被盜客戶端
- 數字貨幣比特幣以太坊買賣五檔行情資料API介面比特幣API
- 以太坊代幣空投合約實現
- 針對性攻擊與移動安全漏洞
- 以太坊智慧合約call注入攻擊
- 報告:針對iOS裝置的加密貨幣挖礦攻擊上升近400%iOS加密
- Check Point:針對iOS裝置的加密貨幣挖礦攻擊上升近400%iOS加密
- Visa正式支援以太坊加密貨幣!加密
- 區塊鏈安全 - 以太坊短地址攻擊區塊鏈
- 區塊鏈安全————以太坊短地址攻擊區塊鏈
- 如何搭建以太坊私有鏈
- 以太坊ERC20 TOKEN 0723 資料分析
- 以太坊創始人Vitalik Buterin抨擊中心化加密貨幣交易所中心化加密
- 以太坊智慧合約-猜數字
- Mac環境搭建以太坊私有鏈Mac
- 基於以太坊上實現DApp的登入註冊APP
- 在以太坊發行代幣Token系列教程(1)
- 數字貨幣現貨交易方式 | 數字貨幣現貨交易模式系統開發定製部署模式
- 針對以色列和巴勒斯坦的apt式攻擊APT
- FireEye遭APT攻擊?!針對企業的APT攻擊是如何發生的?APT
- 通過Geth搭建私有以太坊網路
- 【漏洞分析】ReflectionToken BEVO代幣攻擊事件分析事件
- [譯] 以太坊:能幫我們把 Uber 換掉的非比特幣加密貨幣比特幣加密
- EOS超級節點攻擊曝光:足以轟癱整個數字貨幣體系
- solidity簡單的ERC20代幣實現Solid
- 以太坊和比特幣價格明顯上漲 加密貨幣市值暫時超過1萬億美元比特幣加密
- Paysafe:研究顯示55%持有加密貨幣的人希望以比特幣或以太坊等數字資產形式領取工資加密比特幣
- Zscaler:針對IoT裝置的攻擊在兩年間增長了700%
- 3.6 以太坊私有鏈與聯盟鏈搭建
- 如何實現一個簡單的以太坊?
- 針對 VoIP 伺服器發動 DDoS 攻擊伺服器
- 揭祕以太坊中潛伏多年的“偷渡”漏洞,全球黑客正在瘋狂偷幣黑客
- 如何發現 NTP 放大攻擊漏洞
- 針對TP-LINK的CSRF攻擊來劫持DNS案例DNS
- 【最全】針對工業行業的勒索攻擊調研行業
- 一種針對Microsoft Office的自動化攻擊方式ROS
- BEC合約出現重大漏洞,攻擊者可無限生成代幣