買以太坊 買以太坊
Ctrl+D 買以太坊
ads

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

Author:

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

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

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

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

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

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

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

Cardano新智能合約開發平臺Plutus已啟動運行:1月26日,Cardano開發公司IOHK官方宣布,新的智能合約開發平臺Plutus已啟動運行。該平臺允許所有開發人員為Cardano(ADA)編寫和部署其智能合約的測試版本。[2021/1/26 13:34:50]

一、構造函數簡介

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

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

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

Cardano推出另一項智能合約編程語言提案:Cardano基金會在推特表示,他們已推出一項提案請求(RFP),用于在Cardano上使用另一種編程語言,即簡化使用擴展的UTXO(未使用交易輸出)分類帳模型來部署智能合約。該提案通過電子郵件接受申請,截止到2020年8月31日。[2020/8/4]

二、Fallout“以假亂真?”

–漏洞分析

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

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

動態 | Blockstream推出區塊鏈智能合約編程語言:據CryptoInsider報道,區塊鏈公司Blockstream宣布推出區塊鏈智能合約編程語言Simplicity。Blockstream團隊介紹稱,以太坊的EVM語言具有安全漏洞,會導致資金被盜且無法追回,比特幣的script語言則表達能力有限。Simplicity克服了這些缺點,而且語法和語義更簡單。[2018/12/1]

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

圖1

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

歐鏈老狼:EOS會成為第一個可以跑起來上百個智能合約應用的平臺:EOS超級節點競選團隊歐鏈的老狼在《歐鏈·寧話區塊鏈》第二季的節目中稱“我們認為區塊鏈產業第三個里程碑是企業級智能合約平臺,EOS會成為第一個可以跑起來上百個智能合約應用的平臺。現在的性能測試數據顯示,以太坊一秒支持20筆交易,EOS支持1900筆交易。也就是說,以太坊能夠支撐起1個加密貓,EOS可以支撐起100個加密貓。”[2018/6/1]

如下圖所示:

圖2

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

三、前車之覆

阿里巴巴曾鳴:當前智能合約的應用還非常簡單:近日,阿里巴巴學術委員會主席曾鳴在公開演講中表示,區塊鏈要創造價值必須跨過的四個坎:1.現在區塊鏈能實現的,只是“記賬”的可信,還只是人對機器的相信,而不是人對人的相信;2.信任的問題是讓市場繁榮的關鍵,如何用去中心化的方式解決信任問題,是個必須跨過去的坎;3.以太坊一直在強調“智能合約”,但其實也只實現了一種非常簡單的應用即眾籌,而真正的合約,制定和執行過程都是非常復雜的, 很依靠人的智能;4.區塊鏈的本質是實現大規模的社會化協同,目前除比特幣外,目前還沒有看到更好的機制設計。[2018/5/12]

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:OWNNERSTR區塊鏈Lab Grown DiamondDINNER價格strm幣投資價值區塊鏈技術通俗講解

以太坊最新價格
LED:技術指南 | DC/EP的離線支付實現邏輯_數字貨幣拉人頭的傳銷

中國人民銀行發行的法定數字貨幣,是現金貨幣的數字化,需要能夠進行離線支付。但對于一個數字系統來說,離線支付是一個不小的難題。央行所設計的DCEP,可以巧妙地通過利用密碼學技術解決離線支付問題.

1900/1/1 0:00:00
ETH:市場一日游狀態,是否即將改變_BIN

上期回顧 若情緒指數重新站上1以上,市場將投資熱情將轉暖。7月9日標準共識情緒指數最新數值為1.1,重新站上1區間,之后開始展開幣種輪動上漲,標準共識市場綜合指數最高上漲超7%.

1900/1/1 0:00:00
DEF:巴比特獨家 | HCM Capital李仁杰:借貸之外,DeFi的更多應用_DAO

7月18日,在珠海橫琴舉辦的“DeFi涌現”研討會上,HCM資本管理合伙人李仁杰帶來主題分享《借貸之外,DeFi的更多應用》.

1900/1/1 0:00:00
ITA:日本央行研究報告:如何設計央行數字貨幣,使之具有與現金相同功能?_數字貨幣交易所騙局

本文來源:中鈔區塊鏈技術研究院,原題《日本銀行:央行數字貨幣具有與現金相同功能的技術課題》 編譯:孫麗、練娜 編者按 日本央行于7月2日發布研究報告《央行數字貨幣具有與現金相同功能的技術課題》.

1900/1/1 0:00:00
ANC:一文了解DeFi儲蓄協議Anchor,一種本金受保護且利率穩定的穩定幣儲蓄手段_HOR

Cosmos,Polkadot和Terra三大公司近日聯合公布了一種名為Anchor的新型DeFi儲蓄產品,旨在為穩定幣存款提供安全可靠的利率.

1900/1/1 0:00:00
數字貨幣:觀點丨在加密市場中,參考匯率為什么重要?_比特幣現在多少一個

來源:加密谷Live 作者:KarimHelmyandtheCoinMetricsTeam 翻譯:凌杰 重點概覽 交易所之間的價格差異可能因各種原因而出現,包括市場操縱、交易所停業或交易者錯誤.

1900/1/1 0:00:00
ads