KeyFrame內部研究專用

Finding Bugs: 42 Tips from 4 Security Researchers | Desmond, Joran, Nat, 0xRajeev - DSS 101 2024

DeFi Security Summit - DSS·12月13日週五·113 min英文

三句話摘要

四位安全研究員分享在智能合約中發現和修復漏洞的42項實踐建議,涵蓋代碼審查、測試策略、漏洞獵捕和安全思維。 智能合約漏洞獵捕的42條建議最終歸結為:用資產-行為者-行為框架系統性思考,透過深度和廣度的平衡分析挑戰每項假設,通過實踐培養直覺,以耐心和自律確保持續高效,同時照顧身心健康才能發揮最佳性能。 挑戰直覺與數學驗證:開發者和審查員都基於隱含假設,但實際場景往往超預期。費用等價性算式在輸入/輸出模式下不對稱;ERC-4626份額稀釋問題因為鑄造新份額本身稀釋價值,簡單公式會低估實際應得量。看似合理的代碼必須通過完整推導驗證。

重點整理

重點
  • 1

    挑戰直覺與數學驗證:開發者和審查員都基於隱含假設,但實際場景往往超預期。費用等價性算式在輸入/輸出模式下不對稱;ERC-4626份額稀釋問題因為鑄造新份額本身稀釋價值,簡單公式會低估實際應得量。看似合理的代碼必須通過完整推導驗證。

  • 2

    系統性的三元框架:所有安全問題可分解為資產(什麼)、行為者(誰)、行為(怎麼做)。異常不等於漏洞,漏洞不等於脆弱性,只有導致資金損失的才算真正脆弱點。需評估影響(相對客觀)和可能性(取決於條件數量),才能判斷優先級。

  • 3

    多維度分析與邊界情況:既要深潛細節(zoom in看代碼邏輯),也要俯視全局(zoom out看系統一致性)。系統初始化時是否定義了初始條件?結束時過期鎖、遺留批准是否正確處理?九處檢查中缺一處往往就是漏洞。

  • 4

    深度優先與廣度優先獵捕:深度優先適合時間有限者——先讀文檔識別痛點,再深入代碼驗證,記錄所有"小工具"(非漏洞但可組合成攻擊鏈的行為);廣度優先則在專業領域內跨多個項目尋找相同模式。

實用技巧與重點

乾貨
  • 工具與框架:
  • Foundry、Hardhat(以太坊測試框架)
  • Forge coverage + Coverage Gutters(覆蓋率可視化,綠=覆蓋、黃=分支未全、紅=未覆蓋)
  • Solidity Inspector、Solidity extension(合約大小分析、冗餘導入檢查)
  • Mythril(符號執行)、模糊測試、不變式測試工具
  • 具體審查步驟:
  • 初始化邊界:檢查初始條件明確性,如Balancer V2、Meme攻擊利用初始狀態的漏洞
  • 生命週期末端:過期鎖、遺留批准、所有權轉移
  • 僞代碼分解:將複雜函數轉換為高層邏輯步驟
  • 單元測試改造:修改參數、調用不同路徑、理解開發者意圖
  • 文檔化假設:記錄所有系統不變式、潛在問題點、條件依賴
  • 運行覆蓋率:`forge coverage --ir` 並配合擴展查看覆蓋情況
  • 最小化模擬:使用實際實現和網絡條件,避免網絡間行為差異
  • 漏洞評估矩陣:
  • 影響維度:資金損失(高)、資金鎖定(中)、臨時中斷(低)
  • 可能性維度:無條件(高)vs 多重條件(低),條件越多概率越低
  • 嚴重程度 = 影響 × 可能性 → Critical/High/Medium/Low
  • 關鍵概念:
  • 費用等價性(Fee equivalence):輸入和輸出模式下費用計算不對稱
  • 份額稀釋(Share dilution):自動複利金庫中鑄造新份額的稀釋效應
  • 不變式(Invariant):系統應恆守的性質(如存款/取款對稱)
  • 殺傷鏈(Kill chain):多個漏洞組合導致完全失陷
  • 小工具(Gadget):非漏洞但可用於攻擊的行為
  • 狩獵策略:
  • 廣度優先:在熟悉領域(L2、橋接、槓桿)內快速掃描多個項目
  • 深度優先:文檔→識別痛點→代碼驗證,適合周末型獵人
  • 文檔優先:通過規範發現設計缺陷,比直接看代碼快
  • 記錄小工具:維護一份發現的所有可疑行為清單

結論

結論

智能合約漏洞獵捕的42條建議最終歸結為:用資產-行為者-行為框架系統性思考,透過深度和廣度的平衡分析挑戰每項假設,通過實踐培養直覺,以耐心和自律確保持續高效,同時照顧身心健康才能發揮最佳性能。

