AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程
AMR無限增發代幣至任意以太坊地址的漏洞利用及修復過程
0x00 項目簡述
Ammbr主要目標是打造具有高度彈性且易于連接的分布式寬帶接入平臺,同時降低上網相關成本。Ammbr打算創建具有人工智能和智能合約功能的高通量區塊鏈平臺,在為無線寬帶用戶清除障礙的同時,確保無數接入基礎架構所有者公平參與。自2017年9月1日起發售AMMBR代幣。
0x01 漏洞詳情
合約地址:
0x96c833e43488c986676e9f6b3b8781812629bbb5
合約代碼地址:
https://etherscan.io/address/0x96c833e43488c986676e9f6b3b8781812629bbb5#code
合約類型:
ERC20(https://github.com/ethereum/EIPs/issues/20)
漏洞函數:multiTransfer
漏洞類型:整數溢出
漏洞危害:可導致增發任意數額的AMR代幣至任意以太坊賬戶。
0x02 細節分析
代碼201行在處理輸入參數tokens數組累加的時候,沒有使用SafeMath,使得攻擊者有機會構造一次整數溢出,導致后續計算totalTokensToTransfer時值可以被攻擊者篡改,最終導致繞過204行余額檢查,轉出巨額資產。
整數溢出的原理非常簡單,原理如圖所示,如果兩個8位變量A和B按位相乘,結果超出8位,超出位將被丟棄,只保留后8位長度。該漏洞中的產生溢出的變量名為totalTokensToTransfer,該變量類型為uint,在Solidity中,uint長度為256位,所以只要累加超過2^256-1大小的數,將會導致整數溢出。
0x03 調試與POC
我們使用Remix調試代碼,首先調用mint函數為自己的賬戶增加一點Token余額,這個函數必須合約創建者才能調用,為自己增加余額后。我們直接調用multiTransfer來觸發漏洞。
POC如下:
["0xda12391a57b16510ac82384640a44ecbd43243db","0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c"],["38597363079105398474523661669562635951089994888546854679819194669304376546645","38597363079105398474523661669562635951089994888546854679819194669304376546645","38597363079105398474523661669562635951089994888546854679819194669304376546646"]
參數1我們隨意創建了三個地址,該地址用來接收被黑資產。
tokens參數使用的值:
38597363079105398474523661669562635951089994888546854679819194669304376546645
該值為2^256/3計算得出,由于不能整除,我們在最后一個參數加一,使得最終totalTokensToTransfer累加可等于2^256。由于uint256最大可容納值為2^256-1,累加等于2^256使得totalTokensToTransfer被溢出超出1位,導致該數被攻擊者置零。
點底部的Debug可以看到漏洞細節。我們可以看到走到這里totalTokensToTransfer變量由于整數溢出已經被沖成零。
然后繼續往下走,走至return處,可以我們參數中的三個賬戶被充入了指定數額的資產。
0x04 修復建議
將201行使用SafeMath改為:
totalTokensToTransfer = totalTokensToTransfer.add(tokens[i]);
轉載于:https://www.cnblogs.com/xiaocongcong888/p/9428050.html
總結
以上是生活随笔為你收集整理的AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决C语言程序报错:return typ
- 下一篇: MySQL中整型和字符串类型指定长度的含