合约地址与钱包地址的区别,怀孕肚子空空的是怎么回事

  

  本文分析了以太坊中存在相同问题的81个智能合约和EOS映射中存在相同问题的213对公私钥,说明了代码复制和使用的风险,提出了智能合约审计的必要性。   

  

  

前言

  

  

  这是什么社交时代?   

  

  一个不了解区块链和智能合约,可能造成聊天障碍的时代;   

  

  这是什么商业时代?   

  

  一个公司不使用区块链和智能合约,不一定能实现行业突破的时代;   

  

  这是一个什么样的技术获取时代?   

  

  一个有实力可以自己发展,没实力可以网上搜的时代。   

  

  在这个时代,虽然几乎每个人都在讨论区块链,几乎每个组织都在尝试引入智能合约,但并不是每个人都知道区块链,也不是每个组织都有实力开发智能合约。那么如何获得这一波技术红利呢?计算机技术,尤其是区块链和智能合约代码的开源使用,为缺乏技术开发实力的个人和组织接触和使用这项技术提供了无限可能。但是!同时也为一些别有用心的人扰乱行业发展秩序,危害他人财产安全提供了可乘之机。特别是区块链这种具有金融属性的技术,一不小心用错了代码,就会导致不可挽回的经济损失。最近屡禁不止的智能合约漏洞导致的代币市值蒸发就是典型代表。   

  

  

案例分析

  

  

  今天SECBIT实验室给大家分享两个疑似复制使用公共代码导致的高危问题案例:一个是以太坊上有81个同样错误的合约,另一个是213个EOS钱包地址在EOS主网在线映射时使用了相同的公私钥对。   

  

  案例一   

  

  最近SECBIT实验室发现以太坊上的81个智能合约都有同样的问题,问题都出现在ERC20 token合约中的transferFrom函数上,主要用于在有限数量的token内进行两个地址之间的转账。该功能的基本功能和含义如下:   

  

  将一定数量的_value令牌从传出地址_from转移到传入地址_to。   

  

  传输令牌的最大数量由另一个approve函数设置,可以通过访问allowed_from获得。   

  

  只有当转账quantity _value值小于转出地址的余额,且小于限定的上限数量时,才能转账成功。   

  

  在此过程中应检查溢出情况。   

  

  不过以太坊主网上的问题令牌合约码如下:   

  

  乍一看,这段代码仔细检查了余额、授权限额和整数溢出。仔细看红框中的问题代码。   

  

  第一行表示当转账quantity _value值大于等于转出账户的fromBalance的余额时,表示余额充足为真(正确的写法是将小于号改为大于号);   

  

  当第二行转账quantity _value值大于等于限额时,将授权限额标记为真(正确写法应该是小于号改为大于号);   

  

  当转入账户原余额加上转账数量大于等于账户原余额时(正确写法应该是将大于号改为小于号),第三行溢出判断会标记为真。   

  

  这个段码的结果就是三重校验没用,只有转账令牌数大于转出账户余额和限定余额,且数量大到溢出函数,才能转账成功。这样攻击者就可以转移任意账户中的所有token,对整个契约的安全性造成了非常恶劣的影响。   

  

  这个问题主要是由于“不等号”的写法不正确造成的。当这个问题出现在某个合同中,我们可能会理解为程序员笔误的结果。但是SECBIT (Abe)实验室扫描以太坊的主网络,一次发现81个合同有这个问题。一些合同(81份中的20份)的地址如下:   

  

  这么多合同代码都有同样的问题。无论是合同的原构建者不小心写错代码后被他人复制使用,还是有人故意创建问题合同并部署到主网进行恶意传播,都值得考虑“代码复制使用”问题的影响。当我们复制一段公共代码时,经常会出现我们缺乏开发这种类型代码的能力。在这种情况下,复制者将缺乏区分代码质量和正确性的能力。目前智能合约多用于代币发行,未来很有可能用于大规模资产管理。一旦部署后出现问题,将会造成不可挽回的损失。   

  

  因此,作为一家专注于智能合约安全的机构,SECBIT Lab建议大家不要随意复制非官网资源的智能合约代码,谨慎开发。在部署智能合约之前,最好找一家专业的第三方审计机构对智能合约做专业的审计,保证合约的正确性。   

  

  案例二   

  

  EOS在以太坊上进行了为期一年的众筹,众筹参与者在以太坊平台获得一定数量的ERC20 Token作为回报。主EOS上线后,以太坊平台发布的EOS令牌将失效。这就需要众筹参与者在主网上快照之前进行映射。具体来说,映射意味着EOS令牌持有者使用工具来生成一对公钥和私钥。   

