零时科技 || RWT 攻击事件分析
背景介绍2026 年 7 月 19 日我们监控到 BNB Smart Chain 上的一起攻击事件被攻击的项目为 RWT。攻击交易为https://bscscan.com/tx/0x22300140e7c44899c2602382a6e7a4a34a70f47f9736721744bc6434c07171dc本次攻击共造成约 118,000 USD 的损失。攻击者地址https://bscscan.com/address/0x84dd3a5d4de44c8ad0ce032beab8bc3f01d1dcf7攻击合约地址https://bscscan.com/address/0x7ed被攻击的 RWT/USDT Pair 地址https://bscscan.com/address/0xc1c2ef25372f12ce18d35044446064b720c4aa27攻击及事件分析首先攻击者利用 flashloan 从 Lista DAO: Moolah 中贷款 1,000,000 USD随后攻击者调用 RWT 项目交易合约 0x8812bB5fB89D69D35Ac84D2C37B55769395b9f90 的 buy 函数使用 93,612.061013797236332471 USDT 买入 RWT。其中 14,041.809152069585449870 USDT 被作为手续费转出实际进入 RWT/USDT Pair 的数量为93,612.061013797236332471 - 14,041.809152069585449870 79,570.251861727650882601 USDT攻击者最终获得36,718,733.010848105074881558 RWT接着攻击者继续向 RWT/USDT Pair 转入 238,910.179775312595883090 USDT 并从 Pair 中转出约 36,718,733 RWT 。通过上述操作Pair 中的 USDT 数量增加 RWT 数量减少导致 RWT 在 PancakeSwap V2 中的价格被拉高。随后攻击者通过 RWT 项目交易合约的 sell 函数卖出35,984,358.350631142973383908 RWT并从 Pair 中获得235,902.720974496353639994 USDT正常情况下攻击者完成买入和卖出后需要承担交易手续费和 AMM 滑点很难直接获利。但我们继续查看交易日志可以发现在攻击者卖出 RWT 后RWT 合约又从 RWT/USDT Pair 中额外销毁了71,968,716.701262285946767816 RWT我们将攻击者卖出的 RWT 数量和从 Pair 中销毁的 RWT 数量进行比较35,984,358.350631142973383908 × 2 71,968,716.701262285946767816可以看到从 Pair 中销毁的 RWT 数量正好是攻击者卖出数量的 2 倍。这说明 RWT 项目交易合约在执行 sell 后还会根据用户卖出的 RWT 数量从 PancakeSwap Pair 中额外销毁 RWT。我们看一下 RWT 代币合约的 burn 函数function burn(address _From, uint256 _amount) external onlyOwner { _burn(_From, _amount); }可以看到 burn 函数允许具有权限的地址指定任意 _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)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 会将当前余额重新写入储备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 数量都是攻击者卖出数量的约 2 倍。随着 Pair 中的 RWT 储备越来越少RWT 的价格越来越高。攻击者后续只需要卖出少量 RWT就可以继续从 Pair 中兑换出 USDT。攻击过程如下使用 USDT 买入 RWT ↓ 卖出部分 RWT ↓ 交易合约从 Pair 中销毁 RWT ↓ 调用 sync() 更新储备 ↓ RWT 价格被拉高 ↓ 再次卖出 RWT 获取 USDT攻击发生后约 6 分钟RWT 项目方连续发送两笔 setRole 交易将交易合约 0x8812...9f90 的权限设置为 false 。相关交易为https://bscscan.com/tx/0xa7220206910794024452293b80cbbb77389f847c12c53b81528e628b4c3d9d73https://bscscan.com/tx/0x18f2b31770c152242d85cfbe711f28d5ae985a0f4950a17a7e9558712a9d082d交易参数均为setRole( 0x8812bb5fb89d69d35ac84d2c37b55769395b9f90, false );这一操作可以进一步证明攻击过程中调用 burn 的权限来自 RWT 项目的交易合约而不是攻击者直接获取了 RWT Owner 权限。最后攻击者向 Moolah 归还 1,000,000 USDT 的 flashloan 并将剩余的118,069.281571404198479027 USDT转入攻击者地址。攻击者最终获利约 118,000 USDT 。漏洞代码分析本次攻击主要涉及两个合约层面的安全问题。第一个问题是 RWT 的 burn 函数可以销毁任意地址中的 RWTfunction burn(address _From, uint256 _amount) external onlyOwner { _burn(_From, _amount); }这里没有限制 _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() 等操作的组合风险。合约上线前应通过多个审计团队进行交叉审计并在主网分叉环境中进行闪电贷和经济模型攻击测试。

相关新闻

