利用排版試圖隱藏漏洞?瑟瑟發抖!Text.finance智慧合約安全漏洞分析

買賣虛擬貨幣

北京時間11月12日,CertiK安全研究團隊發現DeFi專案text.finance智慧合約程式碼部分存在安全漏洞。

分析之前,先考考大家的眼力,看看下圖裡面的文字說了什麼。

如果看不清,不妨點選圖片後把螢幕亮度調至最高。

有的時候,某些不想讓你看到的因素,正是透過排版或者這樣的方式,被刻意隱藏了起來。

接下來說說該專案中存在的兩處漏洞。大家不妨在閱讀文章的時候注意一下圖中【function函式】的位置。

第一彈:專案擁有者可透過第一處漏洞,將指定數目代幣轉移到任意地址。

第二彈:專案擁有者可透過第二處漏洞,將任意投資者的流動性池中的資產強制轉移到專案擁有者的地址中。

漏洞分析

textMiner.sol

部署地址:

https://etherscan.io/address/0x9858728de38c914c2ea32484a113b6628d984a82#code

漏洞一

專案擁有者在textMiner.sol智慧合約1000行處實現了withUpdates()函式。該函式的的作用是可以將任意數量的為devaddr地址鑄造任意數量的代幣。而透過檢視圖2中devaddr和專案擁有者owner的地址值,可以發現兩者相同,因此專案擁有者可以透過該漏洞為devaddr地址鑄造任意數目代幣。

同時,當前的devaddr地址擁有者可以透過圖3的dev()函式將devaddr地址值更換到另外一個地址,因此最終專案擁有者可以更換將devaddr地址值更換的方法,向任意地址中鑄造任意數目代幣。

雖然專案擁有者將圖1中的withUpdates()函式設定為不允許智慧合約外部呼叫,但是卻有意地在圖4中919行實現了允許被外部呼叫的add()函式,然後透過921行程式碼呼叫withUpdates()函式,從而實現向devaddr地址鑄造1000000000000000000000000000000數量代幣。

圖1:第1000行中的withUpdates()函式

圖2:devaddr地址以及專案擁有者owner地址

圖3:dev()函式

圖4:add()函式

漏洞二

圖5:emergencyWithdraw()函式

專案擁有者可以透過呼叫圖5中emergencyWithdraw()函式,將某一個特定地址投資者的某一個流動性池中的流動性資產全部取出,並轉移到專案擁有者的地址中。

該emergencyWithdraw()函式是一個基於正確的emergencyWithdraw()函式。因此就算審視合約者不惡意揣測,也很難說專案方不是惡意改寫,並新增了該漏洞。

從下圖6的對比中可以發現,Sushiswap允許投資者透過呼叫emergencyWithdraw()函式,緊急取出屬於自己的流動性資產,而在text.finance中卻僅允許專案擁有者來呼叫該函式,同時允許專案擁有者取出屬於任何投資者的流動性資產。

圖6:text.finance和sushiswap專案中emergencyWithdraw()函式實現對比

安全建議

CertiK安全研究團隊認為當投資者在對DeFi專案進行投資時,不僅需要對智慧合約常見的程式碼有所瞭解,更需要謹慎地審視具體程式碼的實現邏輯。否則極易掉入類似該專案中的惡意漏洞陷阱當中。

對於非技術背景的投資者,更需要了解專案是否經過嚴謹的技術審計。從Text.finance專案的惡意漏洞中可以看出,盲目投資一個沒有經過嚴格審計的專案,或引發極大風險,並造成難以估量的損失。

免責聲明:

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

推荐阅读

;