Mythril 以太坊智能合约安全分析与检测工具详解(一)

这篇具有很好参考价值的文章主要介绍了Mythril 以太坊智能合约安全分析与检测工具详解(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mythril是以太坊EVM字节码的安全分析工具。它检测以太坊、Hedera、Quorum、Vechain、Roostock、Tron和其他兼容evm的区块链构建的智能合约中的安全漏洞。它使用符号执行、SMT方案来分析检测智能合约代码中的各种安全漏洞。

安装

通过 Docker 获取:

$ docker pull mythril/myth

从 Pypi 安装:

$ pip3 install mythril

目前,Mythril 支持 MacOS 和 Ubuntu,不支持 Windows。

用法

Mythril 支持 Solidity 源代码和合约地址的检测。

运行:

$ myth analyze <solidity-file>

或者:

$ myth analyze -a <contract-address>

实践

本文介绍在 Ubuntu 操作系统环境下的工具安装和检测分析过程。

Docker 环境下安装

经笔者实践,采用非 Docker 方式安装时,安装过程报错。 所以本检测分析过程基于 Docker 环境。

所有的 Mythril 版本,从 v0.18.3 开始,都以 mythrl/myth 的名称作为 Docker images 发布到 Docker Hub。

安装 Docker CE 后,通过以下命令 pull 最新版本的 mythril/myth:

$ docker pull mythril/myth

使用 docker 运行mythrl/myth,就像你使用 myth 命令一样。

查看 mythril/myth 帮助的命令如下:

$ docker run mythril/myth --help

检测分析 Solidity 源代码的命令如下:

$ docker run -v $(pwd):/tmp mythril/myth analyze /tmp/contract.sol

用于检测的合约源码

Roulette.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22;

contract Roulette {
    uint public pastBlockTime;
 
    // initially contract
    constructor() {}

    // receive function
    receive() external payable {}

    // fallback function used to make a bet
    fallback() external payable {
        require(msg.value == 1 ether); // must send 1 ether to play
        require(block.timestamp != pastBlockTime);  // only 1 transaction per block
        pastBlockTime = block.timestamp;
        if(block.timestamp % 15 == 0) { // winner
            payable(msg.sender).transfer(address(this).balance);
        }
    }
}

以上这个智能合约有一个时间戳依赖漏洞。时间戳依赖是指智能合约的执行依赖于当前区块的时间戳,如果时间戳不同,那么合约的执行结果也有差别。智能合约中取得时间戳只能依赖某个节点(矿工)来做到。这就是说,合约中取得的时间戳是由运行其代码的节点(矿工)的计算机本地时间决定的。理论上,这个本地时间是可以由矿工控制的。因此,如果在智能合约中不正确地使用区块时间戳,这将是非常危险的。

检测分析过程

接下来,让我们观察 Mythril 工具对这个合约的检测分析结果。

首先,我们把这个合约文件传递到 Ubuntu 主机的 ”/var/tmp/solidity_examples“ 目录。

然后,通过以下命令来对合约源码执行检测分析:

$ docker run -v $(pwd):/var/tmp/solidity_examples mythril/myth analyze /var/tmp/solidity_examples/Roulette.sol

耐心等待几分钟后(这个执行时间取决于主机的配置,大概在1分钟到几分钟不等),我们看到检测结果如下:

==== Dependence on predictable environment variable ====
SWC ID: 116
Severity: Low
Contract: Roulette
Function name: fallback
PC address: 70
Estimated Gas Usage: 918 - 1013
A control flow decision is made based on The block.timestamp environment variable.
The block.timestamp environment variable is used to determine a control flow decision. Note that the values of variables like coinbase, gaslimit, block number and timestamp are predictable and can be manipulated by a malicious miner. Also keep in mind that attackers know hashes of earlier blocks. Don't use any of those environment variables as sources of randomness and be aware that use of these variables introduces a certain level of trust into miners.
--------------------
In file: /var/tmp/solidity_examples/Roulette.sol:16

imestamp != pastBlockTime);  // only 1 tr

