8 月 18 日,Exactly protocol 遭遇黑客攻击,攻击者已获利约 1204 万美元。SharkTeam 对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。
一、 事件分析
攻击者地址:
0x3747dbbcb5c07786a4c59883e473a2e38f571af9
0x417179df13ba3ed138b0a58eaa0c3813430a20e0
0xe4f34a72d7c18b6f666d6ca53fbc3790bc9da042
攻击合约:
0x6dd61c69415c8ecab3fefd80d079435ead1a5b4d
被攻击合约:
0x675d410dcf6f343219aae8d1dde0bfab46f52106
攻击交易:
0x3d6367de5c191204b44b8a5cf975f257472087a9aadc59b5d744ffdef33a520e
0x1526acfb7062090bd5fed1b3821d1691c87f6c4fb294f56b5b921f0edf0cfad6
0xe8999fb57684856d637504f1f0082b69a3f7b34dd4e7597bea376c9466813585
攻击流程:
(1)攻击者(0x417179df)先通过攻击合约(0x6dd61c69)创建了多个恶意市场代币合约和多个 uniswapPool 合约。
(2)随后调用被攻击合约(0x675d410d)的 leverage 函数并传入一个恶意市场代币地址。
(3)在 leverage 函数中通过 deposit 函数到 pool 合约中添加 USDC 和恶意市场代币的流动性并重入到被攻击合约(0x675d410d)的 crossDeleverage 函数
(4)在 crossDeleverage 函数中被攻击合约(0x675d410d)会使用 USDC 到 pool 合约中兑换恶意市场代币。
(5)函数调用完成后,攻击合约(0x6dd61c69)移除 pool 中的流动性,随后提出兑换而来的 USDC 代币获利。
(6) 多次循环上面的操作,每次攻击都会更换被攻击用户地址和恶意市场代币地址。
(7) 然后将获得的 USDC 发送给攻击者(0xe4f34a72)。
(8)多次执行同样的操作获利
二、漏洞分析
本次攻击利用了 DebtManager(0x675d410d)合约中的漏洞,其中的 leverage 函数未校验传入 market 参数是否为可信的市场合约,导致在 permit 函数修饰器中可将状态变量_msgSender 修改为攻击者任意的传参地址。
最后在与 pool 进行兑换时会使用用户的 exaUSDC 余额来抵消付给 pool 合约的 USDC 数量。
三、 安全建议
针对本次攻击事件,我们在开发过程中应遵循以下注意事项:
(1)在涉及到有关外部地址传参和调用的情况下,应严格校验传参地址是否为可信地址。
(2)项目上线前,需要向第三方专业的审计团队进行智能合约审计。
About Us
SharkTeam 的愿景是全面保护Web3世界的安全。团队由来自世界各地的经验丰富的安全专业人士和高级研究人员组成,精通区块链和智能合约的底层理论,提供包括智能合约审计、链上分析、应急响应等服务。已与区块链生态系统各个领域的关键参与者,如 Polkadot、Moonbeam、polygon、OKC、Huobi Global、imToken、ChainIDE 等建立长期合作关系。