文章前言
在这篇文章中,我们对曾经出现过的一种叫做evilReflex的安全漏洞进行分析研究,攻击者可以通过该漏洞将存在evilReflex漏洞的合约中的任意数量的token转移到任意地址
漏洞分析
漏洞函数approveAndCallcode()代码如下所示:
approveAndCallcode函数的用途是在完成approve操作时发出相关的调用通知,而在上述代码的L136处_spender.call(_extraData)中的_extraData为用户可控参数,而在solidity语言中可以通过call方法来实现对某个合约或者本地合约的某个方法进行调用,调用的方式大致如下:
<address>.call(方法选择器, arg1, arg2, …)
<address>.call(bytes)
在使用call调用时我们可以通过传递参数的方式,将方法选择器、参数进行传递,也可以直接传入一个字节数组,我们可以将要调用的合约方法以及相关参数转换为bytecode之后作为_extraData参数传入,然后通过_spender.call(_extraData)实现对合约中的任意方法的调用,而此时的_spender也是可控的,所以也可以在存在漏洞的合约中调用任意合约的任意方法并为其提供相关的方法参数
漏洞演示
下面我们来做一个漏洞演示,模拟如何通过evilReflex漏洞窃取合约自身的token到任意地址,下面是存在漏洞的合约代码: