【漏洞分析】20240507-SATURN:當閃電貸遇上有缺陷的通縮機制

ACai_sec發表於2024-09-28

背景資訊

2024 年 5 月 6 日,SATURN 代幣遭受價格操控攻擊,損失 15 BNB。攻擊發生的原因是由於 SATURN 代幣的代幣通縮機制設計不合理,使得攻擊者可以透過燃燒池子中的 SATURN 代幣來操控價格完成獲利。

  • 專案社媒:https://x.com/Saturn_POM
  • 社媒告警:https://twitter.com/ChainAegis/status/1787667253435195841
  • 攻擊合約:https://bscscan.com/address/0xfcecdbc62dee7233e1c831d06653b5bea7845fcc

本次攻擊由兩筆交易構成

  • 準備交易:https://app.blocksec.com/explorer/tx/bsc/0xa14378822d85cd6d03e6dff1c6a25e609792d7e9588c6481d7492e82848224d7
  • 攻擊交易:https://app.blocksec.com/explorer/tx/bsc/0x948132f219c0a1adbffbee5d9dc63bec676dd69341a6eca23790632cb9475312

專案分析

SATURN 是一個包含代幣發行,收稅,鎖定和通縮等機制的代幣協議。 SATURN 代幣的願景是透過出售時的通縮機制來銷燬部分代幣,從而維持價格不斷上漲。可惜事與願違,正是這個精心設計的通縮機制導致了攻擊的發生。

image

簡單介紹一下這個代幣中和本次攻擊事件相關的特殊機制:

  1. fee on transfer:如果 from 和 to 都不在 _excludedFees 中,則收取部分 fee。
  2. burn:如果 to 地址為 pair,則觸發 burn 機制。

Trace 分析

Trace1

攻擊合約用 0.015 BNB 換取 99000 Saturn,重複 10 次。

image

Trace2

  1. 在 1.1 步驟攻擊者透過閃電貸借出 3300 BNB,在 1.2 步驟歸還閃電貸。
  2. 攻擊者用 3204 BNB 換取 101030461 Saturn,傳送到 0xc8ce 地址(owner)。
  3. 攻擊者出售 228832 Saturn 換取 3220 BNB,完成獲利。

image

0xc8ce 地址為 Saturn 代幣的 owner 地址,並且記錄在 _excludedFees 中,所以在本次 swap 操作中沒有扣除 fee。

image

攻擊者用 3204 BNB 換取 101030461 Saturn,pair 中剩餘 499999 Saturn。

image

隨後攻擊者出售 228832 Saturn 換取 3220 BNB,在這一步中觸發了收稅機制和通縮機制:

  1. transfer 11441 Saturn as fee
  2. burn 499999 Saturn
  3. sync pair [Saturn, BNB] → [21851e-18, 3220]
  4. pair receive 217391 Saturn

image

transfer 11441 Saturn as fee

image

burn 499999 Saturn

當攻擊者向 pair 出售 Saturn 時,會觸發其燃燒機制。

  1. _processBlockOverflow() 函式記錄當前 pair 合約的 Saturn 最大持有量 499999
  2. 計算 amountToBurn 的值,(228832 - 11441) * 230 / 100 = 499999
  3. autoLiquidityPairTokens() 函式 burn 499999 Saturn,pair 中剩餘 218521e-18 Saturn

image

在 burn 掉了 pair 中大量的 Saturn 後,攻擊者用 217391 Saturn 換出 3220 BNB,完成獲利。

image

最後就是歸還 3301 BNB 閃電貸,轉移 14 BNB 獲利資金

image

漏洞分析

Saturn 代幣的問題出現在通縮機制是設計上。其本意是在使用者向 pair 出售 Saturn 時,記錄 pair 持有的 Saturn 數量。然後 burn 掉使用者出售數量 * 230% 的 Saturn 代幣進行通縮,以保持 Saturn 的價格。

攻擊者透過閃電貸買入大量的 Saturn 代幣(由於是買入操作,此時並不會記錄 pair 持有的 Saturn 數量),使得 pair 中的 Saturn 數量較少。再透過出售在準備交易中買入的 Saturn,使其滿足[出售金額 * 燃燒係數 = pair 餘額],燃燒掉 pair 中大部分的 Saturn。

通縮機制在設計時沒有考慮到閃電貸對 pair 餘額的影響,以及出售數量與 pair 餘額量級接近的情況。

後記

之前已經分析完了,有優先順序更高的事情,所以拖到現在才把這篇播客寫出來。這種代幣的攻擊事件相對DeFi來說會較為簡單點,後續出於對自己能力的鍛鍊,可能會更偏重去分析一下DeFi型別的攻擊。這可能會是個比較漫長的過程,我需要去了解去學習大量的DeFi協議,融會貫通。但是千里之行總得邁出第一步吧,以後關注的內容可能更多放在自身,不去過計較一些短期的得失,嘗試尋找一種內源性的動力。

相關文章