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

    你可能感兴趣的文章
    Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
    查看>>
    Openlayers高级交互(18/20):根据feature,将图形适配到最可视化窗口
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    Openlayers高级交互(2/20):清除所有图层的有效方法
    查看>>
    Openlayers高级交互(20/20):超级数据聚合,页面不再混乱
    查看>>
    Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
    查看>>
    Openlayers高级交互(4/20):手绘多边形,导出KML文件,可以自定义name和style
    查看>>
    Openlayers高级交互(5/20):右键点击,获取该点下多个图层的feature信息
    查看>>
    Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
    查看>>
    Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
    查看>>
    Openlayers高级交互(8/20):选取feature,平移feature
    查看>>
    Openlayers高级交互(9/20):编辑图形(放缩、平移、变形、旋转),停止编辑
    查看>>
    Openlayers:DMS-DD坐标形式互相转换
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenLDAP(2.4.3x)服务器搭建及配置说明
    查看>>
    OpenLDAP编译安装及配置
    查看>>
    Openmax IL (二)Android多媒体编解码Component
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>