KeyFrame內部研究專用

Web3 重入漏洞讲解 | Solidity 智能合约安全 5分钟看懂重入攻击

bugTheAnswer·4月12日週日·5 min中文

三句話摘要

以 Foundry 模擬區塊鏈重入漏洞(Reentrancy Attack)的攻擊原理與兩種防禦方法。 提款函數務必遵循「先更新狀態、再轉移資產」的 CEI 順序,或加掛 `nonReentrant` 鎖,否則任何先轉帳後清帳的設計都是潛在的重入攻擊缺口。 正確與錯誤提款流程的根本差異:正確流程先扣除餘額再發送資產;錯誤流程先發送資產,餘額留到最後才更新,導致攻擊視窗開放。

重點整理

重點
  • 1

    正確與錯誤提款流程的根本差異:正確流程先扣除餘額再發送資產;錯誤流程先發送資產,餘額留到最後才更新,導致攻擊視窗開放。

  • 2

    `receive()` 函數是重入攻擊的觸發器:當合約向外部地址發送 ETH 時,若接收方是合約,其 `receive()` 函數會自動執行,攻擊者在此處再次呼叫 `withdraw()`,形成遞迴循環。

  • 3

    CEI 模式(Checks-Effects-Interactions)是最輕量的防禦:只需將 `balances[msg.sender] = 0` 移到 `.call()` 之前,攻擊者第二次進入時餘額已為零,提款直接 revert。

  • 4

    OpenZeppelin `nonReentrant` 提供合約層級鎖:透過 mutex 狀態旗標,確保整個提款函數執行期間無法被重新進入,適合邏輯複雜、難以手動套用 CEI 的場景。

實用技巧與重點

乾貨
  • 攻擊數字:受害者存入 10 ETH,攻擊者存入 1 ETH,攻擊成功後攻擊合約持有 11 ETH
  • 漏洞合約名稱:`Etherstone`,含 `deposit()` 與 `withdraw()` 兩個函數
  • 測試框架:Foundry(使用 `TestAttack` 函數撰寫攻擊測試,`forge test` 通過驗證漏洞存在)
  • 防禦工具一:OpenZeppelin 函式庫,`nonReentrant` modifier
  • 防禦工具二:CEI 模式,將 `balances[msg.sender] = 0` 置於 `.call{value: amount}("")` 之前
  • 修復後測試結果:`withdraw()` 因 `balance == 0` 條件失敗而 revert,攻擊無效

結論

結論

提款函數務必遵循「先更新狀態、再轉移資產」的 CEI 順序,或加掛 `nonReentrant` 鎖,否則任何先轉帳後清帳的設計都是潛在的重入攻擊缺口。

完整解析

詳細

區塊鏈智能合約中的重入漏洞(Reentrancy Vulnerability)是 DeFi 生態中最經典也最危險的安全問題之一。其根本成因在於提款函數的執行順序錯誤:正確的設計應先從帳本扣除使用者餘額,再將資產發送出去;而存在漏洞的版本卻反其道而行,先呼叫 `.call()` 將 ETH 傳給呼叫者,等到轉帳完成後才清空餘額。這個時序上的破口,給了攻擊者可乘之機。

影片以一個名為 `Etherstone` 的合約為例說明攻擊流程。該合約的 `deposit()` 函數負責累積使用者存入的 ETH,`withdraw()` 則先確認餘額大於零,再以 `.call{value: balance}("")` 形式轉出全部餘額,最後才將餘額欄位歸零。攻擊者部署一個惡意合約,並在其 `receive()` 函數中植入再次呼叫 `withdraw()` 的邏輯。當受害者存入 10 ETH、攻擊者存入 1 ETH 後,攻擊者呼叫 `withdraw()`:合約先把 1 ETH 轉給攻擊合約,觸發 `receive()`,此時餘額尚未歸零,攻擊合約立刻再次呼叫 `withdraw()`,如此循環,直到抽乾合約資金池。最終 Foundry 測試顯示攻擊合約成功持有 11 ETH,而僅投入了 1 ETH,完整驗證漏洞的嚴重性。

針對此漏洞,影片提供了兩種開發層面的防禦策略。第一種是引入 OpenZeppelin 函式庫,在 `withdraw()` 加上 `nonReentrant` modifier。該 modifier 使用互斥鎖(mutex)機制,在函數尚未執行完畢時拒絕任何重入呼叫,適合邏輯複雜、呼叫鏈較深的合約。第二種方法更為輕量,即遵循「Checks-Effects-Interactions(CEI)」模式:在發送 ETH 之前就先將 `balances[msg.sender]` 清零。如此一來,攻擊者第二次進入 `withdraw()` 時,餘額已為零,條件檢查失敗,函數直接 revert。修改後重新執行 Foundry 測試,結果顯示提款函數因 `balance == 0` 而 revert,攻擊流程被完全阻斷。

關鍵時刻

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