引子:“真行者珞珈山訴苦,假猴王水簾洞謄文。”?——《西游記·第五十八回》
在《西游記》中,六耳獼猴冒充猴王孫悟空,以假亂真,騙過了唐僧,騙過了眾神,縱使是照妖鏡也分不出真假。
現在,智能合約遇上了“六耳獼猴”,又會擦出怎樣的火花?
在智能合約中,構造函數負責一些數據的初始化工作,owner值一般也會放在構造函數中進行初始化。
owner是智能合約擁有者的稱呼,也常被用來作為該合約的超級管理員。對代幣合約來說,owner可能被分配的權限有:鑄造/銷毀代幣、凍結代幣等。
如果開發者以錯誤的語法創建“構造函數”,造成構造函數缺失,致使“六耳獼猴”以假亂真,瞞過了開發者,最后使得攻擊者成為合約的擁有者,那么攻擊者便可依賴owner的權限,對代幣進行增發或銷毀等操作,進而可能造成整個代幣的崩盤。
余弦:智能合約語言層的bug導致一些知名項目的重入鎖防御失效:金色財經報道,慢霧創始人余弦針對受CurveFinance穩定幣池alETH/msETH/pETH黑客攻擊事件影響發推稱,智能合約語言層的bug導致一些知名項目的重入鎖防御失效,黑白帽黑客們及MEV Bots瘋狂了,各種重入操縱及搶跑拿走資金。所幸這次不是Solidity,而是不那么流行的Vyper出問題。[2023/7/31 16:08:41]
一、構造函數簡介
在Solidity語言中,當函數名和合約名相同時,此函數就是合約的構造函數,在合約對象創建時,會先調用構造函數對相關的數據進行初始化。
以太坊Solidity0.4.22版本中引入了關鍵字constructor,新的構造函數聲明形式:constructor()public{},引入的目的是用以替代低版本中將合約名作為構造函數名的語法形式,從而避免開發者筆誤造成構造函數命名錯誤的問題。
QANplatform橋智能合約遭到攻擊,建議不要執行QANX代幣相關交易:10月11日消息,抗量子計算攻擊的Layer1區塊鏈QANplatform發推稱,其橋智能合約遭到攻擊,攻擊者設法提取了代幣,提醒用戶不要執行任何與QANX代幣相關的交易。目前團隊正在調查問題。目前 QANX 價格短線跳水跌超 90%。[2022/10/11 10:30:53]
引入的這個關鍵字看似平淡無奇,實則意蘊深刻,且聽我慢慢道來。
二、Fallout“以假亂真?”
–漏洞分析
下面以ethernaut靶場的Fallout題目為例進行分析。
一眼看去,這似乎是一個正常沒有漏洞的合約代碼,但經過仔細觀察發現,該合約存在一個致命錯誤——構造函數名稱與合約名稱不一致,Fallout合約的構造函數被寫錯成了Fal1out。
以太坊地址總量突破2億個,智能合約數量超5000萬:金色財經報道,據 Dune Analytics 數據顯示,以太坊地址總量突破2億個,截至目前為 2.13 億個,智能合約數量超5000萬,截至目前為 5120 萬。此外,當前以太坊鏈上交易量約為 16.8 億筆,市值約為 1972 億美元。[2022/8/21 12:37:58]
這樣的錯誤使其成為了一個被public修飾的普通函數,失去了構造函數僅在合約部署時被調用的特性,使得任何人都可以調用。該題目源碼如下圖所示:
圖1
在Fal1out函數中直接指定了函數調用者的地址即為owner,所以只需要調用Fal1out函數即可實現對合約owner的更改。
智能合約錢包Argent Layer2版本正式上線zkSync:12月24日,智能合約錢包Argent宣布其Layer2版本正式上線zkSync,目前已與zkSync網絡內DEX平臺ZigZag完成集成,用戶現可通過1美元的固定費用使用Argent在Layer2上的交易服務。該服務目前僅支持ETH、USDT、USDC、WBTC、DAI和FRAX。[2021/12/24 8:02:18]
如下圖所示:
圖2
“假猴王”Fal1out想借著一些字體類型的相似字符的視覺差異混淆視聽,可最終還是沒能逃過我們的“火眼金睛”。
三、前車之覆
MorphToken事件分析
ADA發布智能合約測試網 漲幅近10%:Cardano(ADA)官方發布消息,IOHK已經發布ADA第一個智能合約測試網——KEVM 測試網。受此利好消息影響,ADA自今日10點起開始大幅上漲,市場普跌時依然保持漲幅勢頭,行情顯示,ADA全球均價0.199美元,漲幅9.43%。[2018/5/30]
在過去也曾發生過類似的安全事件,包含著假構造函數的合約被成功發布到主鏈上,其中比較出名的是“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、在合約正式上線前一定要找專業可信的機構做好合約代碼的審計工作。
區塊鏈一直以不可篡改、分布式、永久可查驗等特點得到人們的青睞,這些特點使區塊鏈聽起來非常安全,甚至像是個萬無一失的技術。但實際上,針對區塊鏈的攻擊一直都存在,且每次發生,往往會造成巨大的損失.
1900/1/1 0:00:00轉自:區塊律動 當DeFi出現了YFI這樣的產品,故事已經達到一個高潮了。沒有團隊分配、沒有預挖、沒有投資機構預留,YFI相當于在DeFi上做了一個「比特幣」,講了一場公平概念的故事.
1900/1/1 0:00:00CenterPrime基于Hyperledger,是一條有權限訪問韓國開放的銀行API的私有鏈.
1900/1/1 0:00:00引子:“庖人雖不治庖,尸、祝不越樽俎而代之矣。”?--《莊子·逍遙游》古時候,有一位杰出的領袖名叫唐堯。他所治理的地區人們安居樂業,但是他聽聞隱士許由十分有才干,便萌生了將領導權讓給許由的想法.
1900/1/1 0:00:00作者:廖飛強|微眾銀行區塊鏈核心開發者來源:微眾銀行區塊鏈微信公眾號數字簽名是否只能由單一主體簽署?在涉及多方授權的場景中.
1900/1/1 0:00:00Cosmos,Polkadot和Terra三大公司近日聯合公布了一種名為Anchor的新型DeFi儲蓄產品,旨在為穩定幣存款提供安全可靠的利率.
1900/1/1 0:00:00