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求解器, 云安全监控, 以太坊安全, 区块链安全工具, 可配置连接, 合约漏洞扫描, 安全检测引擎, 形式化验证, 智能合约审计, 程序分析, 符号执行, 跨平台安全, 逆向工具, 静态分析