mythril工具是由以太坊开源社区所提供的安全分析工具,并且它是免费的,能够检测出Solidity智能合约中的安全漏洞并实现深入分析,是用以分析以太网智能合约及区块链应用安全分析工具及引擎。Mythril使用符号执行和SMT方案来分析检测智能合约代码中的各种安全漏洞,主要可以检测出的漏洞包括整数溢出、时间戳依赖、重入攻击等。
本实验是在虚拟机Linux中使用的Ubuntu来做的,如果Ubuntu还不会配置与安装的可以先查看一下其他的帖子,再回来看这个。
1、安装Docker
sudo apt-get install docker.io
2、查看Docker的版本
sudo docker version
如果安装成功会出现如下的信息
3、启动Docker的服务
sudo service docker restart
4、检查Docker服务有没有启动成功
5、安装Mythril
sudo docker pull mythril/myth
6、查看Mythril的各个命令
sudo docker run mythril/myth --help
此时,docker和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文件
2、检测test1.sol
sudo docker run -v $(pwd):/home/wjw/test/1 mythril/myth analyze /home/wjw/test/1/source_code.sol
此时我们可以看出,使用工具mythril对test1.sol检测成功,并且显示错误类型为
SWC ID:101
对单个智能合约的检测如上所述,可以根据自己存放的位置来进行修改
首先在/home/wjw/test下面创建了三个文件夹,分别命名为1、2、3,并在1、2、3中存放了一个智能合约样本,如图所示。
笔者这边的思路是:
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
运行脚本可以得到如图所示,可以看出我们脚本成功实现了此要求
之后为了可以更好的分类良性与恶性的样本,笔者这边对脚本进行了一个升级,思路如下
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
此时检测成功会出现如下的结果
以上就是整个的实验过程
还会出现“UTF-8”的错误,这是存储时没有保存为UTF-8的格式,可以在文件的另存为上进行修改