无标题内容管理系统:智能组织与检索技术解析

无标题内容管理系统:智能组织与检索技术解析

1. 项目概述作为一名从业多年的技术博主,我经常遇到这样的情况:手头积累了大量未命名的项目文件、代码片段或创意点子,它们就像散落的珍珠,缺乏有效的组织和管理。今天我想分享一套经过实战检验的无标题内容管理系统,这…

2026/7/24 1:19:52 阅读更多 →
Java中使用ScheduledExecutorService定时拉取外卖霸王餐活动数据的实践

Java中使用ScheduledExecutorService定时拉取外卖霸王餐活动数据的实践

Java中使用ScheduledExecutorService定时拉取外卖霸王餐活动数据的实践 在构建外卖CPS(Cost Per Sale)返利系统或“霸王餐”活动聚合平台时,数据的时效性是核心竞争力。用户期望看到的永远是最新的活动列表、最准确的佣金比例和最实时的商家状…

2026/7/24 1:19:52 阅读更多 →
TAS2521寄存器映射实战:从电源管理到miniDSP的嵌入式音频驱动开发

TAS2521寄存器映射实战:从电源管理到miniDSP的嵌入式音频驱动开发

1. 项目概述与核心价值在嵌入式音频系统开发中,我们常常会接触到像德州仪器TAS2521这样的高性能音频编解码器。这类芯片功能强大,集成了DAC、耳机放大器、扬声器驱动器以及可编程的miniDSP,但随之而来的就是极其复杂的硬件配置。很多刚入行的…

2026/7/24 1:19:52 阅读更多 →

最新新闻

MSPM0低功耗子系统(LFSS)架构解析与嵌入式安全设计实战

MSPM0低功耗子系统(LFSS)架构解析与嵌入式安全设计实战

1. 低功耗子系统(LFSS)在嵌入式设计中的核心价值在嵌入式系统开发中,尤其是在电池供电或对可靠性有严苛要求的场景下,如何让系统在“休眠”或“主电源失效”时依然保持关键功能,是一个绕不开的难题。想象一下&#xff…

2026/7/24 1:25:53 阅读更多 →
Unity3D超低延迟直播播放器开发:RTSP/RTMP流媒体与跨平台硬件解码实战

Unity3D超低延迟直播播放器开发:RTSP/RTMP流媒体与跨平台硬件解码实战

1. 项目概述:为什么要在Unity里做直播播放器?如果你正在开发一款需要实时视频流的Unity应用,比如一个监控大屏、一个虚拟演播室、一个VR看房或者一个互动直播游戏,你大概率会遇到一个核心问题:如何把摄像头、NVR或者直…

2026/7/24 1:25:53 阅读更多 →
LLM Gateway 选型翻车实录:为什么 Spring Cloud Gateway 在多模型切换时崩了?

LLM Gateway 选型翻车实录:为什么 Spring Cloud Gateway 在多模型切换时崩了?

Java AI 网关选型指南:从熔断事故到高可用架构 上周压测公司新上线的 AI 中台时,Spring Cloud Gateway 在同时路由 3 个大模型请求时直接触发了熔断。这个事故让我们重新审视了 Java AI 网关的选型标准——路由性能只是最基础的及格线。本文将详细记录故…

2026/7/24 1:25:53 阅读更多 →
低成本解决LLM记忆断片:SimpleMem技术解析与实践

低成本解决LLM记忆断片:SimpleMem技术解析与实践

1. 项目概述:为什么我们需要解决LLM的"记忆断片"问题?在大型语言模型(LLM)应用过程中,最令人头疼的问题莫过于"对话失忆"——模型在长对话中会突然忘记之前的上下文,就像人类突然失忆一…

2026/7/24 1:25:53 阅读更多 →
职场能力突围:学历与能力的错位与应对策略

职场能力突围:学历与能力的错位与应对策略

1. 职场现象观察:学历与能力的错位困境上周和几个老同事聚餐时,听到一个特别有意思的案例:某互联网公司一位大专学历的95后,凭借出色的项目交付能力月薪涨到近3万,结果团队里211毕业的领导处处给他穿小鞋。这种情况在技…

2026/7/24 1:25:53 阅读更多 →
GPU故障排查三步法,送修前先做完这几步判断

GPU故障排查三步法,送修前先做完这几步判断

【文章概述】本文基于GPU运维一线经验,总结了硬件故障排查的三步判断逻辑——交叉验证、触发条件分析、外部干扰排除。适合服务器运维工程师、数据中心FAE、AI平台负责人参考。上篇已经梳理了GPU最常见的四类故障现象与排查方向:系统不识别、ECC报错、频…

2026/7/24 1:24:53 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