KeyFrame內部研究專用

MakerDAO Smart Contract Safety - When Billions are at Stake, Kurt Barry - DeFi Secuirty Summit 2022

DeFi Security Summit - DSS·10月19日週三·17 min英文

三句話摘要

MakerDAO 的协议安全体系:多维度纵深防御策略,从工程流程、测试、形式化验证到生产应急的完整防线。 安全是多維度的纵深防御,沒有單一銀彈,必須在工程流程、測試、形式化驗證、審計、漏洞賞金等多層面並行實施,同時在不可避免的生產問題出現時準備好應急機制。 紸深防御策略是基礎

重點整理

重點
  • 1

    紸深防御策略是基礎

  • 2

    沒有任何單一防御措施是完美的,採用瑞士奶酪模型——每層都有漏洞,但通過足夠多的防線組合,使漏洞不對齐,就能過濾掉大多數問題。同時必須預留好處理生產問題的應急機制。

  • 3

    安全驗證跨越三個層次

  • 4

    意圖層(目標是什麼)、設計層(怎麼設計)、實現層(代碼怎麼寫)。許多 bug 出現在層次之間的邊界上,例如設計可能缺乏適當的博弈論基礎,或實現與設計不匹配,即使代碼完美寫成也會有問題。

  • 5

    多維度並行驗證體系

  • 6

    不依賴單一工具或流程。透過工程流程(雙簽字、檢查清單、事後分析)、測試(單元、分叉、模糊、屬性測試)、形式化驗證、經濟建模、第三方審計、漏洞賞金等多個獨立維度,每個維度都有漏洞,但組合起來能捕捉不同類型的問題。

  • 7

    生產環境的妥協與應急設計

  • 8

    承認生產問題不可避免。透過即時訪問模塊(特定即時操作不受時間鎖限制)、投票委託人(簡化治理參與)、預先編碼的「黑暗魔法」部署機制(快速修復無需暴露漏洞),在時間鎖和不可篡改性的約束下快速響應。

實用技巧與重點

乾貨
  • 安全原則
  • 保障優先於安全(safeguarding vs security)
  • 意圖-設計-實現層次結構
  • 細節極致關注但尊重成本和速度限制
  • 殘余風險永遠存在,從不完全信任任何代碼
  • 工程流程
  • 任何代碼變更需兩次簽字確認
  • 複雜代碼進行逐行審查會議,採取紅隊對抗性思維
  • 標準化流程配備檢查清單(如每週治理行動)
  • 每當出現問題時進行事後分析
  • 測試方法
  • 單元測試全面覆蓋(基本要求)
  • RPC/模擬測試針對主網分叉版本
  • 模糊測試特別適合數值方法(發現舍入問題)
  • 測試網部署對自身和集成夥伴都有價值
  • 定義系統屬性,屬性定義本身就能發現忽略的問題
  • 形式化驗證工具演變
  • 早期:K 框架、KVM、ACT 語言(由早期 Maker 開發者創建)
  • 現在:Sartura(更易學、速度更快)
  • 研究中:Foundry 與開源工具整合
  • MCD 系統的形式化驗證案例
  • 完整形式化驗證仍發現 bugs
  • 最大類型:函數/合約間交互問題(約 5 個)
  • 規範與代碼同步的 bug(兩者都有同樣缺陷)
  • 幻象溢出問題:某些計算即使值合理也會回滾,但規範未考慮範圍檢查
  • 不變式驗證失敗:核心記賬邏輯中假定的不變式實際不存在
  • 經濟建模
  • 方法:基於代理的模擬、金融計算
  • 適用場景:大型複雜升級,顯著改變機制和激勵
  • 實踐:與 Gauntlet 合作清算系統升級;Maker 內部風險核心部門進行金融建模
  • 審計實踐
  • 理想:代碼精雕細琢後再進行審計(不進行審計驅動開發)
  • 長期合作協議價值:保證審計人員連續性,更深入理解協議
  • 推薦:Chain Security
  • 漏洞賞金:發布前 + 生產後雙層結構
  • 發布前漏洞賞金案例:Multilateral Die 發現 4 個嚴重/高危問題,有的審計遺漏
  • 管理方:Maker 與 Immunify 合作
  • 生產問題的三大挑戰
  • 時間鎖:防止治理攻擊但延遲應急反應
  • 不可篡改性:保障信任但無法快速修復
  • 透明度:公開流程但暴露漏洞給恶意者
  • 生產問題應急機制
  • 即時訪問模塊:允許特定即時操作,不受時間限制但嚴格限制
  • 延遲價格機制:1 小時延遲預言機價格
  • 投票委託人:簡化協調,專注治理
  • 「黑暗魔法」部署:CREATE 操作代碼預先提交,需要時立即生效
  • 最佳實踐
  • Wrapped Ether 優於 Raw Ether
  • 更安全(無重入風險)
  • 代碼路徑少
  • 可組合性強(無需轉賬審批)
  • ERC20 兼容性廣泛
  • WETH 已運行多年、鎖定數十億價值、代碼簡單、無管理功能、無法升級
  • 延遲是可接受的
  • 如有不好預感,延遲一週優於發布有缺陷代碼
  • 逐步降低風險
  • 分階段發布、分批推出
  • 限制總價值負載(TVL)
  • 不一次性升級所有東西
  • 最小化外部依賴
  • 減少外部調用、合約導入
  • 代碼更易讀、測試、驗證
  • 降低複雜性風險

