建構函式缺失漏洞分析

2021-08-22 19:12:03 字數 2560 閱讀 1086

建構函式缺失漏洞自智慧型合約產生以來就一直出現,歸根到底是由於新進開發者對 solidity **結構不熟悉造成的。bugx.io團隊本次就來介紹一下漏洞的基本原理、表現形式以及對開發者的建議。

solidity編寫合約和物件導向程式設計語言非常相似,我們可以通過建構函式(constructor)來初始化合約物件。建構函式就是方法名和合約名字相同的函式,建立合約時會呼叫建構函式對狀態變數進行資料初始化操作。

合約結構的規範寫法如下:

contract a 

function() external

// external functions

// ...

// external functions that are view

// ...

// external functions that are pure

// ...

// public functions

// ...

// internal functions

// ...

// private functions

// ...

}

建構函式缺失則是由於建構函式與合約名字不同,而又為 public 型別,就變成了乙個公有函式了,可以被任何人呼叫,一般函式函式比較敏感,用於初始化合約時定義通證數量、管理員位址等基本變數狀態,一時變成了公有函式,危害可想而知,許可權控制、通證管理基本全線奔潰。

從 `0.4.22`版本開始,solidity 編譯器引入了 constructors 關鍵字,以替代低版本的將合約名作為建構函式名的語法,避免程式設計師容易出現的編碼錯誤。使用舊寫法會出現 warning 資訊。

新版本寫法為:

contract ownable 

// other code

}

我們發現了不少這種錯誤寫法的合約,在主合約中,建構函式寫成了 token() 或 erc20token() 。這樣子的函式非建構函式,變成了普通函式了。

如 dealguard 合約: 

只能說開發者太大意,對智慧型合約開發有什麼誤解吧。經常看到的漏洞形式是合約名與建構函式不同,只與 name 變數名相同,估計是開發者以為合約名相同就行了,卻忽略了建構函式。

如 reapercoin11 合約: 

還有這個 krypticoin 合約,乍一看看不出來,仔細瞅瞅,再仔細瞅瞅,原來 coin 拼錯了 。

之前知道創宇發布了關於 `owned`大小寫編碼漏洞的文章。同時,我們也可以找一些類似的容易大小寫錯誤的庫合約,如 `ownable`。不過經過我們的分析,還是以 owned 大小寫錯誤為主。

如 morph 合約:

contract owned
版本公升級後的建構函式只需要單獨使用 constructor 即可,但很多開發者卻忽略了此細節。上面這個寫法錯誤在於兩點:

但是有開發者忽了此警告,寫出了錯誤**。

如 mdot 合約: 

function constructor() public
2) 但是如果將 `constructor`錯寫成了 `constructor`,使得編輯器識別其為普通函式名,沒有任何 warning 資訊。如 togtoken 合約: 

使用新版本寫法,並且檢查句式、拼寫的正確性。

通過我們對以太坊上的合約進行整體監測,發現有此漏洞的竟達兩千多份,大小寫編碼錯誤的約有20 份。其中不乏正在使用中的合約。

bugx.io是一家致力於區塊鏈領域的安全公司。核心團隊組建於2023年,我們在區塊鏈生態安全、行業解決方案、安全建設、紅藍對抗等方面有深厚積累與過硬專業素養。

建構函式缺失漏洞解析

一 前言 建構函式缺失漏洞自智慧型合約產生以來就一直出現,歸根到底是由於新進開發者對 solidity 結構不熟悉造成的。bugx.io團隊本次就來介紹一下漏洞的基本原理 表現形式以及對開發者的建議。二 漏洞原理 1.什麼是建構函式 solidity編寫合約和物件導向程式設計語言非常相似,我們可以通...

深度分析C 預設建構函式 拷貝建構函式

對於c 初學者來說,時常不難看到他們說 1.任何class如果沒有定義預設建構函式,那麼就會由編譯器來合成乙個出來。2.編譯器合成來的建構函式會明確確定裡面所有成員的值。比如int型別成員會初始化成0 呃,這當然是一部分c 新手的一廂情願吧 其實c 裡面對於建構函式的誕生與否是取決於編譯器是否需要必...

jQuery建構函式分析

function window,undefined window 我們通過alert jquery 知道它是乙個物件,那麼這個物件是怎麼構造出來的呢?我們使用 document 類似的寫法獲取元素,就好像直接呼叫了普通的方法一樣,jquery就是普通的函式嗎?如果是建構函式為什麼不是 new doc...