修饰器(modifier)相关漏洞分析

一、媒介

修饰器(modifier)可以改变函数的行径,例如作为前置的检测前提。同时修饰用具有可承袭属性,可以由派生合约中的定义覆盖。本次BUGX.IO区块链安然讲堂给大年夜家进行修饰器的相关破绽阐发。

二、什么是修饰器

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

pragma solidity ^0.4.24;

contract Foo {

address public owner;

constructor() public {

owner = msg.sender;

}

modifier onlyOwner() {

require(msg.sender == owner);

_;

}

function foo() onlyOwner public view returns(bool){

return true;

}

}

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

modifier assertValueIsOne(uint value) {

assert(value == 1);

_; // original function goes at this point

}

function doSomething(uint value) assertValueIsOne(value) {

// do Something

}

三、常见修饰器

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

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

modifier onlyOwner(){

if(msg.sender != owner){ throw;}

_;

}

modifieronlyOwner{

if(msg.sender != owner){

revert();

}else{

_;

}

}

modifier onlyOwner() {

if(msg.sender != owner) revert();

_;

}

modifier onlyOwner() {

require(msg.sender == owner);

_;

}

modifier onlyOwner {

assert(msg.sender == owner);

_;

}

日志记录:

event StartEvent();

event FinishEvent();

modifier logEvents {

StartEvent();

_;

FinishEvent();

}

function toggle () logEvents {

}

四、常见修饰器破绽类型

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

修饰器中的判断差错,导致修饰器无法起到开拓者预期的节制感化。

如 I_See_Voice_Token (ISVT) 合约 :

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

modifieronlyOwner() {

require(msg.sender != owner);

_;

}

精确的写法应该是 `==` ,结果错写成了 `!=`,从面造成了权限节制掉效。

2、Modifier Invalid Check 修饰器检测无效破绽

缺少应用 if、 if throw、if revert()、require、assert 作为前提判断,使得判断无效,导致修饰器的权限节制功能掉效。

如 BancorKiller 合约 :

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

modifier onlyAdmin() {

msg.sender == admin;

_;

}

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

pragma solidity ^0.4.24;

contract foo {

address public admin;

constructor() public {

admin = msg.sender;

}

modifier onlyAdmin_flaw() {

msg.sender == admin;

_;

}

function foo_flaw() onlyAdmin_flaw public view returns(bool){

return true;

}

modifier onlyAdmin_right() {

require(msg.sender == admin);

_;

}

function foo_right() onlyAdmin_right public view returns(bool){

return true;

}

}

3、更繁杂的环境带参修饰器破绽

因为修饰器能够带参履行,这种类型的破绽就只能按照实际环境进行阐发。

五、修复规划

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

六、参考资料

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

七、公司先容

BUGX.IO是一家致力于区块链领域的安然公司。核心团队组建于2014年,我们在区块链生态安然、行业办理规划、安然扶植、红蓝抗衡等方面有深挚积累与过硬专业素养。

赞(0) 打赏
分享到: 更多 (0)
免责申明:本站所有资料均来自于网络,版权归原创者所有!本站不提供任何保证,不保证真实性,并不承担任何法律责任

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

阿里云优惠网 更专业 更优惠

阿里云优惠券阿里云大礼包