20250620 - Bonding 攻擊事件: 項目方不創建的池子由我攻擊者來創建
背景信息
本次攻擊涉及 Bonding 和 LBM 兩種代幣,用戶可以通過 Bonding.buy() 用 USDC 購買 Bonding,當 Bonding 合約中的 USDC 累積超過一定閾值時會觸發回購機制將 USDC 兌換成 LBM,隨后向 [Bonding, LBM] pool 添加流動性。
造成本次攻擊的原因是添加流動性所采用的 pool 并未提前創建(代碼邏輯是第一次觸發時不存在則創建),攻擊者先創建了比例失衡的惡意 [Bonding, LBM] pool。然后通過閃電貸大量的 USDC 來購買 Bonding 觸發回購機制,當協議將大量的 LBM 添加到 pool 中后,攻擊者將手上的 Bonding 兌換成 USDC 完成獲利(Bonding -> LBM -> WETH -> USDC 完成獲利)。損失金額 4884 USDC。
攻擊交易:https://app.blocksec.com/explorer/tx/base/0x9d724db325de76b3d88368ed9948acd85e6b67b464eb0aac9f5d2bc3fdebf190
漏洞合約:https://basescan.org/address/0xffa1ed9c565a4e635543123b29889e96bcafa184#code
Trace 分析

-
閃電貸獲得 100000 USDC
-
攻擊者創建了Bonding 的價格極高的
[Bonding, LBM] pool -
攻擊者通過
Bonding.buy()用 11949 USDC 換取 1194.9 Bonding -
觸發 Bonding 的回購機制
-
用 17100 USDC 換取 332874 LBM
-
將 332874 LBM 和 0 Bonding 作為流動性添加到攻擊者創建的 pool 中

-
攻擊者在惡意構造的 pool 中用 0.01 Bonding 換出 332874 LBM,隨后按照 Bonding -> LBM -> WETH -> USDC 這個路徑獲得 16833 USDC
-
歸還閃電貸 100000 USDC,獲利 4884 USDC。
代碼分析
Bonding 和 LBM 組成一個雙代幣協議,LBM 作為 Bonding 的 feeToken。本次漏洞產生的原因主要在 Bonding 代幣中。攻擊者通過購入大量的 Bonding 代幣觸發回購機制。
https://vscode.blockscan.com/8453/0x8D2Eb55F429aC689134ee547C74720BC41219F39

在 _finalizeSale() 函數中,首先將 USDC 換成 LBM

隨后檢查需要添加流動性的 [Bonding, LBM] pool ,通過注釋可以看出,項目方是故意先不部署池子的,等到實際觸發回購機制的時候再創建,這就給了攻擊者可乘之機。

由于攻擊者已經創建好了 [Bonding, LBM] pool ,所以這里 pool 地址為非零地址。最終使得協議按照攻擊者設置的 LBM 價格極高的比例向 pool 添加流動性,攻擊者可以用極少的 Bonding 套取大量的 LBM,轉而出售成 USDC 完成獲利。


浙公網安備 33010602011771號