結論

結論

安全是多維度的纵深防御,沒有單一銀彈,必須在工程流程、測試、形式化驗證、審計、漏洞賞金等多層面並行實施,同時在不可避免的生產問題出現時準備好應急機制。

完整解析

詳細

MakerDAO 面臨的根本挑戰是在保護數十億美元抵押品和未償債務的同時發布和維護去中心化金融協議。發布代碼本質上危險重重——可能直接出現 bug,新舊代碼交互可能產生意外結果,代碼語義會隨 EVM 硬分叉改變,即使完全按設計實現也可能出現經濟漏洞,更別提網路擁塞或區塊鏈故障。完全不發布代碼顯然不現實,而完全信任任何單一防御措施也是致命危險。

Kurt Berry 因此闡述了 MakerDAO 採用的「瑞士奶酪」纵深防御戰略。這個比喻的核心是:每一層防線(每塊奶酪)都有漏洞,沒有任何防御技巧是完美或萬能的,但通過組合足夠多的防線,漏洞就不會對齐,大多數問題都能在進入生產前被過濾掉。同時必須準備好應對生產問題的出現,因為它們不可避免。

這個整體工程方法從原則開始。MakerDAO 強調保障(safeguarding)優先於安全(security),因為不安全的代碼可能既損害用戶利益又可能被攻擊——例如錯誤的合約可能直接鎖定資金,用戶會像擔心被駭客攻擊一樣擔心損失資金。其次是意圖-設計-實現的層次結構,用於組織不同抽象層級。例如意圖是實現無需許可的資產交換,設計是恆定產品 AMM,實現是 Uniswap V2 合約。許多 bug 出現在層次的邊界上——可能設計完美但實現不正確,也可能實現完美但機制設計缺乏適當的博弈論基礎。MakerDAO 黑色星期四的拍賣損失就是設計未能匹配區塊鏈環境的典型案例,後來他們重寫了拍賣流程以解決流動性和網路擁塞的限制。

在工程流程上,任何代碼變更都需要兩次簽字確認。對複雜代碼進行逐行審查會議,團隊採取紅隊般的對抗性思維——「我們沒有測試這段代碼,現在試著把它搞壞」。所有標準化流程(如每週治理行動)配備檢查清單,這些在其他安全關鍵領域早已廣泛使用,在 DeFi 中同樣有效。最關鍵的是進行事後分析,建立持續改進的反饋循環——無論員工多優秀都不可能完美,必須通過事後分析不斷改進流程。

