重入不只帶來漏洞:Uniswap、Safe 的設計用途與跨協定風險
Wait! Reentracies are good now?
場次摘要
重入是合約先前的呼叫尚未結束,就再次被呼叫進入;DAO 攻擊讓它長期與漏洞連結,但也能成為刻意採用的設計。Dominic Brütsch 的以太坊抽樣顯示,含內部呼叫的交易中,涉及重入的比例從 2017 年約 5%,升至 2024 年中約 1/3。這反映使用情形,而非漏洞比例。 Uniswap V4 透過重入串接多項操作,最後才結算;Safe 則讓簽署者設定變更通過既有授權流程。不過,重入也可能讓其他協定讀到暫時失真的資料。講者以 Curve 的唯讀重入案例說明:即使原合約正常完成,借貸協定仍可能高估抵押品、借出過多代幣。因此,安全檢查不只要看最終結果,也要確認執行途中哪些函式能被呼叫、外部能讀到什麼,以及哪些條件必須成立。
值得記下的 5 件事
- [0:56]
鏈上重入使用增加,不等於漏洞增加
講者的抽樣顯示,含內部呼叫的交易中,涉及重入的比例從 2017 年約 5%,升至去中心化金融熱潮前後約 20%,2024 年中約達 1/3,此後大致穩定。這些數字描述重入的使用情形,而非攻擊或漏洞發生率。
- [2:35]
Uniswap V4 透過重入,串接多項操作後再結算
資金池管理合約回呼路由器後,路由器再進入管理合約執行操作。講者以 2 次交換為例:第 1 筆產生的包裝 ETH 額度供第 2 筆使用,包裝 ETH 留在管理合約內,路由器最後支付 USDC 並取得 DAI。
- [3:25]
Safe 以既有授權流程,控管透過重入執行的設定變更
已核准的交易可以變更簽署者,但錢包會先確認交易已由正確的簽署者集合簽署,再透過重入呼叫自己、執行更新。這讓設定變更沿用錢包的一般授權函式;安全邊界在於授權是否先成立,而非是否出現自我呼叫。
- [4:13]
唯讀重入也可能讓讀取資料的第三方蒙受損失
講者以 Curve 揭露案例說明,提款期間暫時不一致的資金池狀態會使虛擬價格偏高;借貸協定若據此高估抵押品,就可能讓借款人領走過多代幣。讀取函式未修改 Curve 狀態,Curve 也正常完成,但第三方仍會受損。
- [5:02]
重入設計必須檢查執行途中可被外部觀察的狀態
開發者應逐一確認:哪些函式能被呼叫、其他協定能讀到什麼,以及交易成功結束前必須維持哪些條件。檢查範圍不只包括自身合約最終是否正確,也要涵蓋外部協定拿暫時不一致的狀態來估值或決策的後果。
更多來自 DEVCON 8
Arrow 的硬體 DAO 實驗:AI 協作、在地製造與責任分工
A DAO Shipped an Aircraft: What It Takes to Coordinate Atoms with Tokens
Thomas Garrison
Kohaku:以 SDK 將隱私與安全功能帶入以太坊錢包
Kohaku : privacy for everyone, by default
Nico、Vitalik
私有狀態與公開網路:區塊鏈隱私的去中心化取捨
Private State, Public Network: The Tradeoffs Behind Privacy
Zachary Williamson