Soda 專案智慧合約安全漏洞分析

買賣虛擬貨幣

判斷一個人到底屬於什麼資產階級,只需要看他的負債率。簡而言之,借的錢越多,代表你越有錢(還款能力強)。

所以借錢從某種角度上來講,是屬於富人的遊戲。透過借貸手段合理分配資產從而達到收益也是理財的精髓。

相信每個人都好奇過,銀行到底拿我們存的錢去做什麼了呢?

從這種角度上來講,銀行屬於最大的欠款方。那如果,突然有人攻破了銀行系統,強制銀行“還款”,然後本來需要還到儲蓄者賬戶裡的錢款直接被攻擊者收入囊中,儲蓄者和銀行都將成為最大的受害方。

北京時間9月21日,CertiK安全研究團隊發現soda區塊鏈專案中存在智慧合約安全漏洞,該漏洞允許任意外部呼叫者透過呼叫智慧合約函式,無視受害使用者債務中的代幣數目,強行結算受害使用者的債務,並將透過結算操作所得的收益轉入到自己的收款地址。

soda專案官方現在已經提交修復補丁來修復這個安全漏洞,但由於soda專案採用了TimeLock來將所有的操作延遲48小時,修復補丁會在延遲事件之後生效,因此截止發稿時,該漏洞已完成修復。

漏洞技術分析

圖一(參考連結1)

soda專案中的WETHCalculator.sol智慧合約中存在邏輯實現錯誤導致的安全漏洞,圖一中WETHCalculator.sol智慧合約第193行,maximumLoad的計算公式錯誤的使用了amount作為基礎值。

因此,在196行滿足require()判斷的檢測條件 loanTotal >= maximumLoan可以轉換為:

loanInfo[_loanId].amount + interest >= loanInfo[_loanId].amount * maximumLTV / LTV_BASE

由於maximumLTV / LTV_BASE的值是在0.15-0.95區域中變動,並且interest >= 0。因此圖一196行的require()判斷中的檢測條件總是為真。

失去了該require()判斷的保護,任何外部呼叫者可以透過呼叫以下圖二中SodaBank.sol中104行的collectDebt()函式來將任意loadId的貸款清空。在執行該函式的過程中,圖一中的collectDebt()函式會在圖2第121行被執行,並透過123行和125行程式碼將該使用者鎖在soda裡面的WETH的其中一部分轉移到該外部呼叫者的地址msg.sender中:

圖二(參考連結2)

透過以上漏洞,任何外部呼叫者都可以透過呼叫SodaBank.sol中的collectDebt()並傳入其他使用者的loadId來清空該使用者在soda中的代幣。

官方修復細節

soda官方為修復以上漏洞,設計了新的智慧合約WETHCalculatorFixed.sol來替換WETHCalculator.sol。

透過分析可以看到在圖三WETHCalculatorFixed.sol智慧合約第979行,maximumLoan的計算公式被正確的計算為 loanInfo[_loanId].lockedAmount * maximumLTV / LTV_BASE。因此,圖三中第982行require()判斷的檢測條件變更為:

loanInfo[_loanId].amount + interest >= loanInfo[_loanId].lockedAmount * maximumLTV / LTV_BASE

圖三(參考連結3)

該等式的程式碼實現與soda專案中的邏輯設計相符,該等式的真假與使用者的借貸債務數目和被鎖本金數目相關。漏洞完成修復。

soda專案中關於該等式的邏輯設計細節可以從下面的連結中進行了解:

https://medium.com/soda-finance/the-soda-revolution-9185fdb99fc1

事件分析總結

該漏洞是由於邏輯設計與程式碼實現不符而造成。當前常用的單元測試等測試方法以及自動化的測試工具均無法有效的查詢到該種與邏輯相關的漏洞。

因此,CertiK安全團隊有以下安全建議:

安全是區塊鏈專案的立足之本,任何區塊鏈專案在上線前需要請專業第三方安全審計團隊對專案整體程式碼進行安全審計。

當前區塊鏈檢測工具對智慧合約的檢測均無法檢測其邏輯上出現的漏洞,其結果也沒有可信的數學證明作為支撐。形式化驗證是當前唯一被證明可以產生可信數學證明的軟體驗證方法。採用基於形式化驗證方法的區塊鏈檢測工具來驗證專案中的安全漏洞,應成為每一個專案在上鍊前的必經步驟。

參考連結:

圖一:

https://github.com/soda-finance/soda-contracts/blob/master/contracts/calculators/WETHCalculator.sol#L189

圖二:

https://github.com/soda-finance/soda-contracts/blob/master/contracts/components/SodaBank.sol#L104

圖三:

https://github.com/soda-finance/soda-contracts/blob/master/contracts/calculators/WETHCalculatorFixed.sol#L275

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;