測試是基礎之基礎。全面的單元測試覆蓋是基本要求——成本相對於潛在的十億美元損失極低。針對主網分叉版本運行的 RPC 或模擬測試至關重要,因為涉及與鏈上已有代碼的集成,必須在實際狀態下驗證。模糊測試特別適合數值方法,這些方法經常隱藏棘手的舍入問題,肉眼根本發現不了。測試網部署對 MakerDAO 自身和集成夥伴都有價值——後者可能希望在實際運行的共識層上進行測試。關鍵的測試原則是不僅測試每個函數的個別行為,還要定義合約或系統的某些屬性。屬性定義的過程本身就常常能發現原本會忽略的問題,這些屬性對接下來的形式化驗證也極其有用。

形式化驗證使用符號執行或其他形式化方法驗證代碼屬性,但通常耗時且可能昂貴,取決於使用的解決方案。因此 MakerDAO 優先將其用於更關鍵的合約——高風險合約、難以升級的合約或需要 gas 優化的合約。Gas 優化本身是個容易引入 bug 的過程(Solc 優化器就存在一些 bug),所以每當發布 WE View 時都存在額外風險,應進行字節碼級別的形式化驗證。驗證可在多個層級進行:字節碼級別、函數級別、行為級別、合約級別或多合約系統級別。MakerDAO 的工具也在演變。早期使用基於 K 框架、KVM 和 ACT 語言的堆棧(ACT 語言由早期 Maker 開發者創建),現在使用 Sartura 進行許多日常形式化驗證,因為它更易被工程師學習且速度非常快,同時 Sartura 的結構團隊也很出色。他們還在研究 Foundry 與各種開源工具的整合,以提高可訪問性——因為工具複雜性通常是採用的最大障礙。

但形式化驗證本身也不是萬能的。MCD 系統曾進行過完整形式化驗證,但仍然發現 bugs——這正是瑞士奶酪模型的說明。最大的一類 bug 是不同函數或合約間的交互問題(約 5 個),因為形式化驗證只驗證了原始版本每個函數的個別行為,指定得完美無瑕符合預期,但當這些合約或函數組合在一起時,就會出現有趣的現象。有個 bug 甚至在形式化規範中也有體現——代碼和規範都寫了,但兩者都有同樣的 bug,本應有單元測試卻最終被集成測試捕捉到。一個有趣的例子是幻象溢出問題:某些計算即使給出合理的值也會回滾,規範只是說「溢出就回滾」,但應該檢查如果值在某些範圍內是否應該回滾——這也可以透過形式化驗證實現,只是沒有做。最近的發現是他們之前認為核心記賬邏輯中存在某個特定的不變式,但實際上它並不存在,Kurt 純粹為了好玩想證明一下(因為他們準備在 L2 層部署),結果發現它是錯誤的。幸運的是這在生產中不是問題,是那種永遠不會被利用的情況。

經濟建模透過基於代理的模擬或其他金融計算,在各種金融條件下(如價格暴跌)尋找系統的涌現特性。這方法最適合大型複雜升級,會顯著改變底層機制和激勵。MakerDAO 與 Gauntlet 合作進行清算系統升級,是非常好的經驗。Maker 還有內部風險核心部門進行金融建模。記住所有模型都有局限性,關鍵是確保測試了所有需要的場景,代理邏輯內置了正確的激勵。

