您的位置:首页 > 互联网 >

Zeppelinos发现代理模式漏洞 可升级几乎所有智能合约

2019-06-04 17:34:30 来源: 区块链研究实验室

我们最近审查了Zeppelinos的初始版本,发现了代理模式中的一个漏洞,该模式用于实现几乎所有可升级的智能合约。此漏洞允许攻击者隐藏恶意代

我们最近审查了Zeppelinos的初始版本,发现了代理模式中的一个漏洞,该模式用于实现几乎所有可升级的智能合约。

此漏洞允许攻击者隐藏恶意代码,如果不深入了解Solidity和Proxy Pattern的工作方式,很难发现恶意代码。这已在ZeppelinOS上修复。

Solidity函数调用internals

如果您是以太坊的开发人员,那么您最有可能使用Solidity进行编写和考虑如何设计智能合约。

从网络的角度来看,智能合约是一个与其相关联的单个代码块的帐户。如果任何其他帐户向合同发送消息,其代码将在EVM上执行。

那么如果合约只有一段连续的代码,如何调用不同的函数呢?

以太坊定义了其组件之间通信的标准方式,即应用程序二进制接口或简称ABI。您可以将其视为低级API,不仅指定系统中可用的功能,还指定我们通常认为合理的工作量。其中一些是如何调用函数,如何传递参数以及它们如何返回值。

以太坊ABI规定您的事务的数据参数必须以函数选择器开始,该函数选择器标识您尝试调用的方法。使用选择器,合约的代码会跳转到实现您尝试调用的函数的部分。

函数选择器只是函数签名的sha3散列的前四个字节。例如,get的选择器计算为sha3(“get()”)[0:4],它给出了0x6d4ce63c。类似地,set的一个是sha3的结果(“set(uint256)”)[0:4]。

函数选择器只有一个例外,这是因为在没有选择器的每个智能合约中都存在一个回退函数。当没有提供数据参数,或者给定的选择器与契约的任何方法都不匹配时,它具有被调用的特殊行为。

重新审视代理模式

关于代理模式,它拥有多种变化和权衡模式。 无论您选择哪种代理模式,其核心功能都是相同的:它将收到的所有消息转发给当前的合同实现。

我们来看看它是如何工作的。

你不需要理解装配块是如何工作的。它把当前消息实现转发并将接收到的数据参数发送出去。

将转发逻辑放在回退函数中,可以让我们将任何调用转发到代理中。事实证明,这种情况并不总是发生。

代理还需要它自己的元功能(meta-functionality),因为代理需要可升级性。因此,如果存在并且不执行回退功能,则不会转发implementation()和proxyOwner()等函数。

代理选择器冲突

您可能已经意识到代理智能合约中的任何函数(其选择器与应用智能合约中的某个函数匹配)都将被直接调用,完全跳过应用码。

因为函数选择器使用固定数量的字节,所以总是存在冲突的可能性。 这不是日常开发的问题,因为Solidity编译器将检测合同中的选择器冲突,但是当选择器用于交叉智能合约交互时,这就变得可攻击了。冲突可以被滥用来创建一个看似很好的合同,但实际上隐藏了一个后门。

在使用rust代码,我们发现clash550254402()与proxyOwner()具有相同的选择器。 我们在Macbook Pro中可以很轻易能找到它。 但是黑客们可以利用该流程去寻找代码漏洞进行攻击。

代理可利用性

代理模式是在以太坊生态系统中常见的智能合约升级方法,选择器冲突攻击者可以使用它来获取升级机制的访问权攻击或部署隐藏恶意功能的代码。

例如大多数可升级实现都有一些状态迁移的概念,这是升级智能合约的存储功能。这些对于伪装选择器冲突特别有用,因为自动生成的字符串(如commit number)可以作为这些函数的可接受名称,从而使选择器冲突攻击易于隐藏。

在我们对ZeppelinOS进行的安全审计的背景下,我们发现这可以被任何人利用,而不仅仅是代理所有者,因为他们打算让网络的任何用户部署实现供其他用户使用。另一个例子是,一个函数调用似乎可以转移资金,从而实现窃取某人的资金,但实际上该函数根本不被调用。

解决方案

在我们发现此漏洞之前,Zeppelin的Francisco Giordano已经开始研究透明代理。这是一种改进的技术,旨在让实现智能合约使用与代理相同的函数名,而不会出现选择器冲突,这就消除了攻击。

