Mythril自动化测试智能合约并进行分类存储

 1、Mythril介绍

mythril工具是由以太坊开源社区所提供的安全分析工具,并且它是免费的,能够检测出Solidity智能合约中的安全漏洞并实现深入分析,是用以分析以太网智能合约及区块链应用安全分析工具及引擎。Mythril使用符号执行和SMT方案来分析检测智能合约代码中的各种安全漏洞,主要可以检测出的漏洞包括整数溢出、时间戳依赖、重入攻击等。

2、环境搭建与安装

本实验是在虚拟机Linux中使用的Ubuntu来做的,如果Ubuntu还不会配置与安装的可以先查看一下其他的帖子,再回来看这个。

1、安装Docker

sudo apt-get install docker.io

2、查看Docker的版本

sudo docker version

如果安装成功会出现如下的信息 

Mythril自动化测试智能合约并进行分类存储_第1张图片

3、启动Docker的服务

sudo service docker restart 

4、检查Docker服务有没有启动成功

5、安装Mythril

 sudo docker pull mythril/myth

Mythril自动化测试智能合约并进行分类存储_第2张图片

6、查看Mythril的各个命令

sudo docker run mythril/myth --help

Mythril自动化测试智能合约并进行分类存储_第3张图片

此时,docker和mythril都已经安装成功

3、mythril对单个智能合约进行检测 

在做对所有智能合约进行检测之前,我们先对单个合约进行检测。作为mythril检测智能合约的一个例子。

笔者这边也提供一个智能合约样本的网站:智能合约样本

首先先将一个智能合约样本test1.sol存放在了/home/wjw/test/1的文件夹下(也可以存放到你想存放的地方)

test1.sol(整数溢出漏洞)

pragma solidity 0.4.25;
contract Overflow_Add {
    uint public balance = 1;

    function add(uint256 deposit) public {
        balance += deposit;
    }
}

1、终端输入打开文件夹命令

cd /home

cd /home/wjw

cd /home/wjw/test

cd /home/wjw/test/1

 打开之后我们可以通过ls语句查看到存放在该文件夹下的test1.sol文件Mythril自动化测试智能合约并进行分类存储_第4张图片

 2、检测test1.sol

sudo docker run -v $(pwd):/home/wjw/test/1 mythril/myth analyze /home/wjw/test/1/source_code.sol

Mythril自动化测试智能合约并进行分类存储_第5张图片此时我们可以看出,使用工具mythril对test1.sol检测成功,并且显示错误类型为

SWC ID:101 

 对单个智能合约的检测如上所述,可以根据自己存放的位置来进行修改

4、利用Mythril对文件夹下的智能合约进行批量自动化检测

首先在/home/wjw/test下面创建了三个文件夹,分别命名为1、2、3,并在1、2、3中存放了一个智能合约样本,如图所示。

Mythril自动化测试智能合约并进行分类存储_第6张图片

Mythril自动化测试智能合约并进行分类存储_第7张图片

笔者这边的思路是:

1、我们是在Linux中进行的操作,因此这边自动化检测最好使用shell脚本,所以接下来的操作都是shell脚本中进行的

2、首先我们需要去遍历文件夹及文件子夹

3、查找到最后子夹中文件扩展名为“.sol”的文件

4、输入检测语句-->打开最终存储所需要检测智能合约的文件夹-->利用工具Mythril来检测智能合约

autoMythril.sh

#!/bin/bash

######################################################################
##                                                                  ##
##   Mythril自动测试智能合约并分类存储                                ##
##                                                                  ##
######################################################################

#递归遍历文件
function getdir(){
    for element in `ls $1`
    do  
        dir_or_file=$1"/"$element
        if [ -d $dir_or_file ]
        then 
            getdir $dir_or_file
        else
            #echo $1
            #echo $dir_or_file
            #查找文件扩展名为".sol"的文件
            check_suffix $element
            #在终端中输入基本语句
            cd /home
            cd /home/wjw
            cd /home/wjw/test
            #打开最终存储所需要检测智能合约的文件夹
            cd $1
            sudo docker run -v $(pwd):$1 mythril/myth analyze $dir_or_file
        fi  
    done
}
#查找文件扩展名为".sol"的文件
check_suffix()
{
    file=$1
    
    if [ "${file##*.}"x = "sol"x ];then
        echo $file
    fi    
}
 

root_dir="/home/wjw/test"
getdir $root_dir

运行脚本可以得到如图所示,可以看出我们脚本成功实现了此要求

Mythril自动化测试智能合约并进行分类存储_第8张图片

 之后为了可以更好的分类良性与恶性的样本,笔者这边对脚本进行了一个升级,思路如下

1、将终端检测结果存放入到当前文件夹下的result.txt文件中

2、根据result.txt中的关键字符串来判断将它移动到恶性还是良性文件夹下

由于在笔者多次试验后遇到了一些比较奇怪的检测结果(在文章的最后会附上),因此这边根据关键字符串来进行判断时,只有出现良性语句的才判断为良性并存放到良性的文件夹下,除此之外的统一判断为恶性的样本。

完善的脚本autoMythrilPro.sh

#!/bin/bash

######################################################################
##                                                                  ##
##   Mythril自动测试智能合约并分类存储                                ##
##                                                                  ##
######################################################################

#递归遍历文件
function getdir(){
    for element in `ls $1`
    do  
        dir_or_file=$1"/"$element
        if [ -d $dir_or_file ]
        then 
            getdir $dir_or_file
        else
            #echo $1
            #echo $dir_or_file
            #查找文件扩展名为".sol"的文件
            check_suffix $element
            #在终端中输入基本语句
            cd /home
            cd /home/wjw
            cd /home/wjw/test
            #打开最终存储所需要检测智能合约的文件夹
            cd $1
            #利用工具Mythril来检测智能合约,并将检测信息放到文件下的result.txt中
            sudo docker run -v $(pwd):$1 mythril/myth analyze $dir_or_file > result.txt
            #查找文件中是否有相应匹配的字符串
            FIND_FILE="$1/result.txt"
            
            FIND_STR="The analysis was completed successfully. No issues were detected."
            
        
             # 判断匹配函数,匹配函数不为0,则包含给定字符,按类分别存储有漏洞的智能合约
            if [ `grep -c "$FIND_STR" $FIND_FILE` -ne '0' ];then
                         mv $1 /home/wjw/result/Normal
            else
                         mv $1 /home/wjw/result/Malicious       
            fi
        fi  
    done
}
#查找文件扩展名为".sol"的文件
check_suffix()
{
    file=$1
    
    if [ "${file##*.}"x = "sol"x ];then
        echo $file
    fi    
}
 

root_dir="/home/wjw/test"
getdir $root_dir

 此时检测成功会出现如下的结果

Mythril自动化测试智能合约并进行分类存储_第9张图片

Mythril自动化测试智能合约并进行分类存储_第10张图片

以上就是整个的实验过程

5、附录 

 Mythril自动化测试智能合约并进行分类存储_第11张图片Mythril自动化测试智能合约并进行分类存储_第12张图片

Mythril自动化测试智能合约并进行分类存储_第13张图片以上的判断为智能合约本身的错误 

 还会出现“UTF-8”的错误,这是存储时没有保存为UTF-8的格式,可以在文件的另存为上进行修改

Mythril自动化测试智能合约并进行分类存储_第14张图片

梦想是不会发光的,发光的是追梦的我们,翻过这座山,他们就会听到你的故事。不管故事的结局是什么,当某人询问你时,你可以慷慨的向她描述来时路上的一路生花。或许,你也是某人翘首以盼的惊喜,你未来的样子都藏在了现在的努力里,那么不妨大胆一点,“少年者,思无邪,而大道就在脚下,走!”

你可能感兴趣的:(智能合约工具Mythril,智能合约,bash,docker,ubuntu,区块链)