Detecting real-world Vulnerabilities — Yannis Bollanos | Dedaub
三句話摘要
安全公司如何透過改進靜態分析管線,偵測讀寫重入與部分所有權等真實世界智能合約漏洞。 真實世界的智能合約攻擊往往藏在「表面安全」的設計之下,靜態分析必須結合資金敏感性啟發、跨合約重入簽名資料庫與部分所有權量化指標,才能在維持低誤報率的同時有效偵測這類隱性漏洞。 精確度與完整性是靜態分析的核心矛盾。 誤報讓工程師放棄工具,漏報讓工具失去價值;該公司的策略是以啟發式過濾降低誤報,同時以跨合約分析資料庫提升完整性。
重點整理
重點- 1
精確度與完整性是靜態分析的核心矛盾。 誤報讓工程師放棄工具,漏報讓工具失去價值;該公司的策略是以啟發式過濾降低誤報,同時以跨合約分析資料庫提升完整性。
- 2
讀寫重入的可偵測關鍵在於「資金敏感儲存槽位」。 Balancer 提款流程中 LP token 總供應量先更新、池子餘額後更新,在兩者中間的回調窗口讀取 LP 價格即可獲得膨脹值。偵測器若對所有重入點的 view 函數一律報警誤報率極高,因此只對「讀取值最終流入 transfer 參數」的儲存槽位報警,大幅縮小誤報範圍。
- 3
透過分析所有已部署合約可建立重入簽名資料庫,使偵測具備傳遞性。 一旦某簽名的實現被標記為可重入,所有呼叫該簽名的上層函數也會被傳遞標記,讓偵測器跨協議泛化,並在 Paribus 等 Compound V2 Fork 攻擊上驗證有效。
- 4
「部分所有權」概念突破了傳統「owner 調用即可信」的假設。 Arcadia 為使用者部署的 Vault 合約中,owner 的敏感操作受到大量外部呼叫或 require 限制,代表 owner 其實是受約束角色。統計這類限制的數量,可作為「部分所有」程度的量化指標,一旦合約中存在未受保護的重入點,即使調用者是 owner 也應發出警告。
- 5
--
實用技巧與重點
乾貨- 公司已完成 200+ 次審計,累積漏洞賞金超過 300 萬美元
- 引用兩篇論文:現有自動化工具僅偵測應偵測漏洞的 20-30%,且誤報率高
- Sturdy Finance:2023 年 6 月被盜約 80 萬美元(Balancer 穩定幣池讀寫重入)
- Paribus(Compound V2 Fork,Arbitrum):被盜 7 萬美元(讀寫重入變體)
- Arcadia Finance:被盜約 50 萬美元(部分所有權重入繞過健康度檢查)
- 分析工具鏈:Gigahorse(EVM bytecode → IR)、Symbolic(路徑敏感符號分析)、Datalog(遞迴關聯查詢引擎)
- 資金敏感啟發式:儲存槽位讀取值若流入 transfer 的接收地址或金額參數 → 標記為貨幣敏感槽位
- 讀寫重入偵測查詢三要素:① 識別重入點(重入簽名調用或原生轉帳)② 記錄尚未更新的儲存 ID ③ 確認該儲存 ID 被標記為資金敏感
- 重入簽名資料庫:對所有已部署合約傳遞式分析,重入標記沿調用鏈向上傳播
- 部分所有權量化指標:統計合約中 owner 可達的敏感操作被額外限制(外部調用驗證 / require / if)的次數,數量越多代表部分所有程度越高
- Chain Security 曾率先揭露 Curve 的讀寫重入問題(本演講向其致謝)
- --
結論
結論“真實世界的智能合約攻擊往往藏在「表面安全」的設計之下,靜態分析必須結合資金敏感性啟發、跨合約重入簽名資料庫與部分所有權量化指標,才能在維持低誤報率的同時有效偵測這類隱性漏洞。”
完整解析
詳細演講者 Yanis 任職於一家以程式分析技術見長的安全公司(推測為 Dedaub),該公司完成超過 200 次智能合約審計,累積漏洞賞金逾 300 萬美元。本場演講的起點是一個業界共識:根據兩篇學術論文的引用,現有自動化安全工具僅能偵測到應偵測漏洞的 20-30%,且大量誤報讓開發者與安全工程師望而卻步。因此,改進靜態分析必須同時兼顧兩個相互拮抗的目標:精確度(低誤報,讓人願意看警告)與完整性(低漏報,讓工具真正有價值)。
為了達成這個目標,該公司建構了三層分析管線。第一層 Gigahorse 是 EVM 位元組碼反編譯器,能將原始 bytecode 提升為標準化中間表示(IR),恢復變數與語句結構,並推斷記憶體存取模式、陣列指標、結構體指標與合約的高層儲存佈局,無需接觸原始碼。第二層 Symbolic 採用路徑敏感方式,為 IR 中所有變數賦予符號值與具體值,使分析能夠精確區分「owner 調用」、「受檢地址調用」與「任意用戶調用」等執行上下文——這是區分「信任輸入」與「汙染輸入」的關鍵能力。第三層則是 Datalog 查詢引擎,將所有程式執行資訊(控制流、記憶體使用、符號值等)儲存於關係資料庫式表格,透過遞迴聯結查詢生成漏洞報告,且能保障多項分析的效率。
第一個案例圍繞 Sturdy Finance 的 800,000 美元損失展開。根本原因是 Balancer 穩定幣池在提款流程中存在狀態更新順序問題:先燒毀 LP token(總供應量下降)、執行代幣轉帳並回調接收者,最後才更新池子的實際餘額。攻擊者在回調窗口內讀取 LP token 的價格——此時總供應量已減少但池子餘額尚未反映,導致每份 LP token 的隱含價值被人為抬高,攻擊者藉此膨脹抵押品價值,借出超額資金。靜態分析的困難在於:合約確實使用了重入鎖,而讀取操作都是 view 函數,不受鎖保護;若對所有「重入點之後仍有未更新儲存」的 view 函數一律報警,正常合約中打破 checks-effects-interactions 模式但安全使用重入鎖的情形將造成大量誤報。為此演講者提出「資金敏感儲存槽位」啟發式過濾:若某槽位的讀取值最終流入 transfer 的接收地址或金額參數,則標記為貨幣敏感槽位,偵測器只對此類槽位在重入點的讀寫不一致情況報警。同時,透過對所有已部署合約進行傳遞式分析,可建立一個重入簽名資料庫——一旦某簽名的實作被判定為可重入,所有呼叫該簽名的上層函數也會被遞迴標記。這一機制在 Paribus(Compound V2 Fork,Arbitrum 上損失 7 萬美元)等類似案例上得到驗證,確認偵測器的泛化能力。
第二個案例是 Arcadia Finance 的 500,000 美元損失,展示了一種更微妙的攻擊面:「部分所有權」。Arcadia 為每位用戶部署獨立的 Vault 合約,用戶名義上是 Vault 的 owner,卻受到協議設計的多重限制。Vault 允許 owner 提供 Action Handler(需通過白名單驗證),並在 Action Handler 執行完畢後進行健康度檢查(確保抵押品 ≥ 借貸金額)。攻擊者先將抵押品轉入 Action Handler,再從 Action Handler 呼叫 `liquidateVault`:此時 Vault 內無抵押品僅剩債務,清算條件成立,清算函數設定了兩個狀態變數,使後續的健康度檢查被完全跳過,攻擊者因此帶走所有資金而無需還款。傳統靜態分析通常將 owner 調用視為可信,不發出警告;但演講者指出,Arcadia Vault 的 owner 在許多敏感操作上受到外部調用驗證、require、if 條件的額外限制——這些限制的數量正是「部分所有」程度的量化指標。若分析器偵測到:① 調用者雖為 owner 但合約對其操作設有大量額外限制,且 ② 存在未受重入保護的外部回調,則應提升警戒並報警,即使調用者是已驗證地址。
---
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

