Exactly Protocol 攻击事件原理分析
8 月 18 日,Exactly protocol 遭遇黑客攻击,攻击者已获利约 1204 万美元。
安全公司Safful对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。
一、 事件分析
攻击者地址:
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)项目上线前,需要向第三方专业的审计团队进行智能合约审计。