【漏洞分析】20240507-SATURN:当闪电贷遇上有缺陷的通缩机制

背景信息

2024 年 5 月 6 日,SATURN 代币遭受价格操控攻击,损失 15 BNB。攻击发生的原因是由于 SATURN 代币的代币通缩机制设计不合理,使得攻击者可以通过燃烧池子中的 SATURN 代币来操控价格完成获利。

本次攻击由两笔交易构成

项目分析

SATURN 是一个包含代币发行,收税,锁定和通缩等机制的代币协议。 SATURN 代币的愿景是通过出售时的通缩机制来销毁部分代币,从而维持价格不断上涨。可惜事与愿违,正是这个精心设计的通缩机制导致了攻击的发生。

简单介绍一下这个代币中和本次攻击事件相关的特殊机制:

  1. fee on transfer:如果 from 和 to 都不在 _excludedFees 中,则收取部分 fee。
  2. burn:如果 to 地址为 pair,则触发 burn 机制。

Trace 分析

Trace1

攻击合约用 0.015 BNB 换取 99000 Saturn,重复 10 次。

Trace2

  1. 在 1.1 步骤攻击者通过闪电贷借出 3300 BNB,在 1.2 步骤归还闪电贷。
  2. 攻击者用 3204 BNB 换取 101030461 Saturn,发送到 0xc8ce 地址(owner)。
  3. 攻击者出售 228832 Saturn 换取 3220 BNB,完成获利。

0xc8ce 地址为 Saturn 代币的 owner 地址,并且记录在 _excludedFees 中,所以在本次 swap 操作中没有扣除 fee。

攻击者用 3204 BNB 换取 101030461 Saturn,pair 中剩余 499999 Saturn。

随后攻击者出售 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

transfer 11441 Saturn as fee

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

在 burn 掉了 pair 中大量的 Saturn 后,攻击者用 217391 Saturn 换出 3220 BNB,完成获利。

最后就是归还 3301 BNB 闪电贷,转移 14 BNB 获利资金

漏洞分析

Saturn 代币的问题出现在通缩机制是设计上。其本意是在用户向 pair 出售 Saturn 时,记录 pair 持有的 Saturn 数量。然后 burn 掉用户出售数量 * 230% 的 Saturn 代币进行通缩,以保持 Saturn 的价格。

攻击者通过闪电贷买入大量的 Saturn 代币(由于是买入操作,此时并不会记录 pair 持有的 Saturn 数量),使得 pair 中的 Saturn 数量较少。再通过出售在准备交易中买入的 Saturn,使其满足[出售金额 * 燃烧系数 = pair 余额],燃烧掉 pair 中大部分的 Saturn。

通缩机制在设计时没有考虑到闪电贷对 pair 余额的影响,以及出售数量与 pair 余额量级接近的情况。

后记

之前已经分析完了,有优先级更高的事情,所以拖到现在才把这篇播客写出来。这种代币的攻击事件相对DeFi来说会较为简单点,后续出于对自己能力的锻炼,可能会更偏重去分析一下DeFi类型的攻击。这可能会是个比较漫长的过程,我需要去了解去学习大量的DeFi协议,融会贯通。但是千里之行总得迈出第一步吧,以后关注的内容可能更多放在自身,不去过计较一些短期的得失,尝试寻找一种内源性的动力。

相关推荐
华万通信king5 天前
智能合约与智能合同:概念辨析与技术实现差异
智能合约·海外·docusign
白帽阿尔法6 天前
一篇文章认识数字人民币和区块链技术
去中心化·区块链·智能合约·信任链·分布式账本
木西11 天前
ERC-7579模块化账户标准:智能合约钱包的"乐高"插拔方案
web3·智能合约·solidity
BlockChain88814 天前
以太坊开发入门:从 0 到 1 搭建第一个 DApp
区块链·智能合约
ybdesire15 天前
间接提示词注入真实样例鉴赏
网络安全·语言模型·漏洞·漏洞分析
麦麦大数据16 天前
基于以太坊区块链+Spring Boot+Solidity智能合约的投票系统设计与实现
spring boot·后端·区块链·智能合约·投票系统
程序员李程峰18 天前
基础知识④链和代币之间的关系
web3·去中心化·区块链·智能合约·同态加密·共识算法·信任链
程序员李程峰18 天前
基础知识⑤ERC-20、BEP-20 和TRC-20 这三种流行的加密代币标准
web3·去中心化·区块链·智能合约·同态加密·共识算法·信任链
程序员李程峰18 天前
基础知识——各种钱包之间的联系与区别
web3·去中心化·区块链·智能合约·同态加密·零知识证明·信任链
程序员李程峰18 天前
基础知识①区块链钱包基础
去中心化·区块链·智能合约·同态加密·共识算法·信任链·分布式账本