
Raise ist ein automatischer statischer Analysator für nahezu intelligente Rostverträge. Es kann dazu beitragen, zehn verschiedene Schwachstellen in nahezu intelligenten Verträgen zu finden. Laut DeFillama werden 8 von Blocksec zu den Top 10 Dapps in der Nähe geprüft. Mit reichhaltiger Prüfungserfahrung und einem tiefen Verständnis von nahezu Protokoll bauen wir dieses Tool auf und teilen es mit der Community.
Installieren Sie die erforderlichen Toolkits mit den folgenden Befehlen für Rascheln unter Linux. Befehle werden in Ubuntu 20.04 LTS getestet.
# 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 Die folgenden Befehle gelten für Benutzer, die MacOS verwenden. Sie werden nur auf Apple Silicon Mac getestet. Verwenden Sie sie daher mit Vorsicht.
# 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 rustfiltWir bieten eine Docker -Lösung.
# 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 : Pfad zur Vertragsquelle.tg_dir : Pfad zum Vertragsbauziel. Standardeinstellungen, um src_dir wie zu sein.detector : Die Detektorliste. Es kann verwendet werden, um mehrere Detektoren oder Gruppen zu übergeben, die durch , Standardmäßig an all .all Gruppen über, um alle Detektoren zu ermöglichen.high , medium , low und info gruppen , um Detektorgruppen mit unterschiedlichem Schweregrad zu ermöglichen (siehe Detektoren)nep-ft , nep-storage und nep-nft Gruppen, um die für den festgelegten NEP implementierten Detektoren zu ermöglichen (siehe NEP-Detektorgruppen)output : Pfad, bei dem Prüfungsberichte in. Standards an ./audit-result generiert werden. Hinweis: Wenn der von Cargo erstellte Zielbitcode ( .bc binary) nicht im $src_dir ist, verwenden Sie -t|--tg_dir um das Verzeichnis des Ziels festzulegen, oder es wird standardmäßig auf $src_dir festgelegt.
Der folgende Befehl zeigt ein Beispiel für die Analyse des Linears.
# 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-reportEin CSV-Format-Bericht wird im Verzeichnis "./Audit-result" erstellt.
Alle Schwachstellen können Rascheln finden.
| Detektor -ID | Beschreibung | Schwere |
|---|---|---|
unhandled-promise | Finden Sie Promises , die nicht behandelt werden | Hoch |
non-private-callback | Fehlende Makro #[private] für Rückruffunktionen | Hoch |
reentrancy | Finden Sie Funktionen, die anfällig für Wiedereinzugsangriffe sind | Hoch |
unsafe-math | Mangel an Überlaufprüfung für den arithmetischen Betrieb | Hoch |
self-transfer | Fehlende Überprüfung des sender != receiver | Hoch |
incorrect-json-type | Falscher Typ, der in Parametern oder Rückgabewerten verwendet wird | Hoch |
unsaved-changes | Änderungen der Sammlungen werden nicht gespeichert | Hoch |
nft-approval-check | Finden Sie nft_transfer ohne Überprüfung der approval id | Hoch |
nft-owner-check | Finden Sie Funktionen ohne Eigentümer ohne Eigentümer zu genehmigen oder zu widerrufen | Hoch |
div-before-mul | Präzisionsverlust aufgrund einer falschen Betriebsreihenfolge | Medium |
round | Runden ohne Angabe von Ceil oder Boden | Medium |
lock-callback | Panik in der Rückruffunktion kann den Vertrag sperren | Medium |
yocto-attach | Keine assert_one_yocto in der privilegierten Funktion | Medium |
dup-collection-id | doppelte ID -Verwendung in Sammlungen | Medium |
unregistered-receiver | Keine Panik bei nicht registrierten Übertragungsempfängern | Medium |
nep${id}-interface | Finden Sie alle nicht implementierten NEP -Schnittstellen | Medium |
prepaid-gas | Fehlende Überprüfung von Prepaidgas in ft_transfer_call | Niedrig |
non-callback-private | Makro #[private] verwendet in der Nicht-Callback-Funktion | Niedrig |
unused-ret | Funktionsergebnis nicht verwendet oder überprüft | Niedrig |
upgrade-func | Keine Upgrade -Funktion im Vertrag | Niedrig |
tautology | Tautologie im bedingten Zweig verwendet | Niedrig |
storage-gas | Fehlende Guthabenprüfung für die Speicherungserweiterung | Niedrig |
unclaimed-storage-fee | Fehlender Gleichgewichtsprüfung vor der Lagerung unregister | Niedrig |
inconsistency | Verwendung eines ähnlichen, aber leicht unterschiedlichen Symbols | Info |
timestamp | Finden Sie alle Verwendungen von timestamp | Info |
complex-loop | Finden Sie alle Schleifen mit komplexer Logik, die zu DOS führen können | Info |
ext-call | Finden Sie alle kreuzvertraglichen Aufrufe | Info |
promise-result | Finden Sie alle Verwendungszwecke des Versprechensergebnisses | Info |
transfer | Finden Sie alle Übertragungsaktionen | Info |
public-interface | Finden Sie alle öffentlichen Schnittstellen | Info |
Abgesehen von den Gruppen nach Schweregrad liefert Raschle einige Detektorgruppen durch entsprechende NEP. Derzeit unterstützt Raschle die folgenden Gruppen.
| Nep | Detektorgruppe ID | Detektor -IDs |
|---|---|---|
| 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 und dessen Namen in die Detektorliste und die Schweregradgruppen in ./rustle Skript hinzu.audit.py ).Rillen kann im Entwicklungsprozess verwendet werden, um die nahen intelligenten Verträge iterativ zu scannen. Dies kann eine Menge manueller Anstrengungen sparen und einen Teil potenzieller Probleme mildern. Schwachstellen in der komplexen Logik oder in Bezug auf die Semantik sind jedoch immer noch die Einschränkung des Raschelns . Um komplizierte semantische Probleme zu finden, müssen die Experten in Blocksec erschöpfende und gründliche Überprüfungen durchführen. Kontaktieren Sie uns für den Prüfungsdienst.
Dieses Projekt steht unter der AGPLV3 -Lizenz. In der Lizenzdatei finden Sie den vollständigen Lizenztext.