比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads

智能合約安全實踐(二)| 練就“火眼金睛”,真假構造函數一眼看清_TRU

Author:

Time:1900/1/1 0:00:00

引子:“真行者珞珈山訴苦,假猴王水簾洞謄文。”?——《西游記·第五十八回》

在《西游記》中,六耳獼猴冒充猴王孫悟空,以假亂真,騙過了唐僧,騙過了眾神,縱使是照妖鏡也分不出真假。

現在,智能合約遇上了“六耳獼猴”,又會擦出怎樣的火花?

在智能合約中,構造函數負責一些數據的初始化工作,owner值一般也會放在構造函數中進行初始化。

owner是智能合約擁有者的稱呼,也常被用來作為該合約的超級管理員。對代幣合約來說,owner可能被分配的權限有:鑄造/銷毀代幣、凍結代幣等。

如果開發者以錯誤的語法創建“構造函數”,造成構造函數缺失,致使“六耳獼猴”以假亂真,瞞過了開發者,最后使得攻擊者成為合約的擁有者,那么攻擊者便可依賴owner的權限,對代幣進行增發或銷毀等操作,進而可能造成整個代幣的崩盤。

Thirdweb向在熊市期間部署過智能合約的開發者們空投NFT:4月18日消息,Web3開發者平臺Thirdweb宣布將向在過去18個月的熊市期間部署過智能合約的開發者們空投NFT獎勵。

根據細則,空投要求開發者們在2022年1月1日至2023年4月之間于Ethereum、Polygon、Avalanche、Arbitrum、Optimism等五條鏈上部署過智能合約。

所有NFT內都會有一個隨機分配的獎品,包括1 ETH、2023年共識大會門票、Crypto Packaged Goods創始NFT、1000 AWS積分等等。[2023/4/18 14:11:12]

一、構造函數簡介

在Solidity語言中,當函數名和合約名相同時,此函數就是合約的構造函數,在合約對象創建時,會先調用構造函數對相關的數據進行初始化。

以太坊Solidity0.4.22版本中引入了關鍵字constructor,新的構造函數聲明形式:constructor()public{},引入的目的是用以替代低版本中將合約名作為構造函數名的語法形式,從而避免開發者筆誤造成構造函數命名錯誤的問題。

Cosmos生態智能合約平臺Injective將銷毀500萬枚INJ代幣:11月30日消息,Cosmos生態智能合約平臺Injective將于11月30日21:00永久銷毀500萬枚INJ代幣,銷毀的代幣價值約為850萬美元。[2022/11/30 21:12:24]

引入的這個關鍵字看似平淡無奇,實則意蘊深刻,且聽我慢慢道來。

二、Fallout“以假亂真?”

–漏洞分析

下面以ethernaut靶場的Fallout題目為例進行分析。

一眼看去,這似乎是一個正常沒有漏洞的合約代碼,但經過仔細觀察發現,該合約存在一個致命錯誤——構造函數名稱與合約名稱不一致,Fallout合約的構造函數被寫錯成了Fal1out。

BM:所有合約都應遵循啟用智能合約的原則:EOS創始人BM(Daniel Larimer)發推文稱:“所有合約都應遵循啟用智能合約的原則。我正在研究用于管理eos和其他eosio鏈上有條件的所有權轉移、留置權和Oracle的原語或標準。”[2020/10/29]

這樣的錯誤使其成為了一個被public修飾的普通函數,失去了構造函數僅在合約部署時被調用的特性,使得任何人都可以調用。該題目源碼如下圖所示:

圖1

在Fal1out函數中直接指定了函數調用者的地址即為owner,所以只需要調用Fal1out函數即可實現對合約owner的更改。

如下圖所示:

OKEx CEO JayHao:OKChain支持訂單簿和Swap模型的DEX,兼容以太坊智能合約:9月12日,OKEx CEO Jay Hao在微博透露,OKChain將同時支持訂單簿和Swap模型的DEX,兼容以太坊智能合約。

據了解,OKChain測試網已升級至v0.11.1版本,增添了支持OpenDEX-Desktop v0.0.2的核心功能。[2020/9/12]

圖2

“假猴王”Fal1out想借著一些字體類型的相似字符的視覺差異混淆視聽,可最終還是沒能逃過我們的“火眼金睛”。

三、前車之覆

MorphToken事件分析

在過去也曾發生過類似的安全事件,包含著假構造函數的合約被成功發布到主鏈上,其中比較出名的是“MorphToken事件”,其因為一個看似很小的問題而造成了數千萬市值的代幣被增發。

獨家 | 數據顯示眾籌項目Enhanced Society存在多處智能合約安全漏洞:區塊鏈項目評級機構RatingToken最新數據顯示,2018年7月23日全球共新增5328個合約地址,其中351個為代幣型智能合約。在RatingToken發布的最新“新增代幣型智能合約風險榜”中,位于排行榜第三名的Enhanced Society雖致力于解決信息的真實性問題,通過以太坊密鑰對用戶發布的信息進行簽名,信息的發布日期、內容和標題也包含在簽名哈希中以確保信息的不可篡改,但合約本身漏洞較多,RatingToken安全團隊已檢測到12個安全漏洞,存在整數溢出漏洞及資金被盜風險,能否保障用戶信息安全還有待考證;風險榜TOP10的還包括EvaUSD、TBB、500m、Kreos、OTCC、TEA和Safe Pay Wallet,皆為代幣型合約,且合約代碼均相同;此外,TOP 100的危險合約中有44個為Fomo 3D山寨合約,創建24小時內交易數達1865筆,涉及資金超過190ETH,可見龐氏騙局游戲熱度不減,投資人仍需警惕,更多詳情請查看原文鏈接。[2018/7/24]

合約代碼地址:https://etherscan.io/address/0x2ef27bf41236bd859a95209e17a43fbd26851f92#code

在Owned合約中,由于首字母大小寫的錯誤,導致本該成為構造函數的Owned成為了普通函數owned,且被public修飾,可供任何人調用。

如下圖所示:

圖3

MorphToken合約繼承了Owned合約,并在自己的構造函數內進行了owner的初始化,但是父合約Owned的owned函數是可供任何人調用的,攻擊者便可通過調用owned函數更改合約的所有者owner。

owner的初始化代碼如下圖所示:

圖4

由上述可知,任何人都可以通過調用合約的owned函數,成為合約的擁有者(owner)。

如下圖所示:

圖5

失之毫厘,差之千里,一個小小的字母錯誤,卻導致了合約的代幣的崩盤。代幣也被惡意增發。

如下圖所示:

圖6

四、后車之鑒

開發者應如何正確使用構造函數

建議更換Solidity0.4.22及以上版本,并使用正確的constructor()語法。

如下圖所示:

圖7

切記:constructor()前并無function,functionconstructor()public{}為錯誤的構造函數形式。

如果要使用低于0.4.22的版本,則一定要著重檢查函數名是否和合約名一致。

如下圖所示:

圖8

五、安全建議

在智能合約中因開發者粗心,而造成安全漏洞的事件層出不窮,“千里之堤,潰于蟻穴”,成都鏈安-安全實驗室在此給出如下建議:

1、開發者在編寫智能合約敏感函數時,應嚴格

按照官方要求的代碼書寫規范,注意不要出現字符錯誤等情況。

2、在某些情況下,編譯器會對constructor的錯誤使用發出警告,開發者應予以正確對待,不可認為其只是警告信息而忽略不處理。

3、在合約正式上線前一定要找專業可信的機構做好合約代碼的審計工作。

Tags:OWNNEROUTTRUtown幣有前途嗎MOONERSouth African Tethercobo和trustwallet

比特幣行情
報告:第二季度收益下滑42%,DeFi代幣仍是表現最好的資產_ANC

加密資產的誕生帶來了引人注目的代幣估值模型。有了能夠實時跟蹤收益的協議,有了有形價值在其中流動,我們就可以采用傳統的估值方法,如市盈率、DCF和其他模型,來衡量這些代幣,以尋求公平估值.

1900/1/1 0:00:00
bZx的IUO:誰在半個多小時內獲利50多萬美元?_ZRX

繼上次UMA的IUO被人利用賺取數十萬美元的豐厚利潤之后,bZx的代幣IUO,再次上演類似事件。上次的UMA事件可以參考藍狐筆記的《UMA的IUO:誰是贏家?》.

1900/1/1 0:00:00
深度 | 前抓plustoken后抓吉比特礦機,鹽城為何嚴打“盤/幣圈”?_區塊鏈

鹽城正令盤圈、幣圈聞風喪膽。根據公開信息統計,鹽城打擊涉嫌虛擬貨幣傳銷總金額已經超過500億。7月16日一封通知書在網絡傳播.

1900/1/1 0:00:00
一文了解比特幣的DeFi生態_DEFI

寫在前面: 我們可以在比特幣之上建立DeFi應用嗎?對于這一問題,每個人都有自己不同的看法,而原文作者MatthewBlack是AtomicLoans的首席技術官.

1900/1/1 0:00:00
觀點 | FileCoin成為焦點,硬盤挖礦將會持續熱門_COI

本文來源:彩云區塊鏈,作者:cncoin對于FileCoin的挖礦,目前市場上出現兩邊倒的情況,一方面大量的文章都去闡述這樣的觀點:FileCoin的挖礦是一場大佬聯合割韭菜的騙局.

1900/1/1 0:00:00
賺錢效應凸顯 基金方向判斷上逐漸趨同|標準共識_ETH

上期回顧 目前而言,市場受外部傳統市場影響,進入回調階段,市場整體波動較弱,觀望情緒較濃。 指數要點 根據標準共識市場綜合指數反映,最新指數為1,177.31,較上周上漲4.63%,受ETH大漲.

1900/1/1 0:00:00
ads