零时科技分析 RWT 遭攻击细节:漏洞致约 11.8 万美元损失

零时科技分析 RWT 遭攻击细节:漏洞致约 11.8 万美元损失

N
News Editor
2026-07-24 03:33:23
零时科技披露,BNB Smart Chain 上的 RWT 项目于 2026 年 7 月 19 日遭遇攻击,损失约 118,000 美元。攻击者先从 Lista DAO: Moolah 闪电贷借入 1,000,000 USDT,再通过 RWT 交易合约的 buy 与 sell 流程,触发特权合约从 PancakeSwap V2 的 RWT/USDT Pair 额外销毁 RWT,并调用 sync() 重写储备,持续抬高池内价格。分析指出,问题出在项目方将 burn 权限授予可被普通用户调用的公开交易合约。

BNB Smart Chain 上的 RWT 攻击造成约 11.8 万美元损失

零时科技披露,2026 年 7 月 19 日,其监控到 BNB Smart Chain 上一起针对 RWT 项目的攻击事件。本次攻击造成约 118,000 美元损失。

零时科技分析 RWT 遭攻击细节:漏洞致约 11.8 万美元损失 2

攻击交易为:https://bscscan.com/tx/0x22300140e7c44899c2602382a6e7a4a34a70f47f9736721744bc6434c07171dc

攻击者地址为:https://bscscan.com/address/0x84dd3a5d4de44c8ad0ce032beab8bc3f01d1dcf7

攻击合约地址为:https://bscscan.com/address/0x7ed953ff42509568f620aa340a33a9373447f4ce

被攻击的 RWT/USDT Pair 地址为:https://bscscan.com/address/0xc1c2ef25372f12ce18d35044446064b720c4aa27

攻击路径:先借入 100 万 USDT,再买入 RWT

根据零时科技的分析,攻击者首先利用 flashloan 从 Lista DAO: Moolah 贷款 1,000,000 USDT。

随后,攻击者调用 RWT 项目交易合约 0x8812bB5fB89D69D35Ac84D2C37B55769395b9f90 的 buy 函数,使用 93,612.061013797236332471 USDT 买入 RWT。

其中,14,041.809152069585449870 USDT 被作为手续费转出,实际进入 RWT/USDT Pair 的 USDT 数量为 79,570.251861727650882601,即 93,612.061013797236332471 减去 14,041.809152069585449870。

攻击者最终获得 36,718,733.010848105074881558 RWT。

接着,攻击者继续向 RWT/USDT Pair 转入 238,910.179775312595883090 USDT,并从 Pair 中转出约 36,718,733 RWT。零时科技指出,经过这一步操作,Pair 中的 USDT 数量增加,RWT 数量减少,RWT 在 PancakeSwap V2 中的价格被拉高。

卖出后触发额外销毁,Pair 中 RWT 储备被压缩

在价格被抬高后,攻击者通过 RWT 项目交易合约的 sell 函数卖出 35,984,358.350631142973383908 RWT,并从 Pair 中获得 235,902.720974496353639994 USDT。

按零时科技的说法,正常情况下,攻击者完成买入和卖出后,需要承担交易手续费和 AMM 滑点,难以直接获利。

但交易日志显示,在攻击者卖出 RWT 后,RWT 合约又从 RWT/USDT Pair 中额外销毁了 71,968,716.701262285946767816 RWT。

该数量与攻击者卖出数量存在精确对应关系:

  • 卖出数量:35,984,358.350631142973383908 RWT
  • Pair 中被销毁数量:71,968,716.701262285946767816 RWT
  • 对应关系:35,984,358.350631142973383908 × 2 = 71,968,716.701262285946767816

也就是说,RWT 项目交易合约在执行 sell 后,会根据用户卖出的 RWT 数量,从 PancakeSwap Pair 中额外销毁对应数量的 RWT,且销毁量约为卖出量的 2 倍。

零时科技分析 RWT 遭攻击细节:漏洞致约 11.8 万美元损失 3

权限来源并非攻击者直接拿到 Owner,而是公开交易合约具备高权限

