以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads

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

Author:

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

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

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

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

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

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

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

義烏發布數字人民幣試點10舉措:加大智能合約應用探索力度:金色財經報道,義烏市數字人民幣試點工作領導小組聯合辦公室發布《深入推進義烏小商品市場數字人民幣試點工作方案》,《方案》提出全面提升市場數字人民幣受理環境、推廣數字人民幣硬件錢包、加大智能合約應用探索力度、探索開展數字人民幣跨境支付應用等10條具體措施。[2023/3/25 13:26:15]

一、構造函數簡介

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

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

Input Output發文介紹保護隱私的智能合約解決方案Kachina:8月5日消息,Cardano開發團隊Input Output發文介紹與愛丁堡大學合作開發的保護隱私的智能合約解決方案Kachina,它利用ZK Snarks使用戶能夠在不犧牲去中心化特性的情況下實現隱私保護和通用智能合約功能。Input Output表示,提議的設計主要是理論上的,但Kachina證明了在現實生活的限制下創建保護隱私的智能合約的可能性。[2022/8/6 12:05:39]

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

二、Fallout“以假亂真?”

–漏洞分析

歐盟委員會發布新數據法案相關提案,尋求加強對智能合約的控制:2月26日消息,歐盟委員會發布關于歐盟新數據法案的提案,其中一些關于智能合約的細則。該法案草案將智能合約定義為:“基于預先確定的條件執行和結算交易的電子分類賬上的計算機程序。它們有可能向數據持有者和數據接收者保證共享數據的條件得到遵守。”

法案第30條要求使用智能合約的應用程序應該增加終止功能:“確保存在終止繼續執行交易的機制:智能合約應包括可以重置或指示合約停止或中斷操作以避免未來(意外)執行的內部功能。”

專業人士指出,終止開關意味著單一來源能夠進行更改代碼,這在本質上威脅到了智能合約不可變性的承諾。(The Block)[2022/2/26 10:17:02]

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

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

國家電網公司數字人民幣智能合約賦能光伏結算場景首單落地:1月4日消息,近日,由國網雄安金融科技集團有限公司、國網河北省電力有限公司、國網國際融資租賃有限公司(河北分公司)、中國工商銀行(北京分行、河北分行)聯合攻關的數字人民幣智能合約賦能光伏結算場景,實現全國首單落地。電力公司為用戶結算光伏發電收入后,依托數字人民幣智能合約將定向向設備出租公司支付租金,剩余收益由農戶全額享有,充分保障農戶無憂享受光伏收益的同時,有效防范了金融機構的資金回收風險,提高了結算效率。(中證網)[2022/1/4 8:23:05]

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

OKEx CEO Jay Hao:OKT相關智能合約開發已經完成:11月23日,在金色財經直播中,OKEx CEO Jay Hao表示,OKEx交易鏈主網啟動工作基本準備完畢,OKT相關智能合約開發已經完成,正在進行第9輪全面的功能性測試,具體上線時間會盡快向大家公布。更多詳情見原文鏈接。[2020/11/23 21:49:02]

圖1

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

如下圖所示:

圖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:OWNNEROUT數字人town幣行情Miner X ProtocolOuter Ring數字人民幣

芝麻開門交易所
Coinbase爭議史:宕機、訴訟、分叉、侵犯隱私_OIN:coinw幣贏騙局

作者|AntonLucian來源|BeInCrypto 翻譯|Nick 出品?|深潮TechFlowCoinbase是整個區塊鏈世界中最知名的品牌之一.

1900/1/1 0:00:00
比特幣ETF什么時候通過?“安全港”計劃有何進展?對話SEC“加密媽媽”_STE:CHESS價格

第三屆亞洲區塊鏈峰會于2020年7月15日至19日舉行。來自頂尖的行業內初創企業、投資公司、金融服務巨頭、全球品牌、學術機構、國際媒體和政策組織的專業人士聚集在一起,討論區塊鏈技術在現實世界中的.

1900/1/1 0:00:00
詳解灰度2020二季度數字資產投資表現:單季資金創新高,81%機構投資者投資多種產品_COI:Royal Kingdom Coin

內容重點概述 1、2020年上半年灰度在數字資產領域里的投入資金達到10億美元并創新最大單季融資金額.

1900/1/1 0:00:00
挖礦是不是 DeFi 發展的一段彎路?_EFI:DefiBay

轉自:區塊律動 當DeFi出現了YFI這樣的產品,故事已經達到一個高潮了。沒有團隊分配、沒有預挖、沒有投資機構預留,YFI相當于在DeFi上做了一個「比特幣」,講了一場公平概念的故事.

1900/1/1 0:00:00
重磅 | 日本共同社:G20擬轉為允許數字貨幣 開始探討監管_數字貨幣:XIO

來源:日本共同社 11日獲悉,二十國集團已朝著事實上允許代替現金的結算工具“數字貨幣”的方向,啟動了協調。預計10月將全面開始探討防止洗錢等監管措施。多名G20相關人士透露了該消息.

1900/1/1 0:00:00
巴比特專欄 | 一文讀懂監管將如何影響DeFi發展_EFI:SWAP

本文作者:張烽 與其他區塊鏈項目一樣,DeFi也面臨技術、運營、經濟體系等問題,但監管可能是影響其發展的最大挑戰,因為這并不完全只取決于項目方及參與方.

1900/1/1 0:00:00
ads