1. 程式人生 > >以太坊Token合約驚現“古老”溢位漏洞,多家交易所受到影響

以太坊Token合約驚現“古老”溢位漏洞,多家交易所受到影響

事件

本週四凌晨(2018年12月27日),降維安全實驗室(johnwick.io)自主研發的"智子"區塊鏈威脅感知預警系統監控到某知名ERC20合約遭到黑客攻擊, 黑客利用該合約批量轉賬中存在的整數溢位問題,向黑客受控賬戶"增發"了115,792,089,237,316,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000.584007913129639935數量的ERC20 Token,直接導致該合約的Token價值歸0.

智子監控感知截圖

在這裡插入圖片描述

攻擊交易截圖

在這裡插入圖片描述

分析

通過分析該合約原始碼,我們發現本合約雖然引入了SafeMath函式庫來避免潛在的整數溢位,但是未對所有敏感資料的四則運算使用該函式庫,百密一疏,導致本合約存在3處

嚴重的整數溢位問題:

  • 其中batchInvests()因為是onlyOwner限制只允許owner合約管理者呼叫,所以影響輕微.
  • 另外2處batchTransfers()(正是上述事件中,被黑客利用的介面)和batchTransferFroms()因為是公開介面,可以被任意賬戶呼叫,所以影響更為嚴重.

batchInvest()

在這裡插入圖片描述

batchTransfers()

在這裡插入圖片描述

batchTransferFroms()

在這裡插入圖片描述如上圖所示, 如果有問題的轉賬金額陣列amounts[]累加(黃色高亮程式碼)發生整數溢位,將導致總轉賬金額totalAmount繞過後續require()檢查程式碼(綠色高亮

程式碼),隨後合約使用這些轉賬金額改寫黑客控制賬號的餘額(紅色高亮程式碼),達成攻擊.

值得一提的是,這個漏洞跟今年7月7號的AMMBR(AMR)代幣合約的multiTransfer()函式整數溢位漏洞如出一轍!

後續

  • 我們與該ERC20合約的專案方取得了聯絡,給他們的智慧合約進行了加急審計,並提供了整改措施和修復方案.
  • 專案方行動迅速,不到12小時修復了我們指出的上述問題,並提供了修改後的合約原始碼供我方審計.
  • 經過我方再次審計,確認沒有安全問題,專案方再次部署上鍊.

結論

  • 為了防止整數溢位,對所有敏感資料的加減乘除四則運算都應使用SafeMath函式庫
    來進行.
  • 智慧合約編寫完成後,部署上公鏈前,應交給有經驗的第三方的審計機構進行評估.
  • 智慧合約部署上公鏈後,應加入第三方威脅感知監控系統,及時預警,將風險降至最低.