如何使用Manticore来发现智能合约漏洞
本教程的目的是展示如何使用 Manticore 自动发现智能合约中的漏洞。
安装
Manticore 需要使用 python 3.6。 它可以通过 pip 或使用 docker 来安装。
使用 docker 的 Manticore
docker pull trailofbits/eth-security-toolboxdocker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox
最后一个命令在一个可访问您当前目录的 docker 中运行 eth-security 工具箱。 您可以更改您主机中的文件,并从 docker 中运行文件上的工具
在 docker 中,运行:
solc-select 0.5.11cd /home/trufflecon/
使用 pip 的 Manticore
pip3 install --user manticore
建议采用 solc 0.5.11。
运行脚本
使用 python 3 运行一个 python 脚本:
python3 script.py
动态符号化执行简介
Nutshell 中的动态符号化执行
动态符号化执行(DSE)是一种程序分析技术,用于探究具有高度语义意识的状态空间。 这项技术是基于 "程序路径"的发现 ,以一种称为path predicates的数学公式表示。 就概念来说,这种技术对路径预测的操作分为两步:
- 它们是利用对程序输入的约束来构建的。
- 它们被用来生成程序输入,从而导致相关路径的执行。
这种方法不会产生误报,因为所有被识别的程序状态都可以在具体执行过程中被触发。 例如,如果分析发现了一个整数溢出,就可以保证它是可重现的
路径预测示例
为了了解 DSE 如何工作,请考虑以下示例:
1f(uint a).23 if (aa== 65) }4 // bug 存在567}8复制
因为 f()包含两个路径,DSE 将构建两个不同的路径预测:
- 路径 1:
a == 65 - 路径 2:
Not (a == 65)
每个路径预测都是一个数学公式,可以传递给所谓的 SMT 求解器,求解器将尝 试解方程式。 对于路径1,求解器会说,可以用a=65探索路径。 对于路径2,求解器可以给a指定一个 65 以外的任何值,例如a=0。
验证属性
Manticore 允许完全控制每个路径的所有执行情况。 因此,它允许您在几乎任何东西上添加任意限制。 这种控制允许在合约上创建财产。
请考虑下面的示例:
1function unsafe_add(uint a, uint b) returns(uint c)。2 c = a + b;// no overflow protection3 return c;4}5复制
函数中只有一个要探索的路径:
- 路径 1:
c = a + b
使用 Manticore,您可以对溢出进行检查,并对路径预测加以限制:
c = a + b AND (c < a OR c < b)
如果有可能找到一个a和b的估值,对于这个估值,上面的路径预测是可行的,这意味着您发现了一个溢出。 例如,求解器可以生成输入a = 10 , b = MAXUINT256。
如果您考虑一个固定版本:
1function safe_add(uint a, uint b) returns(uint c){2 c = a + b;3 require(c->=a);4 require(c)>=b);5 return c;6}7复制
与溢出检查相关的公式是:
c = a + b AND (c >= a) AND (c=>b) AND (c < a OR c < b)
这个公式无法得以解决;在其他领域,这是一个在safe_add中,c总会增加的证明。
因此,DSE 是一个强大的工具,可以验证您代码的任意限制。
在 Manticore 下运行
我们将看到如何探索使用 Manticore API 的智能合约。 目标是以下智能合约example.sol:
1pragma solidity >=0.4.24 <0.6.0;23contract Simple {4 function f(uint a) payable public{5 if (a == 65) {6 revert();7 }8 }9}10显示全部复制
运行一个独立的探索方式
您可以通过以下命令直接在智能合约上运行 Manticore(project可以是一个 Solidity 文件,或者是项目目录):
$ manticore project
您将会获得像这个一样的测试案例输出(顺序可能有变):
1...2... m.c.manticore:INFO: Generated testcase No. 0 - STOP3... m.c.manticore:INFO: Generated testcase No. 1 - REVERT4... m.c.manticore:INFO: Generated testcase No. 2 - RETURN5... m.c.manticore:INFO: Generated testcase No. 3 - REVERT6... m.c.manticore:INFO: Generated testcase No. 4 - STOP7... m.c.manticore:INFO: Generated testcase No. 5 - REVERT8... m.c.manticore:INFO: Generated testcase No. 6 - REVERT9... m.c.manticore:INFO: Results in /home/ethsec/workshops/Automated Smart Contracts Audit - TruffleCon 2018/manticore/examples/mcore_t6vi6ij310...11显示全部
在没有额外信息的情况下,Manticore 将利用新的符号交易探索智能合约,直到它不再探索合约上的新途径为止。 Manticore 不会在失败后执行新的交易(如恢复原状后)。
Manticore 将在一个mcore_*目录中输出信息。 除其他外,您将在这个目录中找到:
global.summary:覆盖面和编译器警告test_XXXXX.summary:覆盖面、前一次的说明、每次测试案例的帐户余额test_XXXXX.tx:每个测试案例的交易详细列表
在这里,Manticore 发现了 7 个测试案例,它们对应于(文件名顺序可能会改变):
| 交易 0 | 交易 1 | 交易 2 | 结果 | |
|---|---|---|---|---|
| test_00000000.tx | 合约创建 | f(!=65) | f(!=65) |