審計是另一層重要防線,但不應是驅動開發的——所謂「審計驅動開發」(ADD)是個笑話(Kurt 說這是從推特上的 Marillion 那裡偷來的)。審計在代碼精雕細琢時最有效。與審計公司簽訂長期合作協議非常有價值,能保證審計人員的連續性,意味著他們對協議有更深入的理解,更可能發現細微的交互問題——這正是他們重點關注的 bug 類型。MakerDAO 特別推薦 Chain Security。關於漏洞賞金,理想情況下應在發布前將代碼開放給賞金計畫,這樣能在 bug 進入生產前發現它們。但也必須設置生產後漏洞賞金。例如 Multilateral Die 的發布前漏洞賞金計畫發現了 4 個嚴重和高危問題,雖然審計中有些遺漏,但這不能完全歸咎於審計——其中一次審計確實發現了問題的前提條件,但沒有發現問題的全部嚴重性。這說明沒有萬全之策,一切都像瑞士奶酪一樣到處是漏洞,希望奶酪洞越多越好,因為它能提高安全性。目前 MakerDAO 與 Immunify 合作管理其漏洞賞金計畫。

生產問題處理面臨去中心化環境的獨特挑戰。首先是時間鎖——為了防止治理攻擊,大多數協議在操作生效前設置某種延遲,但如果協議被積極利用,可能根本不希望有這個延遲。其次是不可篡改性——有時根本無法升級某些東西,不可篡改性能讓人們真正信任代碼不會未授權被篡改,長期來看擁有不可篡改的金融系統應是目標,規則不能隨意更改,但短期解決漏洞時,某東西有漏洞又無法替換就成了問題。第三是透明度——大多數機構治理流程非常開放,例如在公開論壇上,但如果公開說「這裡有漏洞可能需要修復」,恶意行為者會看到並可能利用它。

MakerDAO 的解決方案包括多個層面。首先是即時訪問模塊,允許管理層採取一些經過特定選擇的特定即時操作,不受時間限制,但當然也嚴格受限,防止在治理攻擊時攻擊者造成太大傷害。這通常結合其他措施,例如確保治理機制能在一定時間窗口內採取行動。如果熟悉 Maker,會知道它使用 1 小時延遲的預言機價格,這讓政府能及時觸發即時訪問模塊,在攻擊或故障時凍結預言機。其次是對無法升級或難以升級的組件進行額外審查。第三是治理流程中的投票委託人,簡化協調工作——投票權可委託給少數人(但不能太少以防風險),與協調可能有很多其他事要做的大型代幣持有者相比容易得多。對於極端生產問題,終極解決方案是「黑暗魔法」機制。基本上可以部署(或雖然不部署但可以創建)一個合約,預先提交到已部署的地址,使用 EVM 中的 CREATE 操作代碼完成。然後需要找信任的人(如審計員或知名社區成員)測試修復方案的安全性。之後可以快速投票通過這個「咒語」,它在部署後立即生效,而不暴露漏洞,也不讓漏洞在時間鎖期間被攻擊。

最後是 MakerDAO 的精選最佳實踐。首先是 Wrapped Ether 基本上在所有情況下都優於 Raw Ether。它更安全——使用 Wrapped Ether 永遠不會出現重入攻擊;代碼路徑少——嘗試同時處理 ERC20 和 Raw Ether 意味著多個代碼路徑,代碼路徑越多風險越大;可組合性強——Wrapped Ether 不需要像普通以太幣那樣進行轉賬審批;ERC20 兼容性廣泛。反駁總是「如果 Wrapped Ether 合約有漏洞怎麼辦」,但 WETH 已經運行多年鎖定數十億價值、代碼簡單沒有管理功能無法升級,這種風險目前極低。除非真的需要 Raw Ether 的 gas 效率,否則用 Wrapped Ether 會更輕鬆。其次,延遲是可以接受的。發布和快速發布的壓力很大確實有合理性,但通常如果有人對某事有不好預感,延遲一週通常比發布有缺陷的東西好得多。第三,逐步降低風險。發布新代碼時應盡量限制系統財務風險,類似傳統 Web 開發的分階段發布或分批推出。更重要的是關乎協議和用戶面臨多大風險,應循序漸進升級——不要一次升級所有東西、不要達到債務上限等等。第四,最小化外部依賴、調用和合約導入,減少導入和外部調用。這樣代碼更易讀、測試和驗證。當然某些複雜性不可避免地存在,但應盡量減少。

關鍵時刻

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