-
前 言
今天为大家分享一个轻微漏洞案例,案例的主角是S*T与M*C,大家应该对这两个项目不会陌生。由于之前出了漏洞,造成无限转币,导致项目方损失惨重。
申明一下,我们仅仅只是做案例分享。
对于智能合约,我们一直认为,任何一行代码都应该且必须严谨,具体你懂的。。。。
-
代码案例
咱们先看下面的代码:
-
代码解析
这是一个代理转账函数,参数简单说明:
-
_from---转账方
-
_spender---收款方
-
_value---转账金额
如果你的签名为:
keccak256是一个加密算法,内嵌的函数,可以直接调用。ecrecover是恢复签名公钥的函数,如果传的各个值正确,ecrecover恢复出的公钥等于应该等于_from所传地址。按正常流程来执行的话这个函数是没有问题的。
-
重点!重点!考试要考!
但是,但是,如果ecrecover里面传的参数不对,ecrecover就会返回0x0地址,而且我们检查了下合约,并没有禁止向0x0转账,所以理论上说,任何人都可以从0x0地址获得这个合约的token。
-
实 操
这时候我们去以太坊区块链浏览器中查下0x0有没有他们的token,果不其然,里面有0.1个token,然后我们调用代理授权函数,并从0x0中将剩余的0.1个token成功的转到了我们的测试账号上。
-
实操详细流程
1、执行approveProxy函数,授权成功
2、我们通过区块浏览器查看allowance 是否授权成功,看下面截图,成功授权,可以从0x0转走0.个token。
3、接着我们调用transferForm
4、转出成功!成功!成功!成功!。
-
总 结
虽然这个属于轻微漏洞,但是如果有人往0x0转了对应合约的token,那么其他人还是能取出来,一般来说往0x0里面转token属于销毁,如果项目方哪天宣布要销毁部分token,往0x0转了大量token,然后被有心人给发现了,那就尴尬了。
好了今天的分享到此结束啦,如果各位还有啥疑问欢迎留言或者加入我们的知识星球(ID:7180746)