链资讯 链资讯
Ctrl+D收藏链资讯
首页 > Ethereum > 正文

LID:Solidity编译器漏洞分析:ABI重编码的缺陷_DIT

作者:

时间:

漏洞详情

ABI?编码格式是用在用户或合约对合约进行函数调用,传递参数时的标准编码方式。具体可以参考?Solidity?官方关于ABI?编码的详细表述。

在合约开发过程中,会从用户或其他合约传来的?calldata?数据中,获取需要的数据,之后可能会将获取的数据进行转发或?emit?等操作。限于?evm?虚拟机的所有?opcode?操作都是基于?memory、stack?和?storage,所以在?Solidity?中,涉及到需要对数据进行?ABI?编码的操作,都会将?calldata?中的数据根据新的顺序按照?ABI?格式进行编码,并存储到?memory?中。

该过程本身并没有大的逻辑问题,但是当和?Solidity?的cleanup?机制结合时,由于?Solidity?编译器代码本身的疏漏,就导致了漏洞的存在。

根据?ABI?编码规则,在去掉函数选择符之后,ABI?编码的数据分为?head?和?tail?两部分。当数据格式为固定长度的?uint?或?bytes?32?数组时,ABI?会将该类型的数据都存储在?head?部分。而?Solidity?对?memory?中?cleanup?机制的实现是在当前索引的内存被使用后,将下一个索引的内存置空,以防止下一索引的内存使用时被脏数据影响。并且,当?Solidity?对一组参数数据进行?ABI?编码时,是按照从左到右的顺序进行编码!!

贝莱德旗下iShares申请发行现货比特币ETF:金色财经报道,基金管理巨头贝莱德的iShares部门周四下午向美SEC提交了组建现货比特币ETF的文件。

根据该文件,该基金的资产将被命名为iShares比特币信托,基金资产主要将由托管人代表信托持有的比特币组成。该文件称,托管人将是加密交易所Coinbase。[2023/6/16 21:40:58]

为了便于后面的漏洞原理探索,考虑如下形式的合约代码:

contractEocene{

????????eventVerifyABI(bytes,?uint);

????????functionverifyABI(bytescalldataa,uintcalldatab)public?{

????????????????emitVerifyABI(a,b);?//Event数据会按照?ABI?格式编码之后存储到链上

??????}

}

合约?Eocene?中?verifyABI?函数的作用,仅仅是将函数参数中的不定长?bytesa?和定长?uintb?进行?emit。

这里需要注意,event?事件也会触发?ABI?编码。这里参数?a,?b?会编码成?ABI?格式后再存储到链上。

我们使用?v?0.8.14?版本的?Solidity?对合约代码进行编译,通过?remix?进行部署,并传入verifyABI(,)。

网传小红书暂停数字藏品销售,客服回应“支持正常销售”:6月12日消息,近期,有传言小红书官方在5月4日发布一则公告,称平台将暂停“R-数字藏品”(包括R-数字作品,R-数字头像的虚拟商品)售卖,同时关闭该类别商品的发布和编辑权限。要求商家在5月15日前进行自检,自行下架相关商品;并在公告中宣布规则于5月18日生效。

对此,专业号人工客服否认传闻内容,表示:是支持的,并建议上传商品的推荐类目为文玩/手工艺 - 文玩爱好/收藏 - 收藏品保养/鉴定工具。

经查看,在搜索栏中输入“数字藏品”并查询,可以看到目前依然有大量数字藏品商品在售卖中,并没有公告中说的暂停售卖以及发布的影响。“小红书R-Space实验室”账号中可以看到大量数字藏品依然正常销售中,但官方账号最近一次更新为4月26日,相较于该账号之前大约三日一更的更新频率来说,这次停更长达一个月有余。[2023/6/12 21:31:22]

首先,我们看一看对verifyABI(,)的正确编码格式:

0x?5?2c?d?1?a?9?c?????????????????????????????????//bytes?4(sha?3("verify(btyes,?uint)"))

