全球数字财富领导者

一起三明治交易机器人被攻击案例分析

2023-08-30 21:33:04
金色财经
金色财经
关注
0
0
获赞
粉丝
喜欢 0 0收藏举报
— 分享 —
摘要:​三明治机器人交易是区块链生态的日常交易中非常普遍的交易行为

三明治机器人交易是区块链生态的日常交易中非常普遍的交易行为。通过机器人进行交易不仅能极大地提高交易效率,还能尽快发现交易中存在的套利机会。

安全的机器人交易当然能达到上述目的,可不安全的机器人交易则有可能“偷鸡不成反蚀把米”。UTC时间8月29日06:04:39,BNB Chain链上便发生了一起三明治交易机器人被攻击的案例。

在该起案例中被攻击的交易机器人总共损失了207个WBNB、184900个BSC-USD和158900个BUSD,总资产价值约39万美元。

Fairyproof在第一时间对该事件进行了分析,发现攻击原因疑似为函数调用权限验证不充分。

通常在DEX(去中心化交易所)的链上交易中,为了节省gas,交易机器人会直接和交易对进行交互,而不通过DEX的Router合约。在基于Uniswap交易逻辑实现的DEX中,其交易对为先借后还,即调用交易者的特定回调函数(在本例中为pancakeV3SwapCallback)来通知交易者代币已经借出,需要交易者进行相关操作以归还借出的代币。

因此,在交易合约中必须验证回调函数pancakeV3SwapCallback的调用者(msg.sender)为真正的交易对和交易的发起者(tx.origin)权限。由于msg.sender的验证相对复杂(有时要考虑兼容Uniswap V2导致验证逻辑复杂),因此大多数合约只验证了tx.origin。

通常这么做是没有问题的。然而如果交易的某一步涉及到了恶意合约(在本例中就是攻击代币合约),则会发生风险,因为恶意合约调用pancakeV3SwapCallback时,tx.origin是可以通过权限验证的。

在本次事件中,正是由于未验证msg.sender是否是pancakeV3交易池,攻击代币直接调用了pancakeV3SwapCallback函数并伪造了交易参数,从而通过了tx.origin验证并窃取了资产。

在本次攻击中,三明治交易的相关哈希值如下:

m8kWEWTXgGuSrv4VwiRK4V6K8e6IODUng3aDwkbj.png

三明治机器人的合约地址如下:

- 执行合约(存在漏洞):0x5C936E535Bb591C979a7c8D36C48a6B31808Cef9

- 保险库合约:0x6E47b1123ddcF74E853516F934f5296cEb17D404

攻击代币的合约地址:0xb4864E14467B0D1a2AfB1F70b3f04D4aCd635e06

攻击代币交易对的地址:0xf61F401041a1AF03875B0E0d4AAa9749a57AEB93

攻击者的地址:0x30BA49Ca659B70d3723E3cA6ed96EA4EF0249893

本次攻击的主要内部交易流程如下图所示:

K73nGBVDoskYnCCFymRKWmCeXHVlvsCnqsXQAdVW.png

注,上图截取自:

https://explorer.phalcon.xyz/tx/bsc/0xf3705586e9b692dfeb53f983fe5595ee8c522552e38663bf38acf6e8c459de32

从上述流程中,我们可以分析攻击交易的具体步骤如下:

步骤1:攻击者部署攻击代币合约并进行相关准备工作,发起一笔购买交易暴露给三明治交易机器人。

步骤2:三明治机器人在FrontRun中调用PancakeV3交易池0xf61F401041a1AF03875B0E0d4AAa9749a57AEB93的swap函数来获取攻击代币。

步骤3:交易池0xf61F401041a1AF03875B0E0d4AAa9749a57AEB93将攻击代币转给三明治机器人(Uniswap系列的先借机制),这个过程会调用攻击代币的transfer函数。

步骤4:攻击代币的transfer函数调用三明治机器人的pancakeV3SwapCallback()函数,并附带伪造的请求参数。

步骤5:三明治机器人的pancakeV3SwapCallback()函数tx.origin验证通过,然后将资产从保险库中转移到攻击代币合约中(因为pancakeV3SwapCallback函数通常会将资产发送给msg.sender)。

步骤6:接下来是正常三明治交易流程。三明治机器人获利约25个USDC。

步骤7:攻击者提取代币合约中窃取的多种资产。所提取的窃取资产如下图所示,包括WBNB、BSC-USD和BUSD:

g2rizbEHdW1ej8SsEHNFkvXSW6suiYt5vHiNjXNz.png

注,上图截取自:

https://bscscan.com/address/0xb4864E14467B0D1a2AfB1F70b3f04D4aCd635e06#tokentxns

本次攻击警示合约开发者合约接口一定要验证调用者的权限,也就是验证msg.sender,仅仅验证tx.origin是不够的。

在类似的情景中,Fairyproof建议首先验证tx.origin,再验证下列两种情形之一:

1. 初始调用合约的外部接口进行交易时,将交易对地址写入合约,在回调函数中对此进行验证。交易执行完毕后再重置这个交易对参数。虽然这样的操作会额外消耗gas,但能极大提升安全性。

2. 在合约中固定存入Factory地址,在回调函数中计算相应的交易对地址并进行相应的验证。

除此以外,对合约进行审计是确保项目安全的必要步骤。本例中出现的安全事故是完全可以通过安全审计发现并避免的。

Fairyproof为区块链生态提供专业、完善、严谨的安全服务,涵盖合约审计、安全咨询、安全方案、实时监测、被盗资产追踪等。我们一直致力与生态中的合作伙伴共同携手,倾力打造安全的生态环境、保护用户的加密资产

来源:金色财经

敬告读者:本文为转载发布,不代表本网站赞同其观点和对其真实性负责。FX168财经仅提供信息发布平台,文章或有细微删改。
go