博客
关于我
区块链安全—合约存储机制安全分析
阅读量:204 次
发布时间:2019-02-28

本文共 1851 字,大约阅读时间需要 6 分钟。

Solidity智能合约安全分析与CTF题目研究

作为一种尚未成熟的编程语言,Solidity合约在运行机制和资源管理上存在诸多安全隐患。近年来,区块链安全研究逐渐深入,尤其是在以太坊平台上,研究者对智能合约的安全性关注日益增加。同时,区块链相关的CTF比赛题目频繁出现,逐渐引起了开发者的关注。本文将从智能合约的基本概念出发,深入分析Solidity中常见的安全问题,特别是针对call()和delegatecall()函数的上下文环境差异,结合实际CTF题目进行实验分析和漏洞利用。

智能合约的基本概念

智能合约是一种运行在区块链网络上的程序,其与传统程序的主要区别体现在以下几个方面:

  • 资金流整合能力:智能合约可以直接使用以太币进行资金流动,与传统程序无需通过中间服务器进行资金转移。
  • 部署与维护费用:智能合约部署时需要支付一定费用,但部署完成后无需定期维护费用。仅在合约执行时才需支付交易费用。
  • 存储成本:智能合约将数据存储在区块链上,存储成本较高。
  • 不可更改性:一旦部署到区块链上,智能合约的代码和存储数据无法更改。
  • call()与delegatecall()函数的上下文环境分析

    在Solidity中,call()和delegatecall()函数的使用涉及不同的上下文环境:

    • call()函数:调用目标合约的函数时,执行环境为被调用合约的上下文。调用时,msg.sender的值会被设置为调用者地址。
    • delegatecall()函数:调用目标合约的函数时,执行环境为调用者合约的上下文。msg.sender的值保持不变。

    通过实验分析可以发现,call()和delegatecall()在处理上下文环境上的差异可能导致严重的安全隐患。例如,在某些合约中,使用delegatecall()可能绕过普通用户的权限控制,从而实现对主合约状态的改写。

    实例分析:合约CTF题目

    以下是一个典型的CTF题目分析:

    合约代码

    pragma solidity ^0.4.23;contract Ttest {    address public addr1;    address public addr2;    address public owner;        bytes4 constant setTimeSignature = bytes4(keccak256("set(uint256)"));        constructor(address _a, address _b) public {        addr1 = _a;        addr2 = _b;        owner = msg.sender;    }        function First(uint _timeStamp) public {        addr1.delegatecall(setTimeSignature, _timeStamp);    }        function Second(uint _timeStamp) public {        addr2.delegatecall(setTimeSignature, _timeStamp);    }        function attack(string name) public returns(string) {        require(owner == msg.sender);        return "Congratulations attacker !!".append(name);    }}

    攻击步骤

  • 部署子合约:部署两个子合约,分别赋值给addr1和addr2。
  • 部署主合约:主合约初始化addr1和addr2地址,并设置owner为msg.sender。
  • 攻击合约部署:部署一个攻击合约,修改其中的set函数,使其能够修改主合约的owner地址。
  • 触发攻击:通过调用主合约的First()或Second()函数,传入攻击合约地址,成功绕过权限控制,修改owner地址。
  • 总结

    通过上述分析可以发现,Solidity智能合约的安全性高度依赖开发者的代码审查和合约设计。尤其是在处理call()和delegatecall()函数时,开发者需要特别注意上下文环境的变化,以避免潜在的安全漏洞。在实际应用中,定期对合约代码和状态进行审查,是预防智能合约安全隐患的重要手段。

    转载地址:http://xwwj.baihongyu.com/

    你可能感兴趣的文章
    Python+selenium+unittest的GUI自动化框架实现
    查看>>
    python函数拟合不规则曲线_Python计算&绘图——曲线拟合问题(转)
    查看>>
    python函数定义的基本格式_零基础学python-2.19 定义函数、调用函数与默认参数
    查看>>
    Python+Selenium之数据驱动测试的实现
    查看>>
    python函数定义与使用+返回值简解
    查看>>
    Python+Selenium登录
    查看>>
    Python日期时间模块
    查看>>
    Python函数合集:足足68个内置函数请收好!
    查看>>
    Python+Selenium自动化测试项目实战
    查看>>
    Python+Selenium自动化测试项目实战【建议收藏】
    查看>>
    Python+Selenium自动化测试:Page Object模式
    查看>>
    python+selenium进行cnblog的自动化登录测试
    查看>>
    Python函数只返回第一个值而不是数据框
    查看>>
    Python+SQL实战:京东用户行为数据分析案例解析(上)
    查看>>
    Python+SQL实战:京东用户行为数据分析案例解析(下)
    查看>>
    PYTHON+Twisted+sqlanydb=ABORT()
    查看>>
    Python函数之返回值、作用域和局部变量
    查看>>
    Python+统计学 | 探索常用的数据分析统计分布
    查看>>
    python, selenium中用于切换帧的函数
    查看>>
    python函数
    查看>>