http://www.7klian.com

技能分解去中心化生意业务所协议 0x 恶意挂单裂痕

裂痕道理阐明

本次裂痕共涉及 isValidWalletSignature() 和 isValidValidatorSignature() 两个相似的裂痕,由于两者出问题的代码是相似的,本文只以前者为例说明。

对付利用了 0x 的 DEX 及钱包来说,当前的阶段需要暂停生意业务处事,如无法暂停生意业务处事的话,可将对应的 0x Exchange 合约地点改观为当前已经修复的合约地点。

鉴于此安详裂痕的危害性,PeckShield 安详人员发明 0x 项目方在裂痕被发明的时候先紧张封锁了 0x Exchange v2.0 合约的 Token transfer 成果,将所有的 ERC20、ERC721、以及 MultiAsset 的 Transfer 成果全部下线;随后陈设了修复后的合约,同时奉告用户及利用了 0x Exchange 的所有 DEX 及 Relayer,相关的迁移进级事情正在举办中。受此影响,基于 0x 协议的生意业务所及钱包,包罗 Radar Relay, Tokenlon, Star Bit 等紧张暂停了生意业务处事。

组装签名详细字段为 ABI 编码名目;

上图是这一函数的全部逻辑,分为两部门:

WalletAddress挪用 staticcall() OpCode 计较签名正确性,留意调查代码,个中的 input 和 output 都为cdStart 这一指针,即复用 input/output 的内存

代表订单信息的 Order 范例;

个中,第 2 步的逻辑,在 0x v2 合约代码中是用汇编实现的 :

0x 官方博客说明:https://blog.0xproject.com/shut-down-of-0x-exchange-v2-0-contract-and-migration-to-patched-version-6185097a1f39

个中较量要害的是 Order 及对应的 signature 信息的一致性正是通过上面的 isValidWalletSignature() 类函数校验,因此,当进攻者经心结构 signature 为 SignatureTypeWallet 时,可『跳过』签名正当性查抄,从而使得用户在不经意之间恶意挂单(甚至是低价挂单),从而被进攻者顺利吃单,由于这一订单信息是由进攻者直接传入合约的,因此这一订单信息在线下的中继者也无法查询。

用户为此订单支付的 Token 数量;

进攻者可伪造用户挂单,低价得到用户代币。

7kLian.com整合了海内两家区块链安详机构慢雾与 PeckShield 对该裂痕的阐明,前者较为简洁,后者较为详尽。

用户通过 fillOrder(Order, uint256, bytes) 函数完成 Token 交易,PeckShield 安详人员发明,,这一函数的三个参数可以由用户自由设置:

0x 协议简介

0x 协议是一个基于以太坊的开放协议,实现链上资产的点对点生意业务。它期望在以太坊上建设一种尺度协议,使得任何人可以或许基于此协议运行去中心化生意业务所,实现以太坊上的代币之间的生意业务。0x 协议上的生意业务特点是链下订单笼络,链上结算,个中为用户生意业务提供订单处事的参加者称为中继者。0x 项目刊行了本身的代币 ZRX,一方面作为去中心化管理投票权的证明,同时也被作为生意业务处事费,用于成立在 0x 协议之上的中继者提供处事的收益。

0x 协议受到不少去中心化生意业务所和钱包的青睐,从 Etherscan 的 DEX 已往七天生意业务份额的饼图中能看到,排名靠前的 Radar Relay 和 Tokenlon 都是基于 0x 协议:

Order 对应的签名信息 signature

按照组装的 ABI 编码内容计较签名值正确性。

当被挪用的合约(即这里的WalletAddress)没有 code, 也就是 EOA 账号的环境下,什么都没有的执行,直接返回。因此,对应到 isValidWalletSignature(bytes32, address, bytes) 函数来说,个中的 cdStart 所对应的内存内容在挪用 staticcall() 前后并没有变革,尔后头在判定签名是否正确的 isValid 取值的时候,也就取到了错误的值。

PeckShield 安详人员跟进阐明发明,0x Exchange 合约在校验订单签名时存在缺陷,导致进攻者可以举办恶意挂单,进而将用户的数字资产低价卖出,扰乱正常的生意业务秩序。

isValidWalletSignature(bytes32, address, bytes) 函数用于验证给定的 Wallet 合约所界说的签名信息与给定的签名是否一致,用于确保 Order 是由正确的 Maker/Taker 执行的生意业务。可是 0x Exchange 合约在验证的进程中,存在着较量严重的问题:

检讨步调 2.2 中的功效是否正确。

技能细节

1、在 EVM 中 call 挪用一个非合约账号(EOA)不会有任何返回值,也不会产生 revert;

别的,从 DAppTotal 的 DEX 24 小时生意业务额排名中也能看到它们的排名:

参考资料

裂痕发明者:samczsun
PeckShield 阐明配景

北京时间 2019 年 07 月 13 日,去中心化生意业务所 0x 协议项目方称其发明严重安详裂痕,并紧张封锁了 0x Exchange v2.0 合约,随后陈设了修复后的合约。受此影响,基于 0x 协议的生意业务所及钱包,包罗 Radar Relay,Tokenlon, Star Bit 等紧张暂停了相关生意业务处事。

由于 Ethereum 平台上大量的 DEX 都利用了 0x 协议,而作为最基础的 Token Tranfer 主合约出问题,这对付整个 DEX 规模来说,都是较量重大的事件。

7 月 13 日,去中心化生意业务所协议 0x 公布发明安详裂痕,0x Exchange v2.0 合约临时封锁,修复的生意业务合约打算晚些时候陈设到以太坊主网。0x 称该裂痕答允进攻者利用无效签名填写某些订单,但不影响 ZRX 代币合约,并暗示今朝没有人操作此裂痕,也没有用户资金丢失。

引入 cdStart 指针,指向 calldata 中对应的位置;

结语

0x 协议本次呈现裂痕的合约代码,主要是内联汇编代码编写签名验证成果呈现的问题,直接编写汇编代码固然在编译器无法优化合约代码的环境下很是有用,可控性更强且能提高执行效率,淘汰 Gas 耗损,可是编写 Solidity 汇编代码需要对 EVM 运行机制有很是熟悉的领略,否则 EVM 的某些特性大概导致编写的合约无法正常运行,同时也缺少了 Solidity 提供的多种安详机制。

别离为:

慢雾阐明裂痕配景

0x 合约中配置了 isValidWalletSignature 和 isValidValidatorSignature 函数对多签合约账号(Wallet Contract)及验证人合约账号(Validator Contract)举办签名有效性验证。

裂痕影响

在这两个函数实现中因为没有对 address 举办校验,导致非合约账号(EOA)可以结构非凡数据,来通过这两个函数举办签名有效性验证,并团结函数逻辑缺陷,导致可伪造签名数据。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!