作者:騰訊湛瀘實驗室
來源:https://weibo.com/ttarticle/p/show?id=2309404235727385832166#_0
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函數代碼如下圖所示: