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

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

Author:

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

引子:“真行者珞珈山訴苦,假猴王水簾洞謄文。”——《西游記·第五十八回》在《西游記》中,六耳獼猴冒充猴王孫悟空,以假亂真,騙過了唐僧,騙過了眾神,縱使是照妖鏡也分不出真假。現在,智能合約遇上了“六耳獼猴”,又會擦出怎樣的火花?

在智能合約中,構造函數負責一些數據的初始化工作,owner值一般也會放在構造函數中進行初始化。owner是智能合約擁有者的稱呼,也常被用來作為該合約的超級管理員。對代幣合約來說,owner可能被分配的權限有:鑄造/銷毀代幣、凍結代幣等。如果開發者以錯誤的語法創建“構造函數”,造成構造函數缺失,致使“六耳獼猴”以假亂真,瞞過了開發者,最后使得攻擊者成為合約的擁有者,那么攻擊者便可依賴owner的權限,對代幣進行增發或銷毀等操作,進而可能造成整個代幣的崩盤。一、構造函數簡介

穆長春:數字人民幣智能合約已在政府補貼、零售營銷等領域成功應用:9月2日消息,中國人民銀行數字貨幣研究所所長穆長春在2022年中國國際服務貿易交易會金融服務專題主論壇、2022中國國際金融年度論壇上表示,目前,數字人民幣智能合約已經在政府補貼、零售營銷、預付資金管理等領域成功應用。隨著底層平臺和相關制度安排的逐步完善,將在更大范圍內加速落地。[2022/9/2 13:05:19]

在Solidity語言中,當函數名和合約名相同時,此函數就是合約的構造函數,在合約對象創建時,會先調用構造函數對相關的數據進行初始化。以太坊Solidity0.4.22版本中引入了關鍵字constructor,新的構造函數聲明形式:constructor()public{},引入的目的是用以替代低版本中將合約名作為構造函數名的語法形式,從而避免開發者筆誤造成構造函數命名錯誤的問題。引入的這個關鍵字看似平淡無奇,實則意蘊深刻,且聽我慢慢道來。

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

二、Fal1out“以假亂真?”

–漏洞分析下面以ethernaut靶場的Fallout題目為例進行分析。一眼看去,這似乎是一個正常沒有漏洞的合約代碼,但經過仔細觀察發現,該合約存在一個致命錯誤——構造函數名稱與合約名稱不一致,Fallout合約的構造函數被寫錯成了Fal1out。這樣的錯誤使其成為了一個被public修飾的普通函數,失去了構造函數僅在合約部署時被調用的特性,使得任何人都可以調用。該題目源碼如下圖所示:

Arweave發布新智能合約語言環境 支持用戶電腦運行而非節點:用于永久存儲數據的區塊鏈網絡Arweave發布了一種全新的智能合約運行方式SmartWeave。據介紹,Arweave上的智能合約將由用戶的電腦運行,而不是區塊鏈本身。SmartWeave允許區塊鏈免除gas費用,并且只要求智能合約的代碼按需運行,而不是由網絡上的每個節點運行。

Arweave的Sam Williams稱:“SmartWeave是建立在Arweave網絡之上的一種新的智能合約語言環境,使用名為‘惰性評估’的新型評估方式,將智能合約執行的計算負擔從網絡節點轉移至智能合約的用戶。”(CoinDesk)[2020/6/11]

動態 | 黑客利用EOS智能合約漏洞從賭博應用EOSBet中竊取20萬美元:據thenextweb消息,黑客利用EOSBet智能合同中的漏洞,從其運營錢包中竊取了4萬EOS(約20萬美元)。EOSBet的一位發言人表示:“幾個小時前,我們被攻擊了,大約有40000個EOS從我們的資金中被竊取。這個bug并不像之前說的那樣輕微,我們還在做取證工作,把發生的事情拼湊起來。”[2018/9/14]

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

金色財經現場報道 中國政法大學金晶:智能合約不是一種真正的合同,而是自動執行程序:金色財經現場報道,在數字經濟與政府監管研討會上,中國政法大學副教授金晶指出,智能合約根本就不是一個合約,它只是一個自動執行程序,它的突出優點就是效率性,以及它的匿名性。如果將智能合約視為合同,會發現智能合約會從傳統的合同規則體系中逃逸出來,我們傳統的合同規則對智能合約相當于是不適用的。與其說智能合約是一種合約,倒不如說智能合約根本就不是一種真正的合同,把它理解為協議的一套執行程序,或者是履行機制更為合適。[2018/6/2]

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

MorphToken事件分析在過去也曾發生過類似的安全事件,包含著假構造函數的合約被成功發布到主鏈上,其中比較出名的是“MorphToken事件”,其因為一個看似很小的問題而造成了數千萬市值的代幣被增發。合約代碼地址:https://etherscan.io/address/0x2ef27bf41236bd859a95209e17a43fbd26851f92#code在Owned合約中,由于首字母大小寫的錯誤,導致本該成為構造函數的Owned成為了普通函數owned,且被public修飾,可供任何人調用。如下圖所示:

圖3MorphToken合約繼承了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:OWNNEREOSAVECROWN幣Irena Green EnergyEOS RoyaleDnD Metaverse

SHIB最新價格
參與DeFi挖礦前,你需要準備什么?_DEFI

這是dForce張先生說DeFi機會實操第二期,在社群中好多用戶找到我希望知道怎么樣參與高收益的DeFi挖礦機Comp/Bal/MTA/MCB/DF/CRV等.

1900/1/1 0:00:00
CertiK:Cashaa交易所錢包被盜事件分析_CER

Cashaa是一家總部位于倫敦的加密錢包和銀行服務提供商。去年,它宣布已在其平臺上啟用數字貨幣購買信用卡和借記卡支付功能.

1900/1/1 0:00:00
谷歌云推出機密虛擬機,隱私計算云或將成為風口?_BLO

作者/FredericLardinois翻譯/周禹涵在GoogleCloudNext'20大會上,谷歌云推出了一款“可保密虛擬機”(ConfidentialVMs).

1900/1/1 0:00:00
RVN漏洞事件全回顧:黑客代碼導致3億增發_OIN

「RVN增發」事件時間線6月29日,SolusExplorer開發團隊CryptoScope的一個程序員在回歸測試時,發現瀏覽器統計的RVN余額出了問題,在深入排查問題后.

1900/1/1 0:00:00
ETH礦工收益大漲?加密市場6月數據洞察_SEA

編者按:本文來自加密谷Live,作者:LarryCermak,翻譯:Liam,Odaily星球日報經授權轉載.

1900/1/1 0:00:00
嚴打幣圈OTC:大佬被帶走,大量銀行卡被凍結_OTC

文|棘輪比薩進入2020年,越來越多的炒幣者被凍結了銀行卡。被凍卡的原因如出一轍:參與OTC交易,遇到了來路不明的“黑錢”。7月2日,有消息稱,幣圈大佬、OTC場外交易大戶趙東被帶走.

1900/1/1 0:00:00
ads