--------------------
Initial State:

Account: [CREATOR], balance: 0xd, nonce:0, storage:{}
Account: [ATTACKER], balance: 0x0, nonce:0, storage:{}

Transaction Sequence:

Caller: [CREATOR], calldata: , value: 0x0
Caller: [SOMEGUY], function: unknown, txdata: 0x01010101, value: 0xde0b6b3a7640000

==== Dependence on predictable environment variable ====
SWC ID: 116
Severity: Low
Contract: Roulette
Function name: fallback
PC address: 102
Estimated Gas Usage: 6134 - 26229
A control flow decision is made based on The block.timestamp environment variable.
The block.timestamp environment variable is used to determine a control flow decision. Note that the values of variables like coinbase, gaslimit, block number and timestamp are predictable and can be manipulated by a malicious miner. Also keep in mind that attackers know hashes of earlier blocks. Don't use any of those environment variables as sources of randomness and be aware that use of these variables introduces a certain level of trust into miners.
--------------------
In file: /var/tmp/solidity_examples/Roulette.sol:18

p % 15 == 0) { // winner
            payable(msg.sender).transfer(address(this).balance);
        }
    }
}

--------------------
Initial State:

Account: [CREATOR], balance: 0x4000142021000000, nonce:0, storage:{}
Account: [ATTACKER], balance: 0x0, nonce:0, storage:{}

Transaction Sequence:

Caller: [CREATOR], calldata: , value: 0x0
Caller: [SOMEGUY], function: unknown, txdata: 0x01010101, value: 0xde0b6b3a7640000

通过以上的检测分析结果,我们大致可以得出结论,Mythril 工具确实检测出了 Roulette.sol 这个合约中的漏洞。合约代码中的两个地方存在时间戳依赖漏洞。

让我们对检测结果做进一步的解释,其中:

SWC ID: 116 —— 表示该漏洞的分类编号,详见 智能合约缺陷分类和测试用例

Severity: Low —— 表示该漏洞的严重性程度

Contract: Roulette —— 表示检测的合约名称

Function name: fallback —— 表示发现漏洞的函数名称

PC address: 70 —— 表示程序计数器,Program Counter 的简称

Estimated Gas Usage: 918 - 1013 —— 表示估算的 Gas 费用开销

接下来是对此漏洞的描述,让我们看一下翻译后的结果:

控制流的决定是基于区块的时间戳环境变量。block.timestamp 环境变量用于确定控制流决策。请注意,coinbase、gaslimit、block number 和 timestramp 等变量的值是可预测的,可以被恶意矿工操纵。还要记住,攻击者知道早期块的哈希值。请注意,不要使用任何这些环境变量作为随机性的来源,并且确保使用的这些变量对矿工是可信任的。

再接下来是漏洞代码在合约代码中的行号,并给出了代码段,以及合约的初始状态和交易序列。

本篇介绍了 Mythril 以太坊智能合约安全分析工具及其安装指南,并通过一个合约实例演示了该工具对 Solidity 合约源代码的检测命令及检测分析结果。下一篇我们将演示用该工具来对一个合约地址进行检测分析,观察分析结果是否如我们预期的一样。文章来源地址https://www.toymoban.com/news/detail-473942.html