完整解析

詳細

本次為期三天的Devcon Security Summit首日揭幕講座,由四位在以太坊安全領域各有十年以上經歷的研究員系統分享實踐經驗。演講背景是一個迫在眉睫的現實問題:根據DeFi Lama的統計,智能合約黑客導致的損失呈上升趨勢,儘管該統計還不包括用戶層面的釣魚、盤控等風險。為什麼漏洞層出不窮?如何系統性地發現和修復?四位講者的42條建議試圖回答這個問題。

HiCup從認知心理學切入,用三個經典概率謎題說明人的直覺往往是騙人的——硬幣跌50%後漲50%並不能回本、專家集合必定大於專家子集、青蛙井底脫困需要四天而非五天。這引出第一條核心建議:挑戰你的每項假設。他用一個真實案例說明——看似簡單的DEX費用計算在exact input模式下用 `fee * 100` 減少,exact output模式下用 `fee * 99` 增加,但這兩種方式在數學上並不等價。再看自動複利金庫的份額稀釋問題,協議想通過 `(harvest * fee * totalSupply) / underlyingValue` 計算應得份額,但因為鑄造新份額本身就稀釋了每股價值,簡單公式只能得到1.81份而非預期的2份。這兩個例子都指向同一個教訓:即使代碼看起來合理,也必須透過完整的數學或邏輯推導驗證。

系統生命週期的邊界情況是漏洞的溫床。初始化時,Balancer V2被利用過迴圈供應為零的初始狀態重新初始化漏洞;今年的Meme攻擊則利用1:1份額對資產比率的初始假設。系統結束時,過期的鎖是否被正確踢出、遺留的token批准是否被清除、所有權轉移是否被重置——這些都需要逐一檢查。HiCup還強調了在實踐中的其他要點:同時掌握Foundry和Hardhat兩個框架避免浪費時間移植;運行覆蓋率分析(特別是用Forge coverage配合Coverage Gutters擴展,視覺化展示綠=覆蓋、黃=分支未全、紅=未覆蓋);最小化模擬使用實際實現,因為不同網絡的opcode和globals行為不同;通過修改代碼進行變異測試來檢驗測試套件的強度;定期休息避免隧道視野導致的認知偏差;最重要的是照顧身心健康——運動、睡眠、定期休假——因為安全審查是極耗心力的工作。

Horen將焦點轉向漏洞獵捕的心理和策略層面。他反對業界流行的"磨合集"文化(無限時數、不睡覺),指出醫學數據已證明長時間疲勞會增加錯誤率。他的第一條建議是要照顧自己,通過散步、做家務等低強度活動讓大腦被動處理問題——很多漏洞就是在這個過程中被發現的,因為大腦在後臺持續工作。在選擇獵捕目標時,需考慮三個維度:項目規模是否匹配你的時間預算(一週無法搞定L2完整實現)、你的專業領域是否與目標重合(熟悉槓桿系統能更快發現清算漏洞)、協議的獎金結構是否健康(只獎critical說明他們不在乎整體安全,high獎金程度反映了對安全的真實重視)。

他介紹了兩個對立的獵捕方法。廣度優先(go broad)適合那些在某個領域(L2、橋接、concentrated liquidity)有深度理解的研究員,他們可以快速識別該領域的共同痛點和實現缺陷,然後跨多個協議尋找相同模式——例如,一旦掌握了concentrated liquidity的tick轉移陷阱,就可以在所有實現過該功能的協議中批量搜索。深度優先(go deep)適合時間有限的獵人,流程是先讀協議文檔識別潛在問題點(design-level bugs),再深入代碼驗證實現,這樣集中火力而不必追求完整覆蓋。他特別提到了一個高級概念:工具箱心理模型(toolbox mental model),即在審查過程中記錄你發現的所有"小工具"(gadget,借用自二進制漏洞利用術語)——那些不一定是漏洞但能在攻擊鏈中發揮作用的行為。例如,發現系統可以被推到意外的保證金比率,這本身不是漏洞但可能成為更大攻擊的跳板。

Nat從代碼審查和不變式開發的角度層層深入。她的建議是將複雜函數轉換為僞代碼,分解成邏輯步驟,這樣能看到開發者真實的意圖而非表面的函數名。玩耍單元測試—修改參數、調用不同代碼路徑—能理解開發者的假設邊界。系統性地識別不變式,即系統應該恆守的性質:存款和取款應該是相反操作,任何打破對稱性的路徑都值得深究;函數前後條件應該相反,任何缺少反向操作的路徑都可能是bug。她強調的一個常被忽視的要點是:開發者如何設計使用系統,與用戶實際如何使用系統往往不同。在無許可區塊鏈上,除非有明確的訪問控制,否則任何人都可以以任何方式調用合約。她還談到了工具的實用哲學:不是所有人都需要高級模糊測試器,簡單的單元測試也能驗證不變式,關鍵是找到適合自己的方式。更重要的是,任何測試失敗都是線索——可能是代碼bug,也可能是測試bug或模擬bug,需要層層深究。

