快捷搜索:  网络  后门  CVE  渗透  木马  扫描  黑客  as

LightCoin合约非一致性检查漏洞阐发

0×00 项目简述

LIGHT (光链) 是全国上第一个双层区块链(父链与子链)。其中,LIGHT 父链与传统的公链类似,有且仅有一个,保障记录完备、透明、不可被篡改或烧毁。LIGHT子链可以是多个且相互自力存在,基于PoM validation方式,结合In-Memory数据库缓存,有用提高缓存环节吞吐量,QPS可达10万以上,完成性能大幅提高。LIGHT突破性地解决了现今数字货币在交易时处理速率严重滞后的问题,完成瞬时实现实时交易。

0×01 漏洞详情

合约地址:

0xd97579Cea3fE2473682a4C42648134BB982433B9

合约代码地址:

https://etherscan.io/address/0xd97579Cea3fE2473682a4C42648134BB982433B9#code

合约类型:ERC20(https://github.com/ethereum/EIPs/issues/20)

漏洞函数:transferFrom

漏洞类型:非一致性检查

漏洞风险:可导致绕过授权额度检查,转出越过授权额度代币至任意以太坊账户。

0×02 细节阐发

image.png

代码55行在检查授权转账额度是没有问题的,然则在58行减掉已转出的授权额度时,错误的写成了allowed[_from][_to] -= _value。该行代码导致在授权转账实现后,限额依然不变,鄙人一次操作授权转账时,依然可以继续按照原本限额转出代币。该漏洞属于一个逻辑漏洞,企业黑客,由于校验的前提以及操作的前提不一致,导致后续绕过校验。

该漏洞逻辑如图所示。

image.png

0×03 漏洞调试

我们使用Remix调试代码,调试的时辰我们修改24举动内陆Javascript VM的钱包地址,点Deloy部署后,以及合约为合约部署者调配2000000个Token。起首调用approve函数为Javascript VM的另外一个账户授权一点转账额度。调用参数以下。该调用为参数1地址授权10000额度的转账权限。

“0x14723a09acff6d2a60dcdf7aa4aff308fddc160c”,10000

调用完毕后,我们切换到授权过的这个账户(既第一个参数),调用transferFrom函数进行授权转账测试。调用参数以下,该调用正确情形下,应该由参数1账户转向参数2账户9999个Token。同时减除调用者授权额度9999。

“0xca35b7d915458ef540ade6068dfe2f44e8fa733c”,”0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db”,9999

由于remix不支持查看二级字典的调试功能,为了调试方便我们在59行后加一行var test =allowed[_from][msg.sender]便于我们观察变量的更新情形。调试效果以下图。我们可以看到,转账成功了,然则allowed[_from][msg.sender]的值却并没有变,正确情形下该值应该等于10000-9999。

image.png使用相同参数再次调用一下transferFrom,我们会发现,转账仍旧会成功,调用效果以下。

image.png

0×04修复建议

将58行改成:

allowed[_from][msg.sender] -= _value;

*莫良@BYSEC.IO,

您可能还会对下面的文章感兴趣: