博客
关于我
区块链安全—合约存储机制安全分析
阅读量: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/

    你可能感兴趣的文章
    POJ 2186:Popular Cows Tarjan模板题
    查看>>
    POJ 2229 Sumsets(递推,找规律)
    查看>>
    poj 2236
    查看>>
    POJ 2243 Knight Moves
    查看>>
    POJ 2262 Goldbach's Conjecture
    查看>>
    POJ 2362 Square DFS
    查看>>
    Qt笔记——解决添加Qt Designer Form Class时“allocation of incomplete type Ui::”
    查看>>
    poj 2386 Lake Counting(BFS解法)
    查看>>
    poj 2387 最短路模板题
    查看>>
    POJ 2391 多源多汇拆点最大流 +flody+二分答案
    查看>>
    POJ 2403
    查看>>
    poj 2406 还是KMP的简单应用
    查看>>
    POJ 2431 Expedition 优先队列
    查看>>
    Qt笔记——获取位置信息的相关函数
    查看>>
    POJ 2484 A Funny Game(神题!)
    查看>>
    POJ 2486 树形dp
    查看>>
    POJ 2488:A Knight's Journey
    查看>>
    SpringBoot为什么易学难精?
    查看>>
    poj 2545 Hamming Problem
    查看>>
    poj 2723
    查看>>