淺析AMR智能合約批量轉賬溢出漏洞
日前,互聯網爆出AMR合約存在高危安全風險的交易,該合約存在批量轉賬溢出漏洞,當合約實現批量轉賬功能時,容易在計算通證增加量時發生溢出漏洞,BUGX.IO安全團隊經過研究分析發現,同類漏洞仍在以太坊裡面部分存在。
以下為漏洞分析過程:
原理
totalTokensToTransfer+=tokens[i];這一句溢出,溢出後,totalTokensToTransfer變小了,從而繞過了assert(balances[msg.sender]>totalTokensToTransfer);的判斷,這樣就能花極少的token,任意增加目標地址的token。
看到攻擊者的攻擊行為:
https://etherscan.io/tx/0xd4ee42c454941fccb5d03f6155e288f28cc00473ba927ee4b19ad4e2bfc68b68
可以看到這兩個 tokens 值都是 uint256 最大值的一半,兩個加起來剛好溢出變為 0。
漏洞復現
1. 部署 AMR 合約。2. 因為需要攻擊者 token 數量大於0,所以先使用管理員賬戶給攻擊者地址充 token。
「0x14723a09acff6d2a60dcdf7aa4aff308fddc160c」,1
使用 可以查看到 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 有 balances 為 1
3. 使用漏洞溢出攻擊
這裡需要兩個地址,一個是攻擊者,另一個為其它地址,這裡設置 0 地址就行。
執行 multiTransfer 就行。
[「0x14723a09acff6d2a60dcdf7aa4aff308fddc160c」,」0x0000000000000000000000000000000000000000」],[「57896044618658097711785492504343953926634992332820282019728792003956564819968」,」57896044618658097711785492504343953926634992332820282019728792003956564819968」]
4. 查看攻擊者餘額
可以看到攻擊者餘額已經變得非常大。
修復方案
1. 使用 safeMath 即可解決此問題。2. 以太坊的大部分合約是以 transfer 的形式進行轉賬,此方法也可以避免溢出問題。
進一步探索
在對以太坊上做進一步探索的時候,我們發現批量轉賬功能或者批量充值功能的實現主要有以下幾種形式:
1. 合約部署時使用批量充值功能
此功能在構造函數中實現,只有部署的時候能夠使用,所以不可利用。
2. 管理者調用批量轉賬功能
即使有漏洞,但受到管理者許可權控制,所以一般不可利用。
3. 公開函數中的批量轉賬功能
我們看到了不少這種形式的寫法,通過 的增加,溢出後繞過了 的檢測。
漏洞影響範圍
研究此漏洞原理後,我們使用自研的審計系統」以太坊衝擊波」,對以太坊上的合約進行整體監測,發現了以下合約均存在此漏洞。
資料


※360追日團隊邊亮:上可逐日追兇,下可乘風破浪
※第三方開發者可以訪問Gmail郵件?Google回應
TAG:FreeBuf |