到了这里,关于Mythril 以太坊智能合约安全分析与检测工具详解(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【区块链 | 智能合约】Ethereum源代码(11)- 以太坊核心BlockChain源码分析

    前面几节都在分析以太坊的通信协议,怎么广播,怎么同步,怎么下载。这一节讲讲以太坊的核心模块BlockChain,也就是以太坊的区块链。 一,BlockChain的初始化 Ethereum服务初始化func init() 的时候会调用core.SetupGenesisBlock来加载创始区块。顾名思义,创始区块就是以太坊区块链中

    2024年02月08日
    浏览(48)
  • 【区块链 | 智能合约】Ethereum源代码(3)- 以太坊RPC通信实例和原理代码分析(上)

    上一节提到,以太坊在node start的时候启动了RPC服务,以太坊通过Rpc服务来实现以太坊相关接口的远程调用。这节我们用个实例来看看以太坊 RPC是如何工作的,以及以太坊RPC的源码的实现 1,RPC启动命令 : go-ethereum的RPC服务默认地址:http://localhost:8545/ 通过以下命令修改默认地

    2024年02月02日
    浏览(70)
  • 【区块链 | 智能合约】Ethereum源代码(8)- Ethereum服务和以太坊P2P协议发送广播源码分析

    在“【区块链 | 智能合约】Ethereum源代码(2)- go-ethereum 客户端入口代码和Node分析”一文中,我们提到Ethereum作为一个service,被Node 注册进去。Node start的时候会启动其注册的所有服务,Ethereum service也是一样。 初始化方法

    2024年01月21日
    浏览(54)
  • 【论文阅读】 智能合约安全漏洞检测技术研究综述

    2016 年 6 月,黑客利用 DAO(decentralized autonomous organization)合约的 可重入漏洞 , 窃取了价值约 6000 万美元的以太币(即以太坊数字货币); 2017 年 7 月, 由于 Parity 多签名钱包合约的 Delegatecall 漏洞 (parity multi-sig wallet delegatecall), 价值近 3 亿美元的以太币被冻结; 2018 年 4 月, 恶意攻击者

    2024年03月14日
    浏览(63)
  • slither——区块链智能合约静态分析工具

    Slither是一个用Python 3编写的智能合约静态分析框架(源码),提供如下功能: 自动化漏洞检测。提供超30多项的漏洞检查模型,模型列表详见:https://github.com/crytic/slither#detectors 自动优化检测。Slither可以检测编译器遗漏的代码优化项并给出优化建议。 代码理解。Slither能够绘

    2024年01月16日
    浏览(46)
  • 智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击

    Safful发现了一个有趣的错误,有可能成为一些 DeFi 项目的攻击媒介。这个错误尤其与著名的 ERC777 代币标准有关。此外,它不仅仅是众所周知的黑客中常见的简单的重入问题。 这篇文章对 ERC777 进行了全面的解释,涵盖了所有必要的细节。深入研究 ERC777 代币的具体细节的资源

    2024年02月04日
    浏览(39)
  • 智能合约安全分析,Vyper 重入锁漏洞全路径分析

    7 月 30 日 21:10 至 7 月 31 日 06:00 链上发生大规模攻击事件,导致多个 Curve 池的资金损失。漏洞的根源都是由于特定版本的 Vyper 中出现的重入锁故障。 通过对链上交易数据初步分析,我们对其攻击的交易进行整理归纳,并对攻击流程进一步的分析,由于攻击涉及多个交易池。

    2024年02月09日
    浏览(47)
  • 生态工具箱 | 虚拟机测试工具WasmFuzzer,智能合约安全防火墙

    长安链生态工具箱   丰富实用的区块链生态工具不仅可以让开发者部署、开发过程更加得心应手,还可以从能力上扩展区块链应用边界。长安链正在构建强大的生态工具箱以增强在其在各类场景下的应用能力,如智能合约漏洞检测、抗量子多方安全计算、链迁移、密文检索

    2024年02月10日
    浏览(50)
  • 【ETH】以太坊合约智能合约逆向方案

    技术角度了解区块链 在反编译之前,你需要先知道如果获取编译后的字节码。 这里以 USDT 举例

    2024年02月09日
    浏览(35)
  • 以太坊智能合约开发(五):Solidity成绩录入智能合约实验

    每个学生分别部署合约Student.sol ,保证只有自己可以修改姓名。老师部署合约StudentScore.sol,用于录入学生成绩,查询学生信息。查询学生信息时,需要调用学生部署的合约Student.sol。 student.sol合约,用于学生对自己信息进行管理。 学生的基本信息作为状态变量: 声明构造函

    2024年02月07日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包