零时科技展示的 RWT 代币合约 burn 函数如下:

function burn(address _From, uint256 _amount) external onlyOwner { _burn(_From, _amount);}

这一函数允许具备权限的地址指定任意 _From 地址,并从该地址中销毁 RWT。按文中的解释,这意味着有权限的地址可以直接执行:

RWT.burn(pancakeSwapPair, amount);

从而直接销毁 PancakeSwap Pair 中的 RWT。

RWT 合约中的 onlyOwner 权限判断为:

mapping(address => bool) internal role;modifier onlyOwner() { require( hasRole(_msgSender()), "Ownable: caller is not the owner" ); _;}

零时科技指出,这里的 onlyOwner 并不是只允许 owner() 地址调用,而是检查 role[msg.sender] == true。因此,任何被项目方设置为 role = true 的地址,都可以调用 RWT 的 burn、mint 和 setRole 等高权限函数。

文中称,RWT 项目方将交易合约 0x8812bB5fB89D69D35Ac84D2C37B55769395b9f90 设置为了有权限的地址,而该交易合约的 buy 和 sell 函数又可以被普通用户调用。攻击者虽然不能直接调用 RWT 的 burn 函数,但可以通过交易合约的 sell 函数,间接触发交易合约使用其权限销毁 Pair 中的 RWT。

零时科技给出的核心调用关系如下:

攻击者 → 调用公开的 sell 函数 → RWT 特权交易合约 → RWT.burn(pair, amount)

运行逻辑还原:sell 后 burn(pair, amount*2),再调用 sync()

零时科技表示,RWT 交易合约 0x8812...9f90 没有公开完整源码。通过对合约运行时字节码、函数选择器、交易日志和事件参数的分析,可以还原其关键逻辑大致如下:

function sell(uint256 amount, uint256 minOut) external { // 从用户处收取并卖出 RWT _sellRWT(amount, minOut); // 从 PancakeSwap Pair 中销毁 RWT uint256 burnAmount = amount * 2; RWT.burn(pancakePair, burnAmount); // 将销毁后的余额写入 Pair 储备 IPancakePair(pancakePair).sync();}

当交易合约从 Pair 中销毁 RWT 后,Pair 的实际 RWT 余额减少,但 USDT 余额没有按相同比例减少。随后合约调用 sync(),PancakeSwap V2 Pair 会将当前余额重新写入储备:

零时科技分析 RWT 遭攻击细节:漏洞致约 11.8 万美元损失 4

reserveRWT = RWT.balanceOf(pair);reserveUSDT = USDT.balanceOf(pair);

PancakeSwap V2 中的 RWT 价格可简单表示为:

RWT Price = USDT Reserve / RWT Reserve

因此,当 RWT 储备被大量销毁,而 USDT 储备基本不变时,RWT 的池内价格会被快速拉高。文中的逻辑为:

  • RWT Reserve 减少
  • USDT Reserve 基本不变
  • RWT Price 上升

攻击者正是利用这一机制,多次调用交易合约进行卖出。每次卖出后,交易合约都会从 Pair 中销毁约为卖出数量 2 倍的 RWT,然后调用 sync() 更新储备。随着 Pair 中的 RWT 储备越来越少,RWT 的价格越来越高,攻击者后续只需要卖出少量 RWT,就可以继续从 Pair 中兑换出 USDT。

零时科技将该过程概括为:

使用 USDT 买入 RWT → 卖出部分 RWT → 交易合约从 Pair 中销毁 RWT → 调用 sync() 更新储备 → RWT 价格被拉高 → 再次卖出 RWT 获取 USDT

项目方 6 分钟后撤销交易合约权限

零时科技称,攻击发生后约 6 分钟,RWT 项目方连续发送两笔 setRole 交易,将交易合约 0x8812...9f90 的权限设置为 false。

相关交易为:

https://bscscan.com/tx/0xa7220206910794024452293b80cbbb77389f847c12c53b81528e628b4c3d9d73

https://bscscan.com/tx/0x18f2b31770c152242d85cfbe711f28d5ae985a0f4950a17a7e9558712a9d082d

两笔交易参数均为:

setRole( 0x8812bb5fb89d69d35ac84d2c37b55769395b9f90, false);

零时科技认为,这一操作进一步证明,攻击过程中调用 burn 的权限来自 RWT 项目的交易合约,而不是攻击者直接获取了 RWT Owner 权限。

零时科技分析 RWT 遭攻击细节:漏洞致约 11.8 万美元损失 5

攻击者归还闪电贷后留下约 11.8 万 USDT

在攻击结束后,攻击者向 Moolah 归还 1,000,000 USDT 的 flashloan,并将剩余的 118,069.281571404198479027 USDT 转入攻击者地址。

零时科技据此判断,攻击者最终获利约 118,000 USDT。

漏洞代码分析:两个合约层面的安全问题

零时科技将本次攻击归结为两个主要的合约层面问题。

第一个问题是,RWT 的 burn 函数可以销毁任意地址中的 RWT,且没有限制 _From 不能为 PancakeSwap Pair。因此,有权限的合约可以直接修改 Pair 中的 RWT 余额。

第二个问题是,项目方将这一权限授予了公开交易合约,同时该交易合约在 sell 流程中根据用户输入计算 Pair 销毁量。攻击者因此可以控制以下几个关键变量:

  • 卖出 RWT 的数量
  • 从 Pair 中销毁 RWT 的数量
  • Pair 更新后的 RWT 储备
  • RWT 的池内价格

文章强调,虽然 RWT 的 burn 函数存在 onlyOwner 修饰器,但高权限交易合约的公开 sell 函数没有对调用者进行限制,使得攻击者可以间接使用该合约的 burn 权限。

因此,零时科技认为,这次漏洞并不是简单的“burn 函数缺少权限控制”,而是项目方将高权限的任意地址销毁能力授予公开业务合约,业务合约又允许外部用户通过可控参数销毁 AMM Pair 中的资产,并调用 sync() 操纵储备。

零时科技给出的结论与建议

零时科技在总结中表示,本次漏洞的成因是 RWT 项目方设计了一个可以从 PancakeSwap Pair 中直接销毁 RWT 的交易机制,并将 RWT 的 burn 权限授予了公开交易合约。

攻击者先利用 flashloan 借入 1,000,000 USDT,买入大量 RWT 并改变 RWT/USDT Pair 的储备比例。随后,攻击者调用交易合约的 sell 函数卖出 RWT。交易合约在卖出完成后,从 Pair 中额外销毁约为卖出数量 2 倍的 RWT,并调用 sync() 更新 Pair 储备,导致 RWT 的池内价格不断升高。

攻击者重复执行这一过程,逐步减少 Pair 中的 RWT 储备并从池中提取 USDT。最后归还 flashloan 后,获利约 118,000 USDT。

针对风险控制,零时科技建议项目方不要允许任何合约从 AMM Pair 地址中执行 burn 或强制转账操作。代币销毁应只针对协议自身实际持有的代币,不能直接修改 LP 地址中的资产。

同时,项目方应将 mint、burn、黑名单管理、交易开关和角色管理等权限进行拆分,避免单个外部业务合约同时拥有多项管理员权限。

在设计代币销毁、自动加池、自动回购和价格计算逻辑时,零时科技还提示,需要重点检查 burn(pair)、transferFrom(pair)、skim() 和 sync() 等操作的组合风险。合约上线前,应通过多个审计团队进行交叉审计,并在主网分叉环境中进行闪电贷和经济模型攻击测试。

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

本文最初由 Bit.Fan 发布。 欲了解更多加密货币新闻与市场洞察,请访问 www.bit.fan.
1300

免责声明:

本平台展示的市场信息、项目资料与第三方内容仅用于行业信息分享,不构成任何形式的投资建议或收益承诺。

加密资产交易具有较高风险,用户应充分评估自身风险承受能力并独立作出决策,相关盈亏及法律责任由用户自行承担。