宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > AVAX > 正文

智能合约安全审计入门篇 —— delegatecall (2)

作者:

时间:1900/1/1 0:00:00

上篇文章中我们了解了什么是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));??}}

Circle:跨链传输协议将于6月27日登陆Arbitrum:金色财经报道,Circle在推特上表示,“我们很高兴地宣布,跨链传输协议 (CCTP) 将于6月27日登陆Arbitrum。”[2023/6/9 21:26:02]

漏洞分析

这次的攻击目标依然是获得HackMe合约中的?owner?权限,我们可以看到两个合约中除了HackMe合约中的构造函数可以修改合约的?owner?其他地方并没有修改?owner?的函数。我们要如何完成攻击呢?这里需要一点小技巧,大家可以思考一下,刚好也可以验证一下自己对于之前知识的掌握程度以及自己的思维是否活跃。

是否有想法呢?没有想法也没关系,我们一起来看攻击是如何完成的:

攻击合约

//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;??}}

矿企Bitfarms去年共产出5167枚BTC,平均挖矿成本1万美元:金色财经报道,比特币矿企Bitfarms发布去年四季度和2022年全年业绩报告。

数据显示,Bitfarms去年四季度产出1434枚BTC,全年共计5167枚,自该公司成立以来到今年2月累计蟾蜍超过20,000个BTC;2022年每个BTC的平均直接生产成本为10,000美元;2022年第四季度净亏损为1700万美元,调整后EBITDA为正100万美元;预计到2023年底,算力增加30%到6EH/s。(globenewswire)[2023/3/21 13:17:25]

我们先看攻击流程:

1.Alice部署Lib合约;

2.Alice部署HackMe合约并在构造函数中传入Lib合约的地址;

NFT交易协议sudoswap已发布治理代币SUDO并开启治理模块:金色财经报道,NFT交易协议sudoswap已发布治理代币SUDO并开启治理模块。其中XMON持有者可以通过lockdrop活动来获得SUDO代币,XMON代币将从合约部署开始计算被锁定1个月,每锁定1个XMON可以获得1万枚SUDO;早期sudoAMM的流动性提供者(仅限交易池)和0xmons NFT持有者(快照日期之前)也有资格获得SUDO空投。[2023/1/31 11:37:42]

3.攻击者Eve部署Attack合约并在构造函数中传入HackMe合约的地址;

4.攻击者调用Attack.attack()函数将HackMe合约中的owner变为自己。

咋回事儿呢?其实这个攻击方式就是很巧妙的运用了delegatecall这个函数修改storage类型变量时的特征:delegatecall函数的执行环境是调用者的环境并且对于storage类型变量的修改是根据被调用合约变量存储的插槽位置来修改的。

IKGUIDE Metaverse Collective CEO:元宇宙的三个基本要素是身临其境的需要、互动和社交:金色财经现场报道,在Coinlive举办的峰会上,IKGUIDE Metaverse Collective 首席执行官 Soh Wan Wei 继续进行下一个主题演讲,主题为“The Metaverse & Asia:A New Era in Storytelling”。她分享了元宇宙是什么;是 Facebook、游戏还是虚拟世界。她解释说,元宇宙的三个基本要素是身临其境的需要(充分意识到并意识到一个人并不完全在现实中);互动;和社交(意味着社区是我们所看到的核心)。关于元宇宙在亚洲的最新发展,她继续列举了一些案例研究,其中之一是代代木公园“Naked”的一个名为“Tree”的项目——食客在他们的美食体验中戴上 VR 耳机(它结合技术艺术,例如 VR 和投影映射与美食)。 “亚洲将通过元宇宙揭开讲故事的新纪元,”她说。[2022/12/22 22:00:31]

1.Attack.attack()函数先将自己的地址转换为uint256类型第一次调用HackMe.doSomething()函数;

Kandola完成45万美元融资,Polygon创始人等参投:5月2日消息,Web3物联网网络Kandola完成45万美元Pre-Seed轮融资,Alpha Wave Global、Polygon创始人Sandeep Nailwal、以太坊消息推送服务EPNS创始人Harsh Rajat以及Arcanum Capital等参投。此外,Kandola目前正在进行种子轮融资。

Kandola首席营销官Krithika表示,Web3可以保护设备和确保完整数据隐私的工具。但是,Web3目前在速度和成本方面存在限制,这使得它难以用于此类现实世界的用例。这一差距正是Kandola正在解决的问题:实时消息传递和存储,无需支付Gas费。(Cointelegraph)[2022/5/2 2:45:16]

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变量被错误的覆盖。

来源:金色财经

标签:ACKHACSOMSOMEDAOslackDHACSOMEE

AVAX热门资讯
  资不抵债?高盛寻求20亿美元购买加密货币贷款机构

  资不抵债?高盛寻求20亿美元购买加密货币贷款机构  据报道,高盛正在寻求从投资者那里筹集20亿美元,以购买加密货币贷款机构CelsiusNetwork的不良资产.

1900/1/1 0:00:00
Proshares做空比特币ETF首日交易量惨淡 但第二天上涨了380%

ProShares的首只做空比特币ETF在6月21日推出时起步缓慢,但在第二天交易量就增长了380%.

1900/1/1 0:00:00
DataFi:一种创新型的链上数据赋值模式

本文翻译自ADAM?Medium《DataFi:Aninnovativemodel—Addingvaluetoon-chaindata》链上数据的商业应用目前仍然没有得到充分的开发,这平白浪费了大量公开透明的优质信息.

1900/1/1 0:00:00
目前比特币挖矿收入与2021年比特币突破6.9万美元之前的挖矿收入低点相当

比特币(BTC)在一年半之后跌到了2万美元的价格区间,这使得生态系统中最重要的工作——挖矿——成为一件代价高昂的事情。然而,如果历史重演,比特币投资者可能会见证另一轮史诗般的牛市,这轮牛市曾帮助比特币达到69000美元的历史高点.

1900/1/1 0:00:00
孙宇晨闪耀WTO MC12,区块链提议引全球精英热议

6月12日,世贸组织第12届部长级会议在瑞士日内瓦开幕。来自全球120多个国家和地区的代表齐聚一堂,就疫情应对、渔业补贴、农业改革和WTO改革四大议题进行了重点讨论。此次大会,我国是由商务部部长王文涛率团出席.

1900/1/1 0:00:00
以太 比特币最新行情视频解析 熊市以及结束 调整有上涨幅度

对于后市的行情个人依然是看多目前的多头发力空间,以太坊这一波上冲并没有去上破1280压力位,个人认为只是时间的问题,站稳1280位置上涨幅度将会继续加大,需要去重点关注下,比特币23000位置是前两天重点讲到的一个位置.

1900/1/1 0:00:00