智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于1995年由NickSzabo首次提出。智能合约的目的是提供优于传统合约的安全方法,并减少与合约相关的其他交易成本。
漏洞概述:
因为以太坊智能合约中是可以调用外部的合约代码,外部合约可能是攻击者构造的恶意不安全的合约代码,当在转账操作时执行代码,迫使攻击的合约回调包括自身的代码,和绕过源代码的限制发生了重入攻击事件。
发生重入攻击漏洞有两个原因:
Uniswap Labs发布两个新智能合约:Permit2和Universal Router:11月18日消息,据官方博客,Uniswap Labs发布了两个新的智能合约,即代币审批合约Permit2和集成通用路由器Universal Router。Permit2和Universal Router都是一个不可升级、无主的开源合约,已部署到Ethereum、Optimism、Arbitrum、Polygon和Celo中。
据介绍,Permit2可在不同智能合约间共享和管理代币,Universal Router可将ERC20和NFT的Swap集成至单个路由器的Universal Router。Uniswap Labs现已为这两个合约分别运行漏洞赏金计划,以确保Uniswap合约达到最高安全标准。[2022/11/18 13:20:05]
1.?调用了外面不安全的合约代码
英国法律委员会:英格兰和威尔士现行法律可适用于智能合约:金色财经报道,英国法律委员会(Law Commission)今天表示,英格兰和威尔士的现行法律可以适用于智能合约。根据该委员会的说法,对智能合约的执法并不需要对现有法律框架进行大规模的修改,除非在某些情况下,可能只需要对普通法进行微小的修改。今天的公告结束了委员会关于智能法律合约方面的工作,这是其第十三项法律改革计划的一部分。该声明还确认了英国司法管辖工作组在2019年11月就加密货币和智能法律合约达成的结论。根据法律委员会的说法,普通法的灵活性足以适应智能合约等新兴技术。因此,该委员会表示,英格兰和威尔士的管辖范围非常适合商业和创新。法律委员会还呼吁市场参与者采取积极的措施,以应对智能法律合约的激增。这些准备条款包括创建风险条款来解释智能合约的性能,以及建立用于理解智能法律合约中自然语言和计算机语言之间联系的协议。然而,法律委员会还指出,作为其结论的一部分,需要在智能合约和一般新兴技术引起的冲突解决领域进行更多的研究。在向政府提出的建议中,委员会同意某些类型的智能合约将带来独特的法律问题。与此同时,法律委员会也在研究加密货币和数字资产法规,重点关注产权,不论是有形的还是无形的。[2021/11/26 7:11:20]
2.?外部合约的函数早于状态变量的修改
Cardano推出另一项智能合约编程语言提案:Cardano基金会在推特表示,他们已推出一项提案请求(RFP),用于在Cardano上使用另一种编程语言,即简化使用扩展的UTXO(未使用交易输出)分类帐模型来部署智能合约。该提案通过电子邮件接受申请,截止到2020年8月31日。[2020/8/4]
漏洞分析:
看withdraw函数,我们可以看到它接收了一个_amount参数,将其与发送者的balance进行比较,不超过发送者的balance就将这些_amount发送给sender,同时我们注意到这里它用来发送ether的函数是call.value,发送完成后,它才在下面更新了sender的balances,这里就是可重入攻击的关键所在了,因为该函数在发送ether后才更新余额,所以我们可以想办法让它卡在call.value这里不断给我们发送ether,同样利用的是我们熟悉的fallback函数来实现。
动态 | 蚂蚁区块链携手 ChainIDE 为开发者提供智能合约云端开发工具:蚂蚁区块链的开放联盟链将利用智能合约云端开发工具 ChainIDE,为开发者带来一键编译、设计、部署、测试、调用基于开放联盟链系统的智能合约的中间件系统。ChainIDE 由区块链开发团队纯白矩阵推出,并宣布该工具将于今日开放公测。据纯白矩阵介绍,ChainIDE 让开发团队只需要专注设计智能合约本身,在适用性突破的同时,大大节约了开发周期,通过全球 CDN 加速的云计算,ChainIDE 已经帮助全球的开发者编译了超过 50 万份智能合约,大大降低了区块链的上手门槛。此次开放中间件的公测,将为开发者提供全套的自研中间件系统与开发者生态,包括:IDE、测试网、开发者钱包、浏览器、教程等一体化的服务,ChainIDE 的全套体系可以帮助开发者无缝对接蚂蚁区块链开放联盟链全套服务,在应用层和区块链底层之间提供免费的加速服务。未来 ChainIDE 会对接更多的开放联盟链控件,并且逐步完善云端插件系统,并在开放联盟链正式版上线后提供一键并入主网的支持。[2020/1/14]
当然,这里还有另外一个关键的地方——call.value函数特性,当我们使用call.value()来调用代码时,执行的代码会被赋予账户所有可用的gas,这样就能保证我们的fallback函数能被顺利执行,对应的,如果我们使用transfer和send函数来发送时,代码可用的gas仅有2300而已,这点gas可能仅仅只够捕获一个event,所以也将无法进行可重入攻击,因为send本来就是transfer的底层实现,所以他两性质也差不多。
2016年6月以太币组织TheDAO被攻击,攻击者利用两个代码漏洞创建子合约提取了360万个以太币。接下来我们简单说一下这个事件
攻击者利用the?DAO函数智能合约中splitDAO()函数,重复对DAO资产进行重入攻击,不断从项目的资产里面分离出DAO资产并转移到自己的账户中
1.?创建钱包,调用splitDAO函数
2.?创建一个分割提案到一个新的钱包地址
3.?等待再调用splitDAO函数
4.?成功获取了ether
?解决方法:
1.?使用其他转账函数
进行以太坊转账时发送给外部地址时使用Solidity的内置函数,这将不足以调用另一份合约.
2.?先修改状态变量
这种方式就是确保状态变量的修改要早于转账操作,即Solidity官方推荐的检查-生效-交互模式(checks-effects-interactions)。
1.?使用互斥锁
互斥锁就是添加一个在代码执行过程中锁定合约的状态变量以防止重入攻击。
2.?使用OpenZeppelin官方库
OpenZeppelin官方库中有一个专门针对重入攻击的安全合约
??本文作者:权星实验室团队
来源:金色财经
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。