新代理通过转发任何函数调用来工作,只要它们不是来自代理所有者。但是冲突仍然存在,如果调用方不是代理所有者,则会转发调用。这使得代理所有者成为唯一可能发生冲突的帐户,因此用户不会受到隐藏攻击。

唯一的缺点是其他用户将无法使用代理的ABI读取代理的自身状态(即所有者和实现)。他们将需要使用web3.eth.getstorageat()。这是一个相当小的代价,因为要确保可升级的合同完全按照其实现源代码所显示的方式执行。

总结

对于那些想更深入地了解如何利用这个漏洞的人,我们做了一个小练习。你的任务是试图在合同中窃取ropsten-ETH

https://ropsten.etherscan.io/address/0xb97dd0102bb67f81d25d686c661d7f0aed62e344,并弄清楚发生了什么。 请记住,这是一个代理合同,所以你也应该看看它的实施。

你可以用这些合同做你想做的任何事情,只是不要完全清空它的余额,这样其他人也可以玩。

消息是帐户之间的通信方式。当您发送交易时,您正在向另一个帐户发送消息。当发送方是智能合约时,它们通常称为内部交易。

消息实际上并不像传统代理那样转发。所发生是在我们执行应用码时,就好像它是通过delegatecall执行代理的代码一样。(原作者:Patricio Palladino)

关键词: Zeppelinos 代理模式 漏洞

精选 导读

募资55亿港元万物云启动招股 预计9月29日登陆港交所主板

万科9月19日早间公告,万物云当日启动招股,预计发行价介乎每股47 1港元至52 7港元,预计9月29日登陆港交所主板。按发行1 167亿股计算,万

发布时间: 2022-09-20 10:39
管理   2022-09-20

公募基金二季度持股情况曝光 隐形重仓股多为高端制造业

随着半年报披露收官,公募基金二季度持股情况曝光。截至今年二季度末,公募基金全市场基金总数为9794只,资产净值为269454 75亿元,同比上

发布时间: 2022-09-02 10:45
资讯   2022-09-02

又有上市公司宣布变卖房产 上市公司粉饰财报动作不断

再有上市公司宣布变卖房产。四川长虹25日称,拟以1 66亿元的转让底价挂牌出售31套房产。今年以来,A股公司出售房产不断。根据记者不完全统

发布时间: 2022-08-26 09:44
资讯   2022-08-26

16天12连板大港股份回复深交所关注函 股份继续冲高

回复交易所关注函后,大港股份继续冲高。8月11日大港股份高开,随后震荡走高,接近收盘时触及涨停,报20 2元 股。值得一提的是,在7月21日

发布时间: 2022-08-12 09:56
资讯   2022-08-12

万家基金再添第二大股东 中泰证券拟受让11%基金股权

7月13日,中泰证券发布公告,拟受让齐河众鑫投资有限公司(以下简称齐河众鑫)所持有的万家基金11%的股权,交易双方共同确定本次交易的标的资

发布时间: 2022-07-14 09:39
管理   2022-07-14

央行连续7日每天30亿元逆回购 对债市影响如何?

央行12日再次开展了30亿元逆回购操作,中标利率2 10%。这已是央行连续7日每天仅进行30亿元的逆回购缩量投放,创下去年1月以来的最低操作规

发布时间: 2022-07-13 09:38
资讯   2022-07-13

美元指数创近20年新高 黄金期货创出逾9个月新低

由于对美联储激进加息的担忧,美元指数11日大涨近1%创出近20年新高。受此影响,欧美股市、大宗商品均走弱,而黄金期货创出逾9个月新低。美

发布时间: 2022-07-13 09:36
资讯   2022-07-13

美股三大股指全线下跌 纳斯达克跌幅创下记录以来最大跌幅

今年上半年,美股持续回落。数据显示,道琼斯指数上半年下跌15 3%,纳斯达克综合指数下跌29 5%,标普500指数下跌20 6%。其中,纳斯达克连续

发布时间: 2022-07-04 09:51
推荐   2022-07-04

融资客热情回升 两市融资余额月内增加超344亿元

近期A股走强,沪指6月以来上涨4%,融资客热情明显回升。数据显示,截至6月16日,两市融资余额1 479万亿元,月内增加344 67亿元,最近一个半

发布时间: 2022-06-20 09:41
资讯   2022-06-20

4个交易日净买入超百亿元 北向资金持续流入A股市场

北向资金净流入态势延续。继6月15日净买入133 59亿元后,北向资金6月16日净买入44 52亿元。自5月27日至今,除6月13日以外,北向资金累计净

发布时间: 2022-06-17 09:37
推荐   2022-06-17