区块链安全 | 修饰器(modifier)相关漏洞分析

区块链安全 | 修饰器(modifier)相关漏洞分析_第1张图片

一、前言

修饰器(modifier)可以改变函数的行为,例如作为前置的检测条件。同时修饰器具有可继承属性,可以由派生合约中的定义覆盖。本次BUGX.IO区块链安全课堂给大家进行修饰器的相关漏洞分析。

二、什么是修饰器

修饰器具有可继承属性,可以由派生合约中的定义覆盖,如下示例代码,由于 onlyOwner 的修饰,给 foo 函数加了一个前置条件,即只有 owner 才能成功调用此函数,否则就会报错回滚。其中 _; 表示函数中的其余代码。

区块链安全 | 修饰器(modifier)相关漏洞分析_第2张图片

并且,修饰器也能带入参数,如:

区块链安全 | 修饰器(modifier)相关漏洞分析_第3张图片

三、常见修饰器

常见的库合约包括管理者权限控制合约、暂停功能合约、黑名单管理合约、日志记录等等,而常见的修饰器有 onlyOwner、isOwner、whenNotPaused、whenPaused、manager、execute、onlyContractCreator 等等。

常见权限控制的修饰器写法有:

区块链安全 | 修饰器(modifier)相关漏洞分析_第4张图片

日志记录:

区块链安全 | 修饰器(modifier)相关漏洞分析_第5张图片

四、常见修饰器漏洞类型

1、Modifier Wrong Check 修饰器检测逻辑错误

修饰器中的判断错误,导致修饰器无法起到开发者预期的控制作用。

如 I_See_Voice_Token (ISVT) 合约 :

https://etherscan.io//address/0xa6b0412276b2484cfb370890b9d07e0c8f1f7684#code

正确的写法应该是 == ,结果错写成了 !=,从面造成了权限控制失效。

2、Modifier Invalid Check 修饰器检测无效漏洞

缺少使用 if、 if throw、if revert()、require、assert 作为条件判断,使得判断无效,导致修饰器的权限控制功能失效。

如 BancorKiller 合约 :

https://etherscan.io//address/0x32a8c2da487ff26ef5778fd44dc8eaa73d7bb437#code

使用以下代码进行测试,可以发现,任何人都可以调用 foo_flaw 函数,正确写法的 foo_right 函数则只有管理员才可以调用。

区块链安全 | 修饰器(modifier)相关漏洞分析_第6张图片

3、更复杂的情况带参修饰器漏洞

由于修饰器能够带参执行,这种类型的漏洞就只能按照实际情况进行分析。

五、修复方案

严格验证修饰器的判断条件,合约发布做好前充分的功能测试。

六、参考资料

https://solidity.readthedocs.io/en/latest/contracts.html?highlight=modifier#function-modifiers

七、公司介绍

BUGX.IO是一家致力于区块链领域的安全公司。核心团队组建于2014年,我们在区块链生态安全、行业解决方案、安全建设、红蓝对抗等方面有深厚积累与过硬专业素养。

你可能感兴趣的:(————区块链安全,【区块链】)