創宇區塊鏈|Creat future 慘遭隨意轉移幣 幕後黑手究竟是誰?
發表於 2022-04-13 11:36 作者: 區塊鏈情報速遞pro
前 言
CF 代幣合約被發現存在漏洞,它允許任何人轉移他人的 CF 余額。到目前爲止,損失約爲 190 萬美元,而 pancakeswap上CF/USDT 交易對已經受到影響。
知道創宇區塊鏈安全實驗室 第一時間對本次事件深入跟蹤並進行分析。
事件詳情
受影響的合約地址:https://bscscan.com/address/0x8B7218CF6Ac641382D7C723dE8aA173e98a80196#code
問題函數出在第 563 行:
function _transfer(address from, address to,uint256 amount) public {
require(from != address(0), "ERC20: transfer from the zero address");
require(amount > 0, "Transfer amount must be greater than zero");
if(useWhiteListSwith){
require(msgSenderWhiteList[msg.sender] && fromWhiteList[from] && toWhiteList[to], "Transfer not allowed");
}
uint256 fee = 0;
...
uint acceptAmount = amount - fee;
_tOwned[from] = _tOwned[from].sub(amount);
_tOwned[to] = _tOwned[to].add(acceptAmount);
emit Transfer(from, to, acceptAmount);
}
_transfer() 函數是直接轉移代幣 transfer() 和 授權轉移代幣 transferFrom() 的具體實現,但該函數的修飾器是public,因此任何人都可以不通過 transfer() 或 transferFrom() 函數直接調用它。而當變量 useWhiteListSwith 設置爲 False 時,該函數不會檢查調用地址和傳輸地址是否合規,直接將代幣轉移到指定地址。
在區塊高度爲 16841993 時,管理員就把 useWhiteListSwith 設置爲 False:
此時开始有攻擊者利用 _transfer() 函數直接轉移代幣:
總結
經過完整分析,知道創宇區塊鏈安全實驗室 明確了該次事件的源頭由函數本身權限出現問題,而管理員同時操作不慎關閉了白名單檢測,兩方結合導致攻擊者可以實現轉移任意錢包代幣的操作。
在核心函數上我們一直建議使用最小權限原則,像這次的 _transfer() 函數本不該用 public 修飾器,使得 transferFrom() 函數檢查授權額度的功能形同虛設;而合約管理者也不該隨意修改關鍵變量值,導致攻擊者可以繞過白名單檢查的最後一道防线。
合約不僅僅是代碼層面的安全,不光需要白盒代碼審計,更需要合約管理員共同合理維護。
標題:創宇區塊鏈|Creat future 慘遭隨意轉移幣 幕後黑手究竟是誰?
地址:https://www.coinsdeep.com/article/2256.html
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。