作者:昏鸦 & laker @知道创宇404区块链安全研究团队
日期:2021年3月6日

前言

PAID Network(PAID) 是一个生态系统DAPP,它利用区块链技术来交付DeFi支持的智能协议,从而使业务效率成倍提高。其允许用户创建自己的策略,以确保他们获得报酬。

2021年3月6日,据星球日报消息,其流动性代币出现问题,敦促用户紧急取出流动性质押。

据悉,本次攻击导致增发铸造近5970枚 PAID 代币,并已在uniswap上交换获利 2400枚 ETH(约 380 万美元),目前已经有受害者向攻击者寻求归还。

知道创宇404区块链安全研究团队在第一时间跟进并分析攻击细节,具体分析如下

分析

攻击者0x18738290AF1Aaf96f0AcfA945C9C31aB21cd65bE铸币获得 59,471,745.571 PAID,然后通过Uniswap换成了ETH获利。

铸币交易tx:0x4bb10927ea7afc2336033574b74ebd6f73ef35ac0db1bb96229627c9d77555a0

跟进代理合约,指向了地址0xB828E66eB5B41B9Ada9Aa42420a6542CD095B9C7,是一个未开源的合约

而在该合约的反编译伪代码中,能看到存在用于铸币的mint函数,并且会校验调用者身份必须是地址0x18738290af1aaf96f0acfa945c9c31ab21cd65be

这一校验就显得相当可疑了,如果不是项目方故意留后门,那可能就是项目方的管理地址账号私钥被盗而造成的。

那么接下来我们再来看看相关代理合约上是否有转移管理权限的事件记录

代理合约的升级事件日志如下:

恰好在攻击发生之前存在两次升级操作,这升级时的两个合约都是存在铸币函数的恶意合约,而发起这两笔交易的正是地址0x18738290AF1Aaf96f0AcfA945C9C31aB21cd65bE

接下来,找到代理合约的创建交易tx:0x722caf4a8ba43f06f2c26e41cf49b9200af9f0593444d0b81713c2292782d15b

在Input Data中找到构造函数的传入参数,解码如下:

// 构造函数
constructor(address _logic, address _admin, bytes memory _data)

// 传参
_logic = 0xd34bb7119a26f416a79889bacc9159b2bd2eb79e  // 逻辑合约地址
_admin = 0x7bb7580edb70170daf8a24afc6aaef93db720c24  // 代理合约管理员地址
_data = 0x8129fc1c  //函数签名,即 abi.encodeWithSignature("initialize()")

可以发现一开始的管理员是0x7bb7580edb70170daf8a24afc6aaef93db720c24,跟进地址,发现同样是个代理合约,不过在其事件记录中发现存在所有权的转移:

恰好是由PAID项目方的合约部署者0x6ba10437fD18899a4D920B60A9663b9a1D7a1120转给攻击者0x18738290AF1Aaf96f0AcfA945C9C31aB21cd65bE

总结

通过对整个事件的分析来看,此次攻击原因由于PAID项目方的合约部署者(0x6ba10437fD18899a4D920B60A9663b9a1D7a1120)出于不明原因(或有意或私钥被盗),将代理合约(0x7bb7580edb70170daf8a24afc6aaef93db720c24)的管理员转移至攻击者(0x18738290AF1Aaf96f0AcfA945C9C31aB21cd65bE)

随后攻击者(0x18738290AF1Aaf96f0AcfA945C9C31aB21cd65bE)通过upgrade升级了逻辑合约,添加了新的mint函数后进行铸币操作。

最后将得到的 2500000 / 59,471,745.571枚PAID代币在uniswap交易所进行交换,获利2,040 枚ETH,同时该账户剩余大量PAID代币。

建议

目前,该攻击者地址内仍剩余大量PAID代币,建议用户立即对质押进行回撤,防止进一步的损失。


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1496/