KeyFrame內部研究專用

Smart Contract Auditing: A Beginner's Guide

Web3 Security Masterclass Series·7月27日週一·50 min英文

三句話摘要

智能合約審計實戰:從程式碼分析到漏洞驗證與審計報告撰寫 智能合約審計的完整流程是代碼分析、自動化工具掃描、手動驗證相結合,最後用結構化報告將漏洞、影響、驗證過程和修復方案清晰呈現。 私密變數的誤解:Solidity 的 `private` 修飾符只阻止其他智能合約讀取,但無法隱藏鏈上數據。所有存儲數據本質上對區塊鏈用戶透明,任何人都能透過直接查詢存儲位置來訪問,這顛覆了開發者對「隱私」的假設。

重點整理

重點
  • 1

    私密變數的誤解:Solidity 的 `private` 修飾符只阻止其他智能合約讀取,但無法隱藏鏈上數據。所有存儲數據本質上對區塊鏈用戶透明,任何人都能透過直接查詢存儲位置來訪問,這顛覆了開發者對「隱私」的假設。

  • 2

    審計報告的標準結構:專業報告必須包含五部分——標題清晰陳述問題、描述解釋技術根源、影響說明造成的危害、概念驗證提供可重現的步驟、修復措施給出具體解決方案,每部分都是協議團隊理解與信任的必要條件。

  • 3

    工具與手動驗證的雙環驗證:Slither 等靜態分析工具能快速掃描代碼,但只能指出疑似問題。真正的審計必須部署合約、實際交互、提取數據、驗證漏洞真偽,自動化與手動驗證缺一不可。

  • 4

    本地測試環境的實踐流程:使用 Foundry 框架構建完整的本地測試環境(本機 8545 埠、預設測試帳戶與虛擬資金),能在無需真實鏈的情況下完整重現漏洞,這是高效審計的基礎。

實用技巧與重點

乾貨
  • 工具與框架
  • Slither:靜態分析工具,執行 `slither .` 進行模式匹配檢測
  • Foundry 框架:包含 Forge(構建與測試)與 Cast(鏈互動工具)
  • Forge 命令:`forge build`、`forge test`、`forge coverage` 等
  • 關鍵命令
  • `make deploy`:本地部署合約
  • `cast storage <合約地址> <位置編號> --rpc-url http://127.0.0.1:8545`:讀取存儲數據
  • `cast to-ascii <十六進制>`:十六進制轉 ASCII 字符串
  • `cast bytes32 <十六進制>`:按 32 字節解析數據
  • 測試網設定
  • RPC 端點:http://127.0.0.1:8545
  • 預設 10 個測試帳戶,每個 10 ETH 虛擬資金
  • 每個帳戶有對應私鑰
  • 漏洞詳情
  • 合約:PasswordStore
  • 問題:`set_password` 函式無訪問控制,任何人可調用
  • 密碼存儲位置:位置 1(位置 0 存 owner 地址)
  • 影響:任何人都能讀取所有密碼
  • 審計報告五要素
  • 標題:漏洞本質描述(如「在鏈上存儲密碼導致透明性破壞」)
  • 描述:技術問題說明與相關程式碼引用
  • 影響(Impact):功能破壞或資產風險
  • 概念驗證(PoC):完整的部署→讀取→驗證步驟序列
  • 修復措施(Mitigation):具體解決方案(如對密碼進行鏈下加密)

結論

結論

智能合約審計的完整流程是代碼分析、自動化工具掃描、手動驗證相結合,最後用結構化報告將漏洞、影響、驗證過程和修復方案清晰呈現。

完整解析

詳細

這堂審計課以 PasswordStore 智能合約為實例,完整演示專業審計師的工作流程。講師 IJ 和 Scott 首先回顧了之前發現的漏洞:合約聲稱只有所有者能設定密碼,但 `set_password` 函式實際上對所有人開放。

為系統性地發現問題,他們引入 Slither 工具——一個靜態分析引擎,能透過程式碼模式匹配自動掃描潛在漏洞。Slither 的報告涵蓋編譯器兼容性、命名規範、文檔參數不匹配等多維度檢測。針對 PasswordStore,它正確標記了關鍵的訪問控制缺失。

最關鍵的部分是概念驗證。講師使用 Foundry 框架在本機搭建完整測試環境。本地網路執行在 127.0.0.1:8545,預配置 10 個測試帳戶,每個擁有 10 個虛擬 ETH。透過 `forge build` 編譯合約,`make deploy` 部署至本機鏈,合約被分配唯一地址。部署完成後,owner 地址存放在存儲位置 0,密碼存放在位置 1。

接著他們用 `cast storage` 命令直接查詢鏈的存儲層。執行 `cast storage <合約地址> 1 --rpc-url http://127.0.0.1:8545` 後得到十六進制格式的密碼數據。為使其可讀,他們進一步用 `cast to-ascii` 命令將十六進制轉換為明文。這個實驗直觀證明了漏洞的嚴重性:儘管代碼用 `private` 修飾符聲稱隱私,任何持有合約地址的人都能在數秒內讀取所有密碼。

最後是審計報告撰寫。專業報告包含五個層級:標題部分用一句話概括漏洞本質;描述部分詳細解釋區塊鏈的透明特性如何使私密變數失效;影響部分量化損害——任何人都能讀取密碼,破壞了協議的基本功能;概念驗證部分依序記錄部署、查詢、轉換、驗證的完整步驟,讓接收者能自己重現漏洞;修復措施部分建議對密碼進行鏈下加密再上鏈存儲。這種結構化敘述讓協議團隊能快速理解問題、相信漏洞真實,並明確知道修復方向。

關鍵時刻

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