gongbell/WANA
GitHub: gongbell/WANA
基于符号执行的WebAssembly字节码分析引擎,用于跨平台智能合约漏洞检测。
Stars: 32 | Forks: 7
# WANA
一个针对 Wasm 字节码的符号执行引擎和一个跨平台智能合约漏洞检测器
有关技术细节,请查看我们在 arxiv 上的论文:
https://arxiv.org/abs/2007.15510
WANA:针对跨平台智能合约漏洞检测的 Wasm 字节码符号执行
作者:Dong Wang, Bo Jiang, W.K. Chan
如果您有任何问题,请联系 Bo Jiang 博士 (gongbell@gmail.com)。
## 智能合约
为了评估智能合约,需要 wasm 智能合约。wasm 字节码文件由以下两个来源生成。
+ EOSIO 智能合约。使用官方开发工具包,开发者可以将 cpp 或 rust 源代码编译为 wasm
+ Ethereum 智能合约。通过 [solc](https://github.com/ethereum/solidity/releases) 编译 solidity 源代码(详情见下文),开发者可以获得相应的 wasm 文件。
当然,WANA 可以执行除智能合约以外的任何 wasm 文件。因此,任何有效的 wasm 文件都将被正确地符号执行。
## 项目结构
WANA 的主要组件如下。
+ `wana.py` 是入口点,它读取一个 wasm 文件或包含 wasm 文件的目录进行符号执行。
+ `sym_exec.py` 是符号执行的逻辑,它包括函数级和指令级的执行。
+ `bug_analyzer.py` 是漏洞分析单元,因此所有记录或模式匹配逻辑都在这里。
+ `global_variables.py` 保存在符号执行期间的状态,包括漏洞计数、循环深度等。
+ `bin_format.py` 和 `bin_reader.py` 分别包含字节码二进制表示和读取方法。
+ `structure.py` 和 `runtime.py` 表示 WebAssembly 字节码结构和虚拟机运行时结构。
+ `number.py`、`utils.py` 和 `logger.py` 是辅助模块。
+ `emulator.py` 是用于库函数模拟的模块。
## 前置条件
需要以下 Python 包。
+ six==1.14.0
+ func_timeout==4.3.5
+ z3-solver==4.8.8.0
该项目是在 Ubuntu 18.04 下开发的,因此原则上它兼容之后的版本。
## 用法
应该有一个 wasm 格式的已编译智能合约。EOSIO 和 Ethereum 智能合约可以按如下方式编译。
### EOSIO 智能合约
EOSIO 智能合约是使用 cpp 或 rust 开发的,例如 [appdemo](./examples/EOSIO_contracts/appdemo/appdemo.cpp)。
首先,根据其 [README](https://github.com/EOSIO/eosio.cdt/blob/master/README.md) 安装 [eosio.cdt](https://github.com/EOSIO/eosio.cdt)。然后,使用以下命令编译上述智能合约。
```
eosio-cpp appdemo.cpp -o appdemo.wasm
```
### Ethereum 智能合约
Ethereum 智能合约源代码的类型是 solidity。我们已经准备了可用于执行的 wasm 文件及其 solidity 源代码。如果您想自己编译 solidity,目前 solidity 官方可以完成从 solidity 编译智能合约到 WebAssembly 的过程。这个工具是 [solc](https://github.com/ethereum/solidity/releases)。
然而,它仍处于实验过程中。因此,我们建议使用 [0.7.5 版本的 solc](https://github.com/ethereum/solidity/releases/tag/v0.7.5)。下载 solc 后,使用以下命令编译智能合约。(**example.sol** 是智能合约路径,**example_directory** 是输出目标目录)
例如,[example.sol](./examples/Ethereum_contracts/delegatecall_samples/Router.sol)。
```
./solc-static-linux --ewasm example.sol -o example_directory
```
此命令将输出两个文件,example.wasm 和 example.wast。由于 solc 仍处于实验阶段,输出的 example.wasm 不包含智能合约的执行逻辑。
我们需要从 example.wast 中分离出实际用于执行的 wasm 代码。
### 分析
以下命令将分析 EOSIO 智能合约 `contract.wasm`,超时时间为 20 秒。`-t` 是可选的,如果未设置 `-t`,符号执行将不会被中断,直到完成分析。
```
python3 wana.py -t 20 -e contract.wasm
```
要分析 Ethereum 智能合约,需要选项 `--sol`。
```
python3 wana.py --sol -e ethereum_contract.wasm
```
如果您想获得完整的执行信息,可以设置选项 `--lvl`,`1` 表示基本信息,最高为 `3`
```
python3 wana.py --sol -e --lvl 1 ethereum_contract.wasm
```
## 输入和输出
目前,WANA 仅支持 wasm 文件作为其输入。输出,即漏洞报告,是 stdout。输出格式如下。
```
contract.wasm: fake eos found
contract.wasm: forged transfer notification found
```
## 参考网站
1. https://webassembly.org/
2. https://github.com/WebAssembly/
3. https://developer.mozilla.org/en-US/docs/WebAssembly
4. https://github.com/EOSIO/eosio.cdt
5. https://github.com/second-state/SOLL
标签:AI工具, EOSIO安全, Python安全工具, Wasm字节码, WebAssembly, Z3求解器, 云安全监控, 以太坊安全, 区块链安全工具, 可配置连接, 合约漏洞扫描, 安全检测引擎, 形式化验证, 智能合约审计, 程序分析, 符号执行, 跨平台安全, 逆向工具, 静态分析