Avertissement
La réglement n'a pas été maintenue depuis mars 2023. Si vous essayez de l'exécuter, il lancera très probablement une erreur pendant la phase d'analyse.
Néanmoins, n'hésitez pas à examiner le code pour avoir une idée de la façon de mettre en œuvre votre propre analyseur statique.
Regast est un analyseur statique pour identifier les vulnérabilités de sécurité et les optimisations du gaz dans les bases de code Solidity.
Il est fortement inspiré par des outils tels que Slither, SolStat et 4NALA3er, mais a les différences suivantes:
La réglement nécessite Python 3.10 ou supérieur.
Tout d'abord, clonez ce référentiel et ses sous-modules:
git clone --recurse-submodules https://github.com/MiloTruck/regast.git
cd regast Installez la régulation à l'aide pip ou setuptools :
# Using pip
pip3 install .
# Using setuptools
python3 setup.py installAprès l'installation, le référentiel peut être supprimé:
cd ..
rm -r regast La commande regast peut être utilisée sur le fichier .sol ou dans un dossier contenant des fichiers de solidité:
$ regast --help
usage: __main__.py [-h] [-d <detector>] [-c <classifications>] [-s <scope>] [-r <filename>] <contract>
Scan for vulnerabilities based on regex or AST queries.
positional arguments:
<contract> .sol file or folder containing .sol files to scan
options:
-h, --help show this help message and exit
-d <detector>, --detectors <detector>
.py file or folder containing .py files which implement detectors
-c <classifications>, --classifications <classifications>
Comma-separated list of classifications: GAS, NC, LOW, MEDIUM, HIGH
-s <scope>, --scope <scope>
Text file containing a list of contracts in scope
-r <filename>, --report <filename>
Generate a markdown report in <filename>.md
Vous trouverez ci-dessous les détecteurs actuellement implémentés que la réglage des fonctionne par défaut. La plupart des détecteurs de 4NALY3er et Solstat seront inclus à l'avenir.
| Détecteur | Description | Classification |
|---|---|---|
address_balance | Utilisez selfbalance() au lieu address(this).balance . | Gaz |
address_zero | Utilisez l'assemblage pour vérifier address(0) . | Gaz |
assign_update_array_value | Mettre à jour les valeurs du tableau à l'aide de arr[i] += n au lieu de arr[i] = arr[i] + n . | Gaz |
bool_comparison | Ne comparez pas les booléens à true ou false . | Gaz |
bool_storage | L'utilisation bool pour le stockage entraîne des frais généraux. | Gaz |
byte_constant | Les constantes bytes sont plus efficaces que les constantes string . | Gaz |
cache_array_length | Longueur du tableau de cache en dehors des boucles pour les boucles. | Gaz |
custom_error | Utilisez des erreurs personnalisées au lieu des instructions require . | Gaz |
initialize_default_value | Initialisation inutile des variables avec des valeurs par défaut | Gaz |
long_revert_string | require des instructions avec de longs messages d'erreur. | Gaz |
post_increment | ++i coûte moins de gaz que i++ ou i += 1 . | Gaz |
private_constant | Déclarez les constantes comme private au lieu de non-publiques pour sauver du gaz. | Gaz |
shift_arithmetic | Utilisez << et >> au lieu de multiplication / division lorsque cela est possible. | Gaz |
split_require_statements | Utilisez des instructions require distinctes au lieu de && . | Gaz |
unchecked_increment | «Les incréments peuvent être déclarés unchecked dans les boucles pour les boucles». | Gaz |
unsigned_comparison | Utilisez != 0 au lieu de > 0 pour la comparaison entière non signée. | Gaz |
Pour plus d'informations sur la façon d'écrire des détecteurs personnalisés, veuillez vous référer à docs/writing-custom-detectors.md .
Regast est en mesure de générer des rapports de démarque avec les problèmes trouvés. Pour un exemple, veuillez vous référer aux exemples de rapports suivants:
La régast est construite sur le dessus de Tree-Sitter-Python, qui fournit des liaisons Python pour la bibliothèque d'analyse d'arbre. La grammaire de la solidité est tirée de la solidité des arbres-sitter.
tree-sitter convertit d'abord le code source de solidité en plusieurs arbres de syntaxe abstraits (AST). Regast analyse ensuite chaque nœud dans ces AST en classes Python correspondantes. Une fois l'analyse terminée, les détecteurs individuels interrogent l'AST à travers ces classes Python pour identifier les modèles de vulnérabilité communs.
La plupart du code de Regast se trouvent dans les répertoires suivants:
regast/core contient des classes Python qui représentent des parties de l'AST.regast/detectors Contient des détecteurs qui régissent les fonctions par défaut.regast/parsing contient la logique pour analyser l'AST de tree-sitter dans les classes Python.