以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads
首頁 > XMR > Info

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

Author:

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

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

在《西游記》中,六耳獼猴冒充猴王孫悟空,以假亂真,騙過了唐僧,騙過了眾神,縱使是照妖鏡也分不出真假。現在,智能合約遇上了“六耳獼猴”,又會擦出怎樣的火花?

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

基于Cosmos的智能合約平臺Agoric融資3200萬美元,并推出主網:11月11日消息,基于Cosmos的智能合約平臺Agoric通過代幣私募融資3200萬美元,并推出主網、AMM和原生穩定幣RUN。Agoric的投資方包括Polychain、Naval Ravikant、Placeholder、NGC Ventures、Spartan Group、Compound VC、Acrew Capital、Figment、Chorus.One。Agoric迄今為止的融資總額達到3800萬美元。(The Block)[2021/11/11 6:46:59]

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

Mark Cuban 旗下公司正在招聘 Solidity 智能合約開發者:根據一份公開的招聘表單顯示,達拉斯獨行俠老板 Mark Cuban 旗下公司正在招聘一名以太坊原生的智能合約開發者,需要擁有全面的技能和 Solidity 的專業知識,并表示\"Mark Cuban 熱衷于在以太坊區塊鏈上建立許多不同的令人興奮的項目\"。申請者需要提交曾經開發過的最佳智能合約的地址,以及郵箱地址。[2021/4/6 19:50:37]

以太坊Solidity 0.4.22版本中引入了關鍵字constructor,新的構造函數聲明形式:constructor() public { },引入的目的是用以替代低版本中將合約名作為構造函數名的語法形式,從而避免開發者筆誤造成構造函數命名錯誤的問題。引入的這個關鍵字看似平淡無奇,實則意蘊深刻,且聽我慢慢道來。

分析 | 報告:通過智能合約可實現去中心化的資產轉移:據 morecoin.com 消息,MORECOIN 研究院在《基于智能合約的跨鏈研究》報告中指出,EOS 與ETH 作為智能合約平臺各有優勢,為區塊頭字段的相互驗證提供了一種新的可能性。BTC 和ETH 的資產轉移因為 BTC 平臺本身不支持智能合約,因此只能實現單向中繼;ETH 和ETC (以太經典)由于燃料成本太高昂,資產轉移也無法實現;而EOS 網絡的低計算成本、只需要維護21個 BP 的輕客戶端使得 EOS-->ETH 的中繼更加高效和便宜,而 ETH-->EOS 的中繼可采用 SmartPool 驗證算法替代完整的工作量證明算法以解決成本問題。在智能合約可相互驗證的前提下,兩條公鏈部署相應的鎖定、燃燒、轉換智能合約,來實現去中心化的資產轉移,并且無需依賴第三方見證人或者可信機構。[2019/3/1]

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

聲音 | 安永區塊鏈專家:對于公鏈上的通證和智能合約 監管機構應提出明確的評估準則:據Coindesk消息,安永會計事務所區塊鏈專家Paul Brody近日發文表示,公有鏈的生效必須建立在兩個前提上。首先,對于公鏈上的通證和智能合約,監管機構應提出一套明確的評估準則。其次,公司必須在公鏈的運行中遵守這些準則。[2018/9/6]

圖 1

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

以太坊智能合約有89%的概率存在漏洞:最新的研究顯示,基于以太坊架構,被稱作是“最安全、最可靠、最方便”的智能合約技術卻漏洞百出。在倫敦大學學院計算機科學系副教授伊利亞·謝爾蓋最新的研究論文中,通過對將近 100 萬份智能合約進行每份合約 10 秒分析時間的分析后發現,這其中有 34200 份智能合約很容易受到黑客攻擊。同時他們又對 3759 份智能合約抽樣調查,在這之中,3686 份智能合約有 89% 的概率含有漏洞。[2018/3/5]

圖 2

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

在過去也曾發生過類似的安全事件,包含著假構造函數的合約被成功發布到主鏈上,其中比較出名的是“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

建議更換Solidity 0.4.22及以上版本,并使用正確的constructor()語法。如下圖所示:

圖 7

切記: constructor()前并無function,function constructor() public { }為錯誤的構造函數形式。

如果要使用低于0.4.22的版本,則一定要著重檢查函數名是否和合約名一致。如下圖所示:

圖 8

在智能合約中因開發者粗心,而造成安全漏洞的事件層出不窮,“千里之堤,潰于蟻穴”,成都鏈安-安全實驗室在此給出如下建議:

1、 開發者在編寫智能合約敏感函數(如構造函數、回退函數fallback)時,應嚴格按照官方要求的代碼書寫規范,注意不要出現字符錯誤等情況。

2、 在某些情況下,編譯器會對constructor的錯誤使用發出警告,開發者應予以正確對待,不可認為其只是警告信息而忽略不處理。

3、 在合約正式上線前一定要找專業可信的機構做好合約代碼的審計工作。

Tags:OWNNERBSPNBStown幣吧PEPERUNNERBSP價格nbs幣前景

XMR
金色觀察|強勢的LINK 低調的預言機_INK

近半個月的時間,幣市一片大好,主流幣雖無波動,但山寨幣和一些明星幣種頻頻突破阻力位。在眾多突破阻力位的幣種里,LINK的走勢可圈可點,交易量和價格都有所突破.

1900/1/1 0:00:00
金晚8點丨除了比特幣 哪個主流幣最值得定投?_ORA

首檔行情直播欄目 金晚8點 熱點資訊、現貨合約,一對一實時解答隨時隨地掌握后市行情,把握幣市掘金機會2020/06/29丨今日主題:《除了比特幣 哪個主流幣最值得定投?》  .

1900/1/1 0:00:00
王永利:央行數字貨幣最可能的突破點是什么?_數字貨幣

王永利:作者系中國銀行原副行長、深圳海王集團首席經濟學家“數字貨幣一本賬”或是央行數字貨幣最可能實現且最有價值的模式突破。那樣,央行才能全方位全流程監控全部數字貨幣,又不影響金融體系的基本穩定.

1900/1/1 0:00:00
金色薦讀 | 一文讀懂中心化交易所解決方案StarkEx_中心化交易所

金色財經近期推出金色硬核(Hardcore)欄目,為讀者提供熱門項目介紹或者深度解讀。按:2020年6月4日,零知識證明開發機構StarkWare在以太坊主網上線了擴展性引擎StarkEx,并已.

1900/1/1 0:00:00
金色觀察丨億邦 vs. 嘉楠 為何中國加密公司都去美國上市?_區塊鏈

金色財經 區塊鏈6月27日訊   北京時間2020年6月26日晚9點半,億邦國際(EBON)正式登陸美股納斯達克,成為繼嘉楠后第二個美股上市的中國礦機制造商.

1900/1/1 0:00:00
國際清算銀行:新冠疫情危機將推動全球央行數字貨幣發展_BDC

國際清算銀行預計,新冠疫情危機對零售支付的影響將對央行數字貨幣的發展產生積極影響。在周三發布的報告中,國際清算銀行指出,由于商人和消費者對病傳播的擔憂,現金支付急劇下降.

1900/1/1 0:00:00
ads