,其中私钥必须私密保存,不能让任何其他人知道。持有者再调用以太坊上EOS Token智能合约的register函数,传入之前生成的公钥,发起交易打包确认,从而完成映射操作。EOS主网上线前会根据以太坊区块快照中的结果,将原有EOS ERC20 Token持仓情况映射至EOS主网区块链中,并需要之前生成的私钥来授权转账等操作。

  

2018年5月30日,EOS超级节点候选人在对EOS网络快照进行数据分析时,发现213个钱包地址共享相同的EOS公钥。造成这种情况的原因有两种可能,一种是同一个用户拥有213个不同的地址,还有一种可能是不同的用户使用了同一对公开的EOS公私钥对。经过仔细分析后证实,实际情况是这些用户使用了同一对在网上公布的EOS公私钥进行映射操作。这对公私钥最早出现于EOS GitHub代码仓库中的一个配置文件,并且被大量EOS相关教程作为示例参数而广泛使用。

  

按目前的价格计算,这些钱包的金额超过了1000万美元。每个钱包平均约有3,866个EOS总共823000 EOS。共享的公钥为:

  

EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

  

图片来自EOSAuthority.

  

该事件虽然现在并没有对EOS生态造成直接的影响,但是众多钱包共享一个公钥,且对应的私钥也不是某一个人专有的。当EOS部署成功后,这些钱包中的EOS可能会被恶意转移出EOS原有账户,造成经济损失。EOS平台自身具备的账号安全功能、时间延迟功能,仲裁流程等功能在这里并不适用,都不能保证这些资金的安全。

  

在密码学中,我们经常听到“公钥”和“私钥”两个词,公钥和私钥是成对存在的,公钥是私钥通过特定的函数派生出来的,通过私钥可以推测出公钥,但是通过公钥无法推测出私钥,所以在购买和交易加密货币时加密货币钱包会提醒用户保存好自己的私钥或是私钥种子,因为丢失或是泄露了私钥后自己钱包中的加密货币就会被窃取。所以当众多人共享一对公私钥对,多个钱包用户拥有相同私钥时,恶意用户就可以转走其他用户钱包中的加密货币。所以多个EOS钱包复制使用公开公私钥对,而不是自己生成私有的公私钥对是一件极具风险的事情。错误使用了公开公私钥进行操作的用户,必须立即重新进行正确映射操作。

  

作为区块链行业从业者、智能合约使用者或是加密货币拥有者,应该学习、了解相应的密码学和智能合约编程知识,切不可随意复制使用涉及资金安全的合约和公私钥等的代码。如果恶意攻击者,将带有严重漏洞的代码公开在网络上进行传播,诱导技术开发能力欠缺的组织使用,将会给使用者造成毁灭性打击和不可挽回的损失。SECBIT(安比)实验室作为一个聚焦智能合约安全的团队呼吁大家在使用网络开源代码,特别是智能合约代码时,最好交付专业审计机构,对合约进行审计和漏洞排查。

  

(以上观点由SECBIT(安比)实验室提供,SECBIT(安比)实验室专注于智能合约安全问题,全方位监控智能合约安全漏洞、提供专业合约安全审计服务。合作交流请联系info@secbit.io。)

相关文章