
Rustle es un analizador estático automático para contratos cercanos a Smart en Rust. Puede ayudar a localizar decenas de diferentes vulnerabilidades en contratos casi inteligentes. Según DeFillama, entre los 10 mejores DAPPS en cercano, 8 son auditados por BlockSec. Con una rica experiencia de auditoría y una comprensión profunda del protocolo cercano, construimos esta herramienta y la compartimos con la comunidad.
Instale los kits de herramientas requeridos con los siguientes comandos para Rustle en Linux. Los comandos se prueban en 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 Los siguientes comandos son para los usuarios que usan macOS, se prueban solo en Apple Silicon Mac, así que úselos con precaución.
# 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 rustfiltProporcionamos una solución 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 : ruta a la fuente del contrato.tg_dir : PATH AL TIERTO DE CONSTRUCCIÓN DEL CONTRATO. El valor predeterminado es lo mismo que src_dir .detector : la lista del detector. Se puede usar para pasar múltiples detectores o grupos separados por , . Predeterminado a all .all el grupo para habilitar todos los detectores.high , medium , low y info para habilitar grupos de detectores con diferentes gravedad (consulte los detectores)nep-ft , nep-storage y nep-nft para habilitar detectores implementados para NEP especificado (consulte los grupos de detectores NEP)output : ruta donde se generarán los informes de auditoría en. El valor predeterminado a ./audit-result . Nota: Si el código de bit de destino ( .bc binario) creado por carga no está en $src_dir , use -t|--tg_dir para establecer el directorio del objetivo, o se establecerá en $src_dir por defecto.
El siguiente comando muestra un ejemplo de analizar el lineal.
# 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-reportSe generará un informe de formato CSV en el directorio "./audit-result".
Todas las vulnerabilidades pueden encontrar el susurro .
| ID de detector | Descripción | Gravedad |
|---|---|---|
unhandled-promise | Encuentre Promises que no se manejen | Alto |
non-private-callback | Falta Macro #[private] para funciones de devolución de llamada | Alto |
reentrancy | Encuentra funciones que sean vulnerables al ataque reentrado | Alto |
unsafe-math | Falta de verificación de desbordamiento para la operación aritmética | Alto |
self-transfer | faltando cheque del sender != receiver | Alto |
incorrect-json-type | Tipo incorrecto utilizado en parámetros o valores de retorno | Alto |
unsaved-changes | Los cambios en las colecciones no se guardan | Alto |
nft-approval-check | encontrar nft_transfer sin verificación de approval id | Alto |
nft-owner-check | Encuentre las funciones de aprobación o revocar sin cheque del propietario | Alto |
div-before-mul | Pérdida de precisión debido a una orden de operación incorrecta | Medio |
round | redondeo sin especificar el techo o el piso | Medio |
lock-callback | El pánico en la función de devolución de llamada puede bloquear el contrato | Medio |
yocto-attach | no assert_one_yocto en la función privilegiada | Medio |
dup-collection-id | Usos de identificación duplicados en colecciones | Medio |
unregistered-receiver | No hay pánico en receptores de transferencia no registrados | Medio |
nep${id}-interface | Encuentra toda la interfaz NEP sin implementar | Medio |
prepaid-gas | Falta cheque de gas prepago en ft_transfer_call | Bajo |
non-callback-private | Macro #[private] utilizado en la función que no es | Bajo |
unused-ret | Resultado de la función no se usa ni se verifica | Bajo |
upgrade-func | Sin función de actualización en contrato | Bajo |
tautology | Tautología utilizada en la rama condicional | Bajo |
storage-gas | Verificación de saldo faltante para la expansión de almacenamiento | Bajo |
unclaimed-storage-fee | Falta del saldo Verifique antes del almacenamiento sin registro | Bajo |
inconsistency | Uso de símbolo similar pero ligeramente diferente | Información |
timestamp | Encuentra todos los usos de timestamp | Información |
complex-loop | Encuentre todos los bucles con lógica compleja que puede conducir a DOS | Información |
ext-call | Encuentra todas las invocaciones de contrato cruzado | Información |
promise-result | Encuentre todos los usos de resultado prometedor | Información |
transfer | Encuentra todas las acciones de transferencia | Información |
public-interface | Encuentra todas las interfaces públicas | Información |
Además de los grupos por nivel de gravedad, Rustle proporciona algunos grupos de detectores por NEP correspondiente. Actualmente, Rustle admite los siguientes grupos.
| Neps | ID de grupo detector | ID de detector |
|---|---|---|
| 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 y su nombre a la lista de detectores y grupos de gravedad en el script ./rustle .audit.py ).Rustle se puede utilizar en el proceso de desarrollo para escanear los contratos cercanos a Smart de iteración. Esto puede ahorrar mucho esfuerzo manual y mitigar parte de los posibles problemas. Sin embargo, las vulnerabilidades en lógica compleja o relacionadas con la semántica siguen siendo la limitación del susurro . La ubicación de problemas semánticos complicados requiere que los expertos en blocksec realicen revisiones exhaustivas y exhaustivas. Contáctenos para el servicio de auditoría.
Este proyecto está bajo la licencia AGPLV3. Consulte el archivo de licencia para el texto completo de la licencia.