建構函式缺失漏洞自智慧型合約產生以來就一直出現,歸根到底是由於新進開發者對 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...