比特幣價格 比特幣價格
Ctrl+D 比特幣價格
ads

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

Author:

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

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

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

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

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

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

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

USDC在智能合約中的供應百分比達2年低點:金色財經報道,Glassnode數據顯示,USDC在智能合約中的供應百分比剛剛達到31.260%的2年低點。[2023/1/2 22:20:30]

一、構造函數簡介

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

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

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

Clarity智能合約將從Chainlink Oracle獲取數據:金色財經報道,Algorand和Blockstack PBC的聯合智能合約語言Clarity將能夠從Chainlink的oracle網絡獲取數據。在整合后,Chainlink的oracle將把數據饋入Clarity的跨區塊鏈智能合約,首先將包括實時價格點。Blockstack在一份新聞稿中表示,其用戶“不久的將來”將能夠訪問整個Chainlink數據庫,但未提供時間表。[2020/10/1]

二、Fallout“以假亂真?”

–漏洞分析

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

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

Bicc與泛融科技宣布就智能合約審計達成合作:據官方消息,Bicc與北京泛融科技宣布,雙方在智能合約審計方面達成合作,泛融科技將作為審計服務提供方對Bicc上線的第三方智能合約進行安全、性能等多方面審計,幫助Bicc對合約安全審計把關,Bicc會將泛融科技的合約審計結果納入上線項目是否優質的考量標準。

Bicc總部位于新加坡,是新一代數字資產與數字生態交易平臺,幫助更多區塊鏈項目發展生態規模,協助區塊鏈項目與Dapps落地,近期在Defi通證交易領域也積極跟進。北京泛融科技是工信部可信區塊鏈推進計劃副理事長單位,工信部賽迪研究院評選區塊鏈百強企業第11位,擔任工信部可信區塊鏈“溯源組”“供應鏈金融組”副組長,擁有充足的技術儲備與完善的技術測試能力。[2020/9/19]

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

分析 | Bancor交易所被盜或因其智能合約可升級:昨日Bancor被盜價值超過1200萬美元的代幣。據ETHNEWS報道,黑客顯然是通過允許Bancor更新智能合約的缺乏抵抗力的錢包來實現的。 Bancor的錢包能夠更新智能合約,這一事實本身就是Bancor協議存在爭議的一個方面,這是因為區塊鏈技術的一個關鍵賣點是其不可改變的性質。與此同時,Bancor仍堅持其協議,并贊揚由于其中心化力量,能夠節省的1億美元的BNT。Bancor首席技術官Yudi Levi表示,盡管建立了中心化的控制,該公司仍選擇擁有可升級的智能合約,是為了避免像以太坊的DAO黑客這樣的危機。Bancor曾迅速刪除包含其首席技術官文章的推文。在文章中Levi指出,可升級的智能合約僅在試用階段存在,然而此次攻擊是在其協議發布后一年多后發生的。[2018/7/11]

創業公司推出ZeppelinOS軟件可修復以太坊智能合約:據coindesk消息,以太坊智能合約的錯誤無法修復即將成為過去。一家名為Smart Contract Solutions的創業公司周五宣布在以太坊區塊鏈上推出ZeppelinOS,力求在以太坊網絡上開發一系列用于智能合約的應用和工具庫。[2018/5/26]

圖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:OWNNER區塊鏈ANCtown幣有前途嗎CryptoEnergy區塊鏈幣圈是什么意思Quoll Finance

火幣APP下載
BTC:BTC面臨關鍵阻力位,日內調整概率大_ETH

作者|哈希派分析團隊 過去一小時推特討論量:BTC仍排名第一 SOL升至第二:CoinTrendz數據顯示,過去一小時推特討論量排行中,BTC憑借162的討論量排名第一.

1900/1/1 0:00:00
GAS:干貨 | 參與Defi挖礦前,你需要準備什么?_Defi Tiger

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

1900/1/1 0:00:00
BTC:行情分析:震蕩上行是今日趨勢,區間操作是日內良機_Aave USDT

今日消息:據7月17日消息,在CoinShares最新發布題為“新冠肺炎危機期間了解比特幣”的報告,強調在危機期間比特幣展示了很強的韌性.

1900/1/1 0:00:00
比特幣:評論:不能把比特幣關在衍生金融的“籠子”_USD

作者:ClaireWu 區塊鏈項目如何才能和實體經濟相結合,而不是在金融領域空轉,是區塊鏈業界有識之士經常自我反省的問題.

1900/1/1 0:00:00
區塊鏈:觀點 | 朱幼平:優先鏈改的十個主要行業場景_比特幣

本文來源:陀螺財經,作者:朱幼平 支付結算 比特幣本來設計是替代美元,現在看來,比特幣最有用的地方是支付結算。后來包括以太坊、瑞波等都有支付結算功能,實際上加密數字貨幣否或多或少有支付結算功能.

1900/1/1 0:00:00
ENT:《深圳特區數據條例(征求意見稿)》解讀:我國或首次在正式法規層面確立“數據權”_Zeronauts

一、《深圳特區數據條例》規定數據權2020年7月15日,深圳市司法局就《深圳特區數據條例》公開征求意見,其中第四條規定“數據權”引起社會各界廣泛關注.

1900/1/1 0:00:00
ads