DeFi Security Summit 2023 - Session 3: Network & VM - Yoav Weiss & Oren Fine
三句話摘要
Etherscan上的智能合約代碼偽裝技術——通過隱藏、偽造和混淆手段,讓顯示的代碼與實際執行的代碼不一致,藉此欺騙審計者和用戶。 Etherscan驗證與實際執行之間的信息不對稱構成系統性風險,審計者必須超越代碼表面通過交易追蹤工具驗證實際執行流程。 代碼深度隱藏:上傳超過實際使用的大量代碼文件,將漏洞隱藏在複雜的多重繼承樹中。缺失onlyOwner修飾符等細微差別容易被審計者遺漏。
重點整理
重點- 1
代碼深度隱藏:上傳超過實際使用的大量代碼文件,將漏洞隱藏在複雜的多重繼承樹中。缺失onlyOwner修飾符等細微差別容易被審計者遺漏。
- 2
代理層級欺騙:偽造代理顯示合法實現地址,但實際調用不同實現;或構建非代理代理(普通看起來的合約實際通過fallback委託),初始部署時委託地址為空,後期才添加惡意實現。
- 3
函數選擇器碰撞:利用4字節函數簽名只有有限可能性,在代理中創建與實現函數名完全不同但簽名相同的函數,優先級覆蓋合法功能(如用imageURL覆蓋addManager)。
- 4
儲存破壞與鏈表操縱:通過初始化或delegatecall破壞儲存結構;Solidity映射基於哈希無法查看實際意義,Gnosis Safe案例顯示鏈表中有簽名者但mapping中隱藏額外簽名者,使get_owners無法列出全部。
實用技巧與重點
乾貨- Chain Swap漏洞案例
- 第一次攻擊:80萬美元損失
- 第二次攻擊:440萬美元損失(2021年末)
- 攻擊鏈路:Chainswap代理 → Factory代理 → FactoryImplementation → 未驗證閉源合約
- 配額被繞過:每地址獲得10^22無限配額
- 具體攻擊技術
- 隱藏代碼行數:7000+行無用代碼
- 函數選擇器長度:4字節
- 儲存示例:20個隱藏簽名者通過映射而非鏈表可見
- 使用工具與平台
- Etherscan(代碼驗證查看)
- Tenderly(交易追蹤分析)
- Twitter掃描(配額查詢測試)
結論
結論“Etherscan驗證與實際執行之間的信息不對稱構成系統性風險,審計者必須超越代碼表面通過交易追蹤工具驗證實際執行流程。”
完整解析
詳細智能合約審計的假設是看到Etherscan上的已驗證代碼就代表真實執行邏輯,但實際上存在多層欺騙手段可以打破這個信任。最直接的方法是代碼深度隱藏——開發者可以上傳任意多個Solidity文件,其中大部分不被字節碼使用,造成審計者信息過載。更難以察覺的是多重繼承結構,同一函數可在不同父合約中有多個實現,審計者難以確定哪個被真正調用。展示的例子是一個包含7000行代碼的模板,其中ownership轉移函數在三個父合約中都有實現,第三個版本缺少onlyOwner修飾符,任何人都能接管合約。
代理層級的欺騙更加隱蔽。Etherscan識別ERC1967和透明代理的機制被濫用——偽造代理會在標準實現槽位放置虛假地址,但實際通過自定義邏輯從其他槽位讀取真實實現。更高階的是非代理代理,表面上是普通ERC-20代幣,其實繼承鏈深處隱藏了fallback函數,將所有超出ABI的調用委託給指定地址。關鍵是初始部署時委託地址為空(反事實部署),代碼審核時調用會回退無異常,但後期可隨時在該地址部署新合約添加mint等惡意函數。
函數選擇器碰撞是另一層攻擊面。Solidity編碼函數時只使用簽名哈希的前4字節,碰撞概率遠高於期待。在代理環境中,代理函數優先級更高,攻擊者可創建看似無害的pure函數(如imageURL)其實簽名與管理函數碰撞,當用戶執行addManager時實際調用imageURL,而imageURL返回映射getter導致狀態污染。Gnosis Safe案例展示存儲層面的破壞——簽名者以鏈表形式存儲確保順序,但同時用映射重複存儲以優化檢查。初始化時可通過delegatecall在隨意槽位植入垃圾數據,這些數據在映射邏輯中成為額外簽名者,getSigners無法遍歷發現但getSigner單個查詢會返回。
Chain Swap的4.4百萬美元漏洞完美展示這些技術的真實危害。審計報告未發現異常,因為Etherscan顯示的已驗證代碼配額檢查正常,但實際執行時交易委託給未驗證的閉源合約,其中配額函數不是映射而是自定義計算邏輯,返回所有地址都是10^22的無限額度。從部署到被攻擊的一周內,任何人都可以無限轉移資產。追蹤攻擊交易需要用Tenderly逐步執行才能發現真實委託目標與Etherscan顯示不符。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

