This DeFi Smart Contract Vulnerability Makes You Lose Everything Instantly
三句話摘要
首存者攻擊(Inflation Attack)—— 第一位存款者透過捐贈代幣來操縱份額價格,使後續存款者的資金變成零份額並被盜取。 整數四捨五入加上第一位存款者的絕對權力造成盜竊,只需虛擬份額偏移就能根本防止。 份額計算的整數四捨五入是漏洞根源。Vault使用「存款÷總份額÷總資產」的公式計算份額數,當除法結果小於1時會四捨五入到0。第一位存款者可以透過操縱這個公式來決定份額初始價格。
重點整理
重點- 1
份額計算的整數四捨五入是漏洞根源。Vault使用「存款÷總份額÷總資產」的公式計算份額數,當除法結果小於1時會四捨五入到0。第一位存款者可以透過操縱這個公式來決定份額初始價格。
- 2
Deposit和Donate的區別是攻擊的本質。Deposit會鑄造新份額並增加資產,但Donate(直接轉帳)只增加資產不鑄造份額,導致現有份額價值在不知不覺中上升,後續存款者因此獲得0份額。
- 3
虛擬份額偏移是業界標準防禦方案。在分子分母各加入固定的虛擬份額和資產(如1000虛擬份額+1虛擬資產),使第一位存款者無法獨佔價格決定權,捐贈操作也無法有效提高份額價格。
- 4
此漏洞已在多個真實vault中造成數百萬美元損失,被納入ERC-4626標準作為必須防禦的攻擊向量。
實用技巧與重點
乾貨- 攻擊步驟:(1)存入1 Wei獲得1份額 (2)捐贈100代幣 (3)受害者存入100代幣→四捨五入得0份額 (4)攻擊者用1份額贖回200代幣
- 虛擬份額參數:示例中1000虛擬份額 + 1虛擬資產
- 修復代碼:在deposit和redeem公式中的分子分母各加常數
- 測試驗證:在Sepolia測試網實際部署,交易可在Etherscan上查證
- 相關標準:ERC-4626 Vault Standard、OpenZeppelin實現
- 開發工具:Foundry框架測試
結論
結論“整數四捨五入加上第一位存款者的絕對權力造成盜竊,只需虛擬份額偏移就能根本防止。”
完整解析
詳細首存者攻擊利用的是代幣Vault中份額計算的數學漏洞。一個全新Vault在第一次接收存款時,份額與資產的比例尚未確定。按照標準公式,新份額數 = 存款金額 × 現有總份額 ÷ 現有總資產。當Vault剛啟動時資產為零,第一位存款者實際上可以決定份額初始價格——這是攻擊的突破口。
攻擊精妙之處在於區分了兩種送錢方式。正式的「存款」(Deposit)會鑄造份額給存款者;「捐贈」(Donate)則是直接轉帳到Vault,完全不鑄造份額。攻擊者首先以1 Wei的金額正式存款,獲得Vault唯一的一份額,成為100%所有者。隨後攻擊者直接轉帳100個代幣進入Vault——這步至關重要,因為它不走deposit邏輯,所以不會鑄造新份額。結果是那唯一份額現在代表了101個代幣的所有權,份額價格被人為拉高100倍。
當真正的受害者存入100個代幣時,Vault計算應發份額數:100 ÷ 101 ≈ 0.99份額。但份額必須是整數,系統四捨五入的結果是0份額。受害者的100個代幣確實進入了Vault,但他對這些資產沒有任何所有權。最後攻擊者用唯一的1份額贖回,獲得Vault內所有資產(201個代幣),淨利潤等於受害者的全部存款。這個漏洞已在多個真實DeFi協議中造成數百萬美元損失。
防禦方法稱為「虛擬份額偏移」,現已成為ERC-4626標準的標配。實現極其簡單:在所有份額公式中,人為地在分子分母各加入固定值(如1000虛擬份額和1虛擬資產)。這些數字永遠無法贖回,但改變了整個數學。攻擊者的1份額現在淹沒在1000多個虛擬份額中,不再能單獨決定價格;捐贈資產被分散到數千份額上,幾乎不影響份額價格;受害者的100代幣會計算成接近2000份額,贖回時能取回幾乎全部投入。幾個加號就徹底消滅了這個攻擊。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