0000000000000000000000000000000000000000000000000000000000000060??????//indexof?a

RON上涨触及0.88美元:金色财经报道,行情数据显示,RON(Ronin Network)上涨触及 0.88 美元,现报价 0.865 美元,24 小时涨幅 18.98%。截至目前,RON 已连续 6 周维持上涨趋势,累计涨幅 246.43%。行情波动较大,请做好风险控制。[2023/1/28 11:33:26]

0000000000000000000000000000000000000000000000000000000000011111??????//b

0000000000000000000000000000000000000000000000000000000000022222??????//b

0000000000000000000000000000000000000000000000000000000000000002??????//lengthofa

0000000000000000000000000000000000000000000000000000000000000040??????//indexofa

0000000000000000000000000000000000000000000000000000000000000080??????//indexofa

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

Ledger和Trezor钱包将为SOLO代币提供支持:金色财经报道,区块链公司Sologenic最近建立了新合作伙伴关系,将使用XRP Toolkit(由XRPL Labs生产),并与XUMM合作,其代币SOLO将由Ledger和Trezor钱包提供支持。[2020/3/3]

aaaaaa?0000000000000000000000000000000000000000000000000000000000??????//a

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

bbbbbb?0000000000000000000000000000000000000000000000000000000000??????//a

如果?Solidity?编译器正常,当参数a,?b被?event?事件记录到链上时,数据格式应该和我们发送的一样。让我们实际调用合约试试看,并对链上的?log?进行查看,如果想自己对比,可以查看该TX。

成功调用后,合约?event?事件记录如下:

!!震惊,紧跟?b的,存储?a?参数长度的值被错误的删除了!!

0000000000000000000000000000000000000000000000000000000000000060??????//indexof?a

动态 | 区块链公司Solana获得1800万美元投资 Multicoin Capital领投:据Cointelegraph消息,区块链公司Solana获得1800万美元资金,本轮融资由Multicoin Capital牵头,参与投资的公司包括Distributed Global、Blocktower Capital、Foundation Capital和Blockchange VC等。据称,最新一轮融资使Solana价值达到2000万美元。据悉,Solana是一个能够承载计算带宽类似于现代互联网的应用程序的解决方案,其网络每秒可以支持50,000个事务。[2019/7/30]

0000000000000000000000000000000000000000000000000000000000011111??????//b

0000000000000000000000000000000000000000000000000000000000022222??????//b

0000000000000000000000000000000000000000000000000000000000000000??????//lengthofa???whybecome0??

0000000000000000000000000000000000000000000000000000000000000040??????//indexofa

0000000000000000000000000000000000000000000000000000000000000080??????//indexofa

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

aaaaaa?0000000000000000000000000000000000000000000000000000000000??????//a

0000000000000000000000000000000000000000000000000000000000000003??????//lengthofa

bbbbbb?0000000000000000000000000000000000000000000000000000000000??????//a

为什么会这样?

正如我们前面所说,在?Solidity?遇到需要进行?ABI?编码的系列参数时,参数的生成顺序是从左至,具体对?a,?b?的编码逻辑如下

Solidity?先对?a?进行?ABI?编码,按照编码规则,a?的索引放在头部,a?的元素长度以及元素具体值均存放在尾部。

处理?b?数据,因为?b?数据类型为?uint格式,所以数据具体值被存放在?head?部分。但是,由于?Solidity?自身的?cleanup?机制,在内存中存放了?b之后,将?b数据所在的后一个内存地址(被用于存放?a?元素长度的内存地址)的值置?0?。

ABI?编码操作结束,错误编码的数据存储到了链上,SOL-2022-6?漏洞出现。

在源代码层面,具体的错误逻辑也很明显,当需要从?calldata?获取定长?bytes?32?或?uint?数组数据到?memory?中时,Solidity?总是会在数据复制完毕后,将后一个内存索引数据置为?0?。又由于?ABI?编码存在?head?和?tail?两部分,且编码顺序也是从左至右,就导致了漏洞的存在。

具体漏洞的?Solidity?编译代码如下:

当源数据存储位置为?Calldata,且源数据类型为?ByteArray,String,或者源数组基础类型为?uint?或?bytes?32?时进入ABIFunctions::abiEncodingFunctionCalldataArrayWithoutCleanup()

进入之后,会首先通过fromArrayType.isDynamicallySized()对源数据是否为定长数组来对源数据进行判断,只有定长数组才符合漏洞触发条件。

将isByteArrayOrString()判断结果传递给YulUtilFunctions::copyToMemoryFunction(),根据判断结果来确定是否在?calldatacopy?操作完成后,对后一个索引位置进行?cleanup。

上诉几个约束条件结合,就只有位于?calldata?中的源数据格式为定长的?uint?或?bytes?32?的数组复制到内存时才能触发漏洞。也即是漏洞触发的约束条件产生的原因。

由于?ABI?进行参数编码时,总是从左到右的顺序,考虑到漏洞的利用条件,我们必须要明白,必须在定长的?uint?和?bytes?32?数组前,存在动态长度类型的数据被存储到?ABI?编码格式的?tail?部分,且定长的?uint?或?bytes?32?数组必须位于待编码参数的最后一个位置。

原因很明显,如果定长的数据没有位于最后一个待编码参数位置,那么对后一内存位置的置?0?不会有任何影响,因为下个编码参数会覆盖该位置。如果定长数据前面没有数据需要被存储到?tail?部分,那么即便后一内存位置被置?0?也没有关系,因为该位置并不背?ABI?编码使用。

另外,需要注意的是,所有的隐式或显示的?ABI?操作,以及符合格式的所有?Tuple,都会受到该漏洞的影响。

具体的涉及到的操作如下:

event

error

abi.encode*

returns??????//thereturnoffunction

struct???????//theuserdefinedstruct

allexternalcall

当合约代码中存在上诉受影响的操作时,保证最后一个参数不为定长的?uint?或?bytes?32?数组

使用不受漏洞影响的?Solidity?编译器

寻求专业的安全人员的帮助,对合约进行专业的安全审计

Learnmore:Website?|Medium?|Twitter

标签:LIDDITSOLIDBYTBLID价格NEO Name CreditSolidexgbyte币挖矿下载

Ethereum热门资讯
ETH:鲸鱼和机构使用以太坊多头作为退出流动性,因为ETH 拒绝阻力_IETHV币

一位广受关注的加密货币分析师表示,大型实体正在使用看涨的以太坊(ETH)交易员作为退出市场的流动性.

SHI:尽管价格下跌,柴犬(SHIB)投资者仍表现出强烈的持有心态_SHIBA

ShibaInu(SHIB)的价值在加密货币市场经历了显着价格下跌的一周内下跌。然而,出人意料的是,它的投资者表现出了韧性,并持有他们亲爱的meme代币,抵制了在出现下跌迹象时卖出的诱惑.

比特币:小冯:双币低位寻求做多机会 黄金回踩1990多_以太坊币今日价格行情

比特币,昨日日线最终在震荡中录得十字阴星,盘中最低下探27000关口后小幅反弹,文中给出的此位置多也成功获得入场机会并获利;日线来看,其实在上周就分析指标触底后有反弹需求,但是这种技术性的修正.

SOL:Syscoin (SYS)_INT

一、项目简介? Syscoin是一个智能合约平台,支持尖端的Web3.0生态系统,具有超低的费用,分散的第一层安全性和第二层可扩展性,通过rollps提供规模经济.

HTT:火必将于2023年4月25日上线OSMO (Osmosis)_TPS

尊敬的用户: 火必将于2023年4月25日上线OSMO(Osmosis)。4月24日21:00(GMT8)开放OSMO的充币服务.

SHIB:分析师宣布:柴犬可能涨价 380%_SHI

流行的meme币ShibaInu是市值排名前20的加密货币之一。SHIB团队致力于持续的开发工作,并承担了许多项目。因此,ShibaInu网络通过达到关键基准和里程碑获得了行业认可.