Desman在最後以宏觀視角重新審視了整個框架。他將所有安全問題歸結為三個要素:資產(什麼被保護)、行為者(誰可以作用)、行為(做什麼、何時、如何、為什麼)。這三元素框架貫穿了整個演講。他引入了誤用檢測vs異常檢測的概念——傳統的誤用檢測靠簽名識別已知攻擊(如古老的反病毒軟件),而異常檢測則通過建立"正常"模型來發現任何偏差。但異常不等於漏洞,漏洞不等於脆弱性,只有導致資金損失或鎖定的才是真正的脆弱性。在評估嚴重程度時,影響相對客觀(資金損失金額),而可能性取決於需滿足的條件數——條件越多,概率指數級下降。他強調的最易被忽視的地方是不一致性:如果代碼在九個地方都做檢查,但一處沒做,這往往就是漏洞;如果生命週期狀態轉移在大多路徑中都發生但某路徑缺失,那就是問題所在。

整個演講的總結包括三個讀代碼的層次:看到代碼中有什麼(present),看到缺什麼(absent),看到行外的東西(beyond the lines)。在工具上沒有銀彈,需因地制宜選擇深度優先還是廣度優先。在獵捕策略上,既要專業化深入某個領域,也要保持廣度理解整個生態。最重要的是耐心和自律——定期休息讓大腦恢復,這樣才能在長期安全研究中保持高效。

關鍵時刻

Pipeline v2

帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。

事實查核

Pipeline v2

說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

更多「Web3 安全」的內容

IF YOU OWN XRP YOU NEED TO SEE THIS PRICE MANIPULATION! ⚠️
8 min
Web3 安全英文8月14日

IF YOU OWN XRP YOU NEED TO SEE THIS PRICE MANIPULATION! ⚠️

Zach Humphries

  • 機構支撐的積極意義:價格操縱常被視為負面,但Ripple掌握大量XRP供應與escrow,在熊市期間提高價格下限,實際上替零售投資者鎖定了低風險的積累區間,這不是剝削而是市場穩定機制。
  • 歷史模式驗證:2024年7月至11月XRP在50美分附近橫盤整理,低點觸及42美分(wick),高點65美分;隨後11月5日至12月5日單月上漲456%,年底到2025年初累計漲幅534%,這個歷史周期正在1美元價位重演。
  • 比特幣聯動邏輯:講者在4-5月就預測「如果比特幣跌至60k以下,XRP會跌至1美元或更低」,此預測精準應驗,反映出熊市中兩者的明確連動關係。
Minimmit, Multimmit and the New Consensus Frontier with Patrick O'Grady
72 min
Web3 安全英文PODCAST8月5日

Minimmit, Multimmit and the New Consensus Frontier with Patrick O'Grady

Zero Knowledge

  • 反向 Linux 架構:Commonware 刻意暴露棧各層級控制,讓開發者自訂執行環境、共識機制、密碼學實現,而非像 Cosmos SDK 只允許應用層以上定制。2-3 個月能組裝一條定製鏈,代價是額外深度但回報是長期維護成本降低及效能優化彈性。
  • 容錯假設的典範轉移:Alpine Glow(Solana 2025)實現單輪投票定終的關鍵是將容錯預算分離為獨立的 Byzantine 和 Crash 容限。傳統系統把 33% 當一個整體預算;新模型允許 20% 惡意加 20% 崩潰,打破了 PBFT 理論界線,釋放單輪設計空間。
  • Minimet 與 Multimet 的遞進:Minimet 是 5F+1 設定下的乾淨構造,實現更短視圖延遲;Multimet(剛發布)進一步允許並行 mini-commits 且驗證者可推翻領導者審查,使用者交易在全球分布式網路達到 200-300 毫秒端到端定終。
Private Information Retrieval (PIR) with Alex Hoover
64 min
Web3 安全英文PODCAST7月29日

Private Information Retrieval (PIR) with Alex Hoover

Zero Knowledge

  • PIR 保護的是訪問模式,不是資料本身
  • PIR 與加密不同,它關注的是隱藏「客戶端查詢了什麼」,而非「資料是否加密」。在公開資料庫(如區塊鏈)上,客戶端可以在不洩露查詢對象給伺服器的情況下檢索特定條目,解決了輕量級客戶端的隱私和防審查問題。
  • 客戶端預處理方案是突破瓶頸的關鍵