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

一、前言

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

二、什么是修饰器

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

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

三、常见修饰器

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

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

日志记录:

四、常见修饰器漏洞类型

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 函数则只有管理员才可以调用。

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

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

五、修复方案

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

六、参考资料

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

七、公司介绍

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

*本文作者:BUGX.IO-Tri0nes,转载请注明来自FreeBuf.COM

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-07-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

这些Python代码技巧,你肯定还不知道

人们还经常把 Python 笑称为「可执行伪码(executable pseudocode)」。但是,当你可以编写这样的代码时,很难去反驳这种言论:

1193
来自专栏racaljk

关于llvm kaleidoscope: 记一次Debug血泪之路

简而言之,慎(bu)用(yong)全局变量!                                

1221
来自专栏机器学习算法与Python学习

python初学者的建议

Python是一种非常富有表现力的语言。它为我们提供了一个庞大的标准库和许多内置模块,帮助我们快速完成工作。然而,许多人可能会迷失在它提供的功能中,不能充分利用...

42812
来自专栏进击的程序猿

The Clean Architecture in PHP 读书笔记(二)

设计模式是对软件中通用问题的总结,有了设计模式,方便我们进行交流,譬如一说MVC,我们就知道是怎么回事了,不然我们必须巴拉巴拉一大堆话去描述,不易于传播、交流,...

804
来自专栏Kirito的技术分享

JAVA 拾遗--JPA 二三事

记得前几个月,spring4all 社区刚搞过一次技术话题讨论:如何对 JPA 或者 MyBatis 进行技术选型?传送门:http://www.spring4...

41010
来自专栏WindCoder

异步JavaScript:从回调地狱到异步和等待

这是一个典型的异步编程挑战,您如何选择处理异步调用,在很大程度上,会导致或破坏您的应用程序,并且可能是您的整个启动。

5661
来自专栏Linyb极客之路

工作流引擎之activiti6实时流程图追踪

有接触过activiti的朋友可能知道,在activiti5.x的追踪流程节点查找,可以用

2.8K2
来自专栏斑斓

运用Aggregator模式实现MapReduce

《基于Actor的响应式编程》计划分为三部分,第一部分剖析响应式编程的本质思想,为大家介绍何谓响应式编程(Reactive Programming)。第二部分则...

3346
来自专栏深度学习自然语言处理

【收藏】这些Python代码技巧,你肯定还不知道

人们还经常把 Python 笑称为「可执行伪码(executable pseudocode)」。但是,当你可以编写这样的代码时,很难去反驳这种言论:

773
来自专栏星汉技术

Scala简介和安装

3016

扫码关注云+社区

领取腾讯云代金券