您的位置:首页 > 币库 >

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)

精选 导读

特朗普:美国将结束印度的贸易优惠 印度将征收更高的美国商品

美国总统唐纳德·特朗普周五表示,美国将于6月5日结束对印度的优惠贸易待遇。特朗普曾在3月初宣布,他打算将印度从普遍优惠制(GSP)项目中移除

发布时间: 2019-06-04 16:32
行业   2019-06-04

波音737 MAX竟有一百余种零件不合格 可能过早磨损或开裂

近日陷入舆论风波的波音737 MAX又被曝光了新问题,竟有多达一百余种零件不合格,这些问题可能导致飞机在飞行中受损。据美国有线电视新闻网(

发布时间: 2019-06-04 16:19
消费   2019-06-04

荣耀20采用魅眼屏+侧面指纹 赵明:坚信魅眼屏是旗舰机发展方

5月31日晚间,荣耀20和20 PRO在上海正式发布,两款旗舰都采用了魅眼屏+侧面指纹的方案。在发布会结束后,荣耀总裁赵明在接受采访时谈到了魅

发布时间: 2019-06-04 14:19
科技   2019-06-04

OPPO沈义人展示屏下摄像头技术 打开前置可预览拍摄画面

6月3日消息,OPPO副总裁沈义人展示了屏下摄像头技术。根据沈义人公布的视频,该工程机采用无刘海、无水滴、无挖孔的真全面屏形态,前置摄像

发布时间: 2019-06-04 14:15
科技   2019-06-04

李国庆发布安卓版早晚读书 提供百度没有的内容

(图片来源:早晚读书)6月2日晚间消息,李国庆离开当当再创业,由其创办的早晚读书今日召开了以知识定制未来为主题的产品发布会,同时举办城

发布时间: 2019-06-04 10:09
行业   2019-06-04

安永在GitHub开放夜幕降临代码 旨在以太坊隐私交易

据Coindesk 报道,5月31日,四大审计公司安永会计师事务所在GitHub上开放了名为夜幕降临(Nightfall)的以太坊区块链私人交易解决方案的代码。

发布时间: 2019-06-04 09:56
区块链   2019-06-04

BiKi名列福布斯区块链公司榜单第一名 日活用户10万

近日,全球著名商业杂志《福布斯》公布了2019年最值得期待的10家区块链公司榜单。这10家区块链公司来自世界各地,且都为区块链变得更容易访

发布时间: 2019-06-04 08:47
币库   2019-06-04

苹果将iOS系统移植到macOS 加入屏幕使用时间

4日凌晨消息,苹果公司今日在美国召开2019年度WWDC全球开发者大会(以下简称WWDC19),更新旗下用于手机、电脑、智能手表和电视机顶盒的软件

发布时间: 2019-06-04 08:43
学院   2019-06-04

iOS 13发布 Face ID速度增快30%+3D地图

北京时间2019年6月4日凌晨1点,WWDC(苹果全球开发者大会) 2019于美国圣何塞McEnery会议中心举行。本次发布会中最值得关注的是iOS版本的升级

发布时间: 2019-06-04 08:35
科技   2019-06-04

深圳税务局和腾讯上线出租车助手 可供区块链发票和失物招领等

乘出租车下车忘了索取发票,没法报销;车上落了东西,却不记得车牌号,无法第一时间向出租车公司求助……这样的烦恼以后不再有了。5月30日,深圳

发布时间: 2019-06-01 10:03
币库   2019-06-01