以太坊價格 以太坊價格
Ctrl+D 以太坊價格
ads

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

Author:

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

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

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

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

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

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

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

報告:全球智能合約市場規模到2030年預計將增長至98.5億美元左右:金色財經報道,根據 Zion Market Research 的研究,?2022 年全球智能合約市場規模約為17.5 億美元,預計到 2030 年將增長至98.5 億美元左右,年復合增長率2023 年至 2030 年之間的增長率 (CAGR) 約為 24%。加密貨幣在智能合約的使用中起著至關重要的作用。由以太坊開發的區塊鏈是一種去中心化的開源區塊鏈,被認為是與去中心化金融 (Defi) 相關的應用程序的最基本構建塊。[2023/3/9 12:50:54]

一、構造函數簡介

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

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

智能合約審計平臺Sherlock完成400萬美元種子輪融資,Archetype領投:9月14日消息,智能合約審計平臺Sherlock完成400萬美元種子輪融資,Archetype領投,Spartan、Lattice、CoinFund等參投。新資金將用于組建團隊并為Sherlock平臺的外部審計提供資金。(CoinDesk)[2022/9/14 13:30:09]

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

二、Fallout“以假亂真?”

–漏洞分析

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

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

BadgerDAO關于“升級智能合約”的提案BIP 76已開啟投票:12月11日消息,BadgerDAO表示,其論壇已上線關于“升級智能合約”的提案BIP 76。該提案旨在覆蓋重要的智能合約升級,以拯救用戶資金,改進暫停功能,并通過黑名單提供額外的保障。本提案不包括擬議拯救資金功能的執行和解除暫停。這些功能將通過未來的BIP解決。基于社區反饋,為了加快智能合約的重新激活,該提案將直接轉向48小時快照投票。

提案稱,Badger致力于在安全的情況下重新啟動智能合約。考慮到時間鎖的因素,一旦最終BIP決定執行擬議的拯救資金和解除暫停,在進行這些升級之前等待標準時間框架將增加至少3天的延遲。因此,該提案將智能合約升級與拯救行動的執行和解除暫停分開,以便執行決策可以遵循Badger的治理流程,同時還確保生成的治理決策能夠迅速制定。[2021/12/11 7:32:26]

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

萬事達卡投資智能合約技術以支持國家發開數字貨幣:4月30日,萬事達今天在第一季度財報電話會議上宣布,它將提速加密貨幣以及中央銀行數字貨幣(CBDC)的發展。首席執行官邁克爾·米巴赫(MichaelMiebach)告訴投資者,該公司已為此建立許多新的合作伙伴關系,幫助世界各地的銀行開發數字貨幣,并著重研究智能合約技術如何與CBDC配對。他補充說到,許多中央銀行正在使用該公司的虛擬測試平臺來測試其數字貨幣試驗品。但CBDC的開發仍處于相對較早的時期。[2021/4/30 21:14:11]

圖1

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

動態 | Tezos基金會宣布將為區塊鏈和智能合約研究提供資金支持:據Cointelegraph報道,近日Tezos基金會宣布,將為康奈爾大學、貝拉內里大學、伊利諾伊大學香檳分校和France-IOI四所機構的區塊鏈技術和智能合約研究工作,提供資金支持。[2018/8/11]

如下圖所示:

圖2

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

三、前車之覆

MorphToken事件分析

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

合約代碼地址: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:OWNNERFALOUTtown幣瀑漲Miner ArenaFalcon NineFight Out

比特幣價格實時行情
EOS:瘋狂的DFS,也帶不動EOS大豐收

最近DeFi概念很火,帶動了一大波數字貨幣的上漲。可熱鬧基本都屬于以太坊,而曾經最有望超越以太坊的明星公鏈——EOS則冷清許多。EOS當然不會坐視DeFi熱潮的錯失,甚至希望借此實現彎道超車.

1900/1/1 0:00:00
MKR:鏈上數據6月掃描:比特幣滑向9000美元,鏈上活躍度隨之墜落?

6月,可謂一個比特幣價格距離10000美元漸行漸遠的月份,根據CoinDesk的數據,在長期被壓制在10000美元之下后,2020年6月,比特幣價格盡管一度再上10000美元,但是很快回落.

1900/1/1 0:00:00
PAY:官宣?支付巨頭PayPal稱正在發力加密領域

本文來自?TheBlock,原文作者:YogitaKhatriOdaily星球日報譯者:念銀思唐支付巨頭PayPal透露,它正在開發加密貨幣相關能力.

1900/1/1 0:00:00
以太坊:以太坊2.0最終測試網將于8月4日啟動,2.0主網最早11月4日到來

要點: 以太坊2.0之前的最終測試網將于兩周內啟動。啟動組織者丹尼·瑞安表示,假設所有條件均得到滿足,測試網將于8月4日啟動。以太坊2.0推出之前需要幾個月的測試,最早的日期是11月4日.

1900/1/1 0:00:00
NFT:雨中的序曲:人、區塊鏈產業和一場會

流行病、經濟蕭條、種族騷亂、特大洪水……集中于發生在2020年,所有人被驅入一片烏泱泱的黑天鵝湖中游泳,而岸上又有一群灰犀牛虎視眈眈.

1900/1/1 0:00:00
區塊鏈:技術解讀 | 何在不使用工作量證明的情況下實現公平且高效的提議

作者:StevenPu,Taraxa創始人 前言 在之前的技術解讀文章中我們講到了區塊排序的問題。本文我們將繼續探索如何在不使用工作量證明的情況下實現公平且高效的提議.

1900/1/1 0:00:00
ads