13.DEXRouter@arbitrary-call
2023-11-05 22:17:46
# 08.PoC
DEXRouter@arbitrary-call
- 时间:2023-09-29 08:49:19 (UTC)
- 损失金额:20 BNB($4,337.20)
- twitter:https://twitter.com/DecurityHQ/status/1707851321909428688
交易
- 黑客EOA地址:0x09039e2082a0a815908e68bd52b86f96573768e8
黑客用来攻击的合约地址:0x0F41f9146dE354e5Ac6Bb3996e2E319Dc8a3Bb7f
攻击事件hash:0xf77c5904da98d3d4a6e651d0846d35545ef5ca0b969132ae81a9c63e1efc2113
资金流向
攻击过程
攻击过程非常简单,就调用了update()
和functionCallWithValue()
攻击详细分析
此次攻击中使得slot 1、2、3、4、发生了变化,很明显是update()
导致的。成功调用update()
会使得这几个storage值发生变化,攻击者将其修改为攻击合约地址,为后续调用functionCallWithValue()
做准备。
有了权限之后,直接调用functionCallWithValue()
即可获利,这个函数指定调用某个合约的某个方法,然后会发送以太。攻击者可以随意写一个函数返回true,然后设置好发送的以太即可。
其实这个攻击非常简单,就是获取权限,然后用权限调用关键方法进行获利。这个被攻击的合约没有开源,没开源就认为自己的合约很安全(不知道为啥我在多个网站都无法反编译这个合约的runtimecoee)。其实,这一类的攻击思路很简单,并且也经常发生,攻击思路主要是:找为开源的合约(一般都不咋安全),然后fuzz看看能不能获取到权限,如果获取到权限则调用获利函数。
复现
1 | // SPDX-License-Identifier: UNLICENSED |
建议
- 防守者:不要认为为开源就安全,黑客还是很牛的
- 攻击者:扫未开源的合约,fuzz看看能不能获取权限,或者可以做随意的call调用