跳到正文

未初始化的可升級代理:initializer 接管風險

可升級代理透過初始化呼叫設定自身儲存,而不是依賴實作合約建構函式。本文說明搶跑、實作鎖定和部署檢查。

更新於

僅供教育參考,不構成投資建議;投資可能產生損失。

直接答案

可升級代理透過初始化呼叫設定自身儲存,而不是依賴實作合約建構函式。本文說明搶跑、實作鎖定和部署檢查。

新代理地址部署完成但初始化交易尚未確認時,任何人都可能嘗試搶先調用公開initializer並成為Owner。

代理部署時建構函式不會在代理儲存中執行實作合約的初始化邏輯,因此可升級系統常使用只能呼叫一次的initializer設定Owner、代幣參數和模組。若函數沒有正確保護,或部署與初始化分成兩筆交易,攻擊者可能先呼叫。

機制

安全流程將部署和初始化calldata放在同一原子交易中,並在實現合約構造時停用初始化,防止實作本身被接管。 reinitializer用於新版本新增狀態,也必須限製版本和呼叫權限。只檢查代理Owner而不檢查實現初始化狀態仍可能漏風險。

鏈上操作要分成四層:錢包負責展示和簽名,RPC負責讀取與廣播,合約代碼決定狀態變化,區塊共識決定交易是否最終確認。任一層顯示「成功」都不能取代其他層核驗。

例子

專案先部署代理,規劃下一筆呼叫initialize(team)。攻擊者監控記憶體池並以更高費用先呼叫initialize(attacker),成為管理員,隨後升級到惡意實作並轉走資金。團隊自己的初始化交易回滾,但此時控制權已失去。

案例中的Gas、滑點和區塊時間用於展示計算方法。真實操作前應讀取目前鏈、目前區塊的價格、流動性、權限和合約狀態。金額同時記錄代幣數量、美元價值和鏈上原始整數。

風險

收益必須以真實可退出價值計算:

淨退出價值 = 資產市值 - 價格衝擊 - 協議費用 - 轉帳稅 - Gas - 等待風險折價

建立網絡擁塞、預言機異常和管理員升級三種壓力情境。假設Gas擴大五倍、池深下降50%、穩定幣折價5%,加入一天無法退出。若一個月收益無法覆蓋壓力摩擦,高收益沒有提供足夠補償。

單一協議、單鏈、單橋和單一穩定幣分別設定上限。任何需要管理員、預言機、橋、前端與單一RPC同時正常才能退出的部位應進一步縮小,不能把多個相關依賴誤認為分散。

常見誤區

  • 迷思1:前端餘額就是鏈上事實。 前端可能快取、索引延遲或連接錯誤網絡,必須用合約讀取交叉驗證。

  • 迷思2:提高Gas或滑點能解決任何失敗。 Gas只影響排序,滑點只放寬價格;權限、Nonce和合約條件錯誤不會自動修復。

  • 迷思3:小額測試成功代表永久安全。 管理者升級、動態參數和流動性變化會改變結果,每次擴大部位前都要重複檢查。

相關主題

來源

導覽

搜尋知識庫...