rustle
v2.0

沙沙作响是Rust近智能合约的自动静态分析器。它可以帮助将几十个不同的漏洞定位在近乎智能合约中。根据Defillama的说法,在附近的前10名DAPP中,有8个由Blocksec审核。凭借丰富的审计经验和对近协议的深刻理解,我们构建了此工具并与社区分享。
在Linux中使用以下命令安装所需的工具包。命令在Ubuntu 20.04 LTS中进行了测试。
# install Rust Toolchain
curl --proto ' =https ' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# install LLVM 15
sudo bash -c " $( wget -O - https://apt.llvm.org/llvm.sh ) " 15
# install Python toolchain
sudo apt install python3 python3-pip # requires python >= 3.8
pip3 install -r utils/requirements.txt # you need to clone this repo first
# add WASM target
rustup target add wasm32-unknown-unknown
# install other components
sudo apt install figlet
cargo install rustfilt
# [optional] useful tools for developing
LLVM_VERSION=
sudo apt install clangd- $LLVM_VERSION clang-format- $LLVM_VERSION clang-tidy- $LLVM_VERSION 以下命令适用于使用MACOS的用户,仅在Apple Silicon Mac上进行测试,因此请谨慎使用它们。
# install Rust Toolchain
curl --proto ' =https ' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# install LLVM 15
brew install llvm@15
# install Python packages
pip3 install -r utils/requirements.txt # you need to clone this repo first
# using macOS default python3
# add WASM target
rustup target add wasm32-unknown-unknown
# install other components
brew install figlet coreutils gsed
cargo install rustfilt我们提供了Docker解决方案。
# build the image
docker build --build-arg UID= ` id -u ` --build-arg GID= ` id -g ` -t rustle .
# run a container from the image
docker run --name rustle -it -v ` pwd ` :/rustle -w /rustle rustle bash
# exec the container
docker start rustle
docker exec -it -w /rustle rustle bash./rustle [-t | --tg_dir < tg_dir > ] [-d | --detector < detector_list > ] [-o | --output < output_dir > ] [-h | --help] < src_dir >src_dir :通往合同源的路径。tg_dir :通往合同目标的路径。默认值与src_dir相同。detector :检测器列表。它可用于传递由,默认为all 。all组启用所有检测器。high , medium , low和info组,以使探测器组具有不同的严重性(请参阅探测器)nep-ft , nep-storage和nep-nft组,以实现为指定NEP实施的检测器(请参阅NEP检测器组)output :将生成审核报告的路径。默认为./audit-result 。注意:如果货物构建的目标位代码( .bc二进制)不在$src_dir中,则使用-t|--tg_dir设置目标目录,否则将其设置为$src_dir 。
下面的命令显示了分析线性的示例。
# clone LiNEAR
git clone https://github.com/linear-protocol/LiNEAR.git ~ /near-repo/LiNEAR
# run Rustle
./rustle -t ~ /near-repo/LiNEAR ~ /near-repo/LiNEAR/contracts/linear
# [optional] run Rustle on specified detectors or severity groups and save audit reports in `~/linear-report`
./rustle -t ~ /near-repo/LiNEAR ~ /near-repo/LiNEAR/contracts/linear -d high,medium,complex-loop -o ~ /linear-reportCSV-Format报告将在“ ./audit-result”目录中生成。
所有漏洞都可以找到。
| 检测器ID | 描述 | 严重程度 |
|---|---|---|
unhandled-promise | 查找未处理的Promises | 高的 |
non-private-callback | 缺少宏#[private]回调功能 | 高的 |
reentrancy | 查找容易受到重新进入攻击的功能 | 高的 |
unsafe-math | 缺乏算术操作的溢出检查 | 高的 |
self-transfer | 缺少sender != receiver | 高的 |
incorrect-json-type | 参数或返回值中使用的错误类型 | 高的 |
unsaved-changes | 收集的更改未保存 | 高的 |
nft-approval-check | 在没有approval id的情况下查找nft_transfer | 高的 |
nft-owner-check | 在没有所有者检查的情况下找到批准或撤销功能 | 高的 |
div-before-mul | 由于操作订单不正确而导致的精确损失 | 中等的 |
round | 无需指定天花板或地板而舍入 | 中等的 |
lock-callback | 回调功能的恐慌可能会锁定合同 | 中等的 |
yocto-attach | 在特权功能中没有assert_one_yocto | 中等的 |
dup-collection-id | 重复的ID在集合中使用 | 中等的 |
unregistered-receiver | 对未注册的转移接收器没有恐慌 | 中等的 |
nep${id}-interface | 查找所有未完成的NEP接口 | 中等的 |
prepaid-gas | 缺少在ft_transfer_call中检查预付费气的检查 | 低的 |
non-callback-private | 宏#[private]在非呼叫功能中使用 | 低的 |
unused-ret | 功能结果未使用或检查 | 低的 |
upgrade-func | 合同中没有升级功能 | 低的 |
tautology | 有条件分支的重言术 | 低的 |
storage-gas | 缺少余额检查存储扩展 | 低的 |
unclaimed-storage-fee | 存储之前缺少余额检查 | 低的 |
inconsistency | 使用相似但略有不同的符号 | 信息 |
timestamp | 查找timestamp的所有用途 | 信息 |
complex-loop | 找到具有复杂逻辑的所有循环,可能导致DOS | 信息 |
ext-call | 查找所有交叉合同调用 | 信息 |
promise-result | 找到承诺结果的所有用途 | 信息 |
transfer | 查找所有转移动作 | 信息 |
public-interface | 找到所有公共接口 | 信息 |
除了严重性水平,沙沙作用还通过相应的NEP提供了一些检测器组。目前,沙沙作响支持以下组。
| NEP | 检测器组ID | 检测器ID |
|---|---|---|
| NEP-141 | nep-ft | nep141-interface , self-transfer , unregistered-receiver |
| NEP-145 | nep-storage | nep145-interface , unclaimed-storage-fee |
| NEP-171,NEP-178 | nep-nft | nep171-interface , nft-approval-check , nft-owner-check |
audit目标的依赖性及其名称中的检测器列表和严重性组中的目标./rustle脚本。audit.py中的其他检测器代码)。沙沙作响可以在开发过程中用于迭代扫描近乎智能的合同。这可以节省大量的手动努力并减轻一部分潜在问题。但是,复杂逻辑或与语义相关的脆弱性仍然是沙沙作响的限制。找到复杂的语义问题需要Blocksec的专家进行详尽而彻底的审查。与我们联系以获取审计服务。
该项目属于AGPLV3许可证。有关完整许可文本,请参见许可证文件。