
Rustleは、Rustのスマートコントラクトに近いための自動静的アナライザーです。それは、スマート契約に近い数十の異なる脆弱性を見つけるのに役立ちます。 Defillamaによると、近くの上位10のDappsのうち、8つがBlockSecによって監査されています。豊富な監査の経験と近いプロトコルの深い理解により、このツールを構築し、コミュニティと共有します。
LinuxのRustleには、次のコマンドを使用して必要なツールキットをインストールします。コマンドは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 次のコマンドは、MACOを使用しているユーザー向けであり、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 rustfiltDockerソリューションを提供します。
# 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 | すべてのパブリックインターフェイスを見つけます | 情報 |
重大度レベルによるグループとは別に、 Rustleは対応するNEPによっていくつかの検出器グループを提供します。現在、 Rustleは次のグループをサポートしています。
| 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の他の検出器のコードを参照)。Rustleは、開発プロセスで使用して、近くのスマートコントラクトを繰り返しスキャンすることができます。これにより、多くの手動での努力を節約し、潜在的な問題の一部を軽減できます。ただし、複雑な論理の脆弱性またはセマンティクスに関連する脆弱性は、依然としてざわめきの制限です。複雑なセマンティックの問題を見つけるには、BlockSecの専門家が徹底的かつ徹底的なレビューを実施する必要があります。監査サービスについてはお問い合わせください。
このプロジェクトはAGPLV3ライセンスの下にあります。完全なライセンステキストについては、ライセンスファイルを参照してください。