前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >智能合约安全审计之路-访问控制漏洞

智能合约安全审计之路-访问控制漏洞

作者头像
字节脉搏实验室
发布2020-03-08 14:33:14
1.2K0
发布2020-03-08 14:33:14
举报

核心问题:publi c的恶意使用(本次案例合约为例) ) )

作者-毕竟话少

描述:合约没有设置合理的访问控制模型,以及没有对合约有效的校验导致访问控制漏洞的发生

核心问题:public的恶意使用(本次案例合约为例)

漏洞描述

智能合约的访问控制漏洞主要体现在以下俩个方面:

  • 代码层面可见性

针对函数和变量,限制其所能被修改和调用的作用域

  • 逻辑层面权限约束

通常针对函数,限制某些特权用户访问

代码层面可见性的函数普及:

  • public

默认状态下,可以进行任何形式的调用

  • external

可以通过其他合约或者交易来调用,不能在合约内部进行调用

  • internal

只能在合约(含子合约)内部进行调用

  • private

只能在合约(不包含子合约)内部进行调用

逻辑层面的权限约束的函数普及:

  • modifier

1.用于函数执行前的函数检查

2.可以设置参数

3.特殊符号“_”用于指代函数代码的执行位置

代码语言:javascript
复制
modifier noReetrancy() {
   if (locked) throw;
   locked = true;
   _;
   locaked = false;
}

漏洞合约分析

代码语言:javascript
复制
pragma solidity ^0.4.24;
 
contract AccessGame{
     
    uint totalSupply=0;
    address public owner;
    mapping (address => uint256) public balances;
 
    event SendBouns(address _who, uint bouns);
 
    modifier onlyOwner {
        if (msg.sender != owner)
            revert();
        _;
    }
     
    constructor() public {
        initOwner(msg.sender);  //initOwner()初始化管理员权限
    }
 
    function initOwner(address _owner) public{
        owner=_owner;
    }
 
    function SendBonus(address lucky, uint bouns) public onlyOwner returns (uint){
        require(balances[lucky]<1000);
        require(bouns<200);
        balances[lucky]+=bouns;
        totalSupply+=bouns;
 
        emit SendBouns(lucky, bouns);
 
        return balances[lucky];
    }
}

漏洞点:第21行,在进行初始化管理员的时候,并没有对init0wner()函数设置合理权限,使用public函数进行调用(默认状态下,可以进行任何形式的调用),攻击者可以自己调用init0wner()函数使自己成为管理员,从而调用SendBonus()增加自己的balances

使用Remix进行进行调试

  • 首先对合约进行编译(Current version设置为0.4.24,Auto compile,Enable Optimization全部勾上。编译完成后会出现1个合约为AccessGame
  • 首先部署AccessGame(漏洞合约),Account设置默认管理员地址(0Xca3…a733c),点击Deploy,部署完成后,首先点击owner,查看管理员为(0xca3…a733c),到这里漏洞合约就已经部署完成了
  • 模拟攻击调试,Account换一个地址为攻击者地址(0x147…c160c),由于init0wner()函数是使用public自由调用的,所以这里直接将攻击者地址(0x147…c160c)复制粘贴到init0wner处点击即可,这里使用owner查看发现管理员为(0x147…c160c),已被成功越权替换,由于这里攻击者地址已经被设置为管理员权限了,所以可以直接调用SendBonus()为自己账户添加ETH(lucky设置为0x147…c160c,bouns设置为100 wei ETH),点击transact进行充值,充值完成后使用Balances进行查看,发现攻击者账户为100 wei ETH,实验成功。

漏洞预防

  1. 设计合理的访问控制模型,并在代码中进行校验
  2. 合理使用可见性约束和modifier
  3. 使用形式化验证检测智能合约的访问控制漏洞
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 字节脉搏实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 漏洞描述
    • 智能合约的访问控制漏洞主要体现在以下俩个方面:
      • 代码层面可见性的函数普及:
        • 逻辑层面的权限约束的函数普及:
        • 漏洞合约分析
        • 使用Remix进行进行调试
        • 漏洞预防
        相关产品与服务
        区块链
        云链聚未来,协同无边界。腾讯云区块链作为中国领先的区块链服务平台和技术提供商,致力于构建技术、数据、价值、产业互联互通的区块链基础设施,引领区块链底层技术及行业应用创新,助力传统产业转型升级,推动实体经济与数字经济深度融合。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档