Warnung
Regast wurde seit März 2023 nicht mehr aufrechterhalten. Wenn Sie versuchen, es auszuführen, wird es höchstwahrscheinlich einen Fehler während der Parsing -Phase machen.
Sehen Sie sich jedoch gerne den Code durch, um eine Vorstellung davon zu erhalten, wie Sie Ihren eigenen statischen Analysator implementieren können.
Regast ist ein statischer Analysator zur Identifizierung von Sicherheitslücken und Gasoptimierungen in Soliditätscodebasen.
Es ist stark von Werkzeugen wie Slither, Solstat und 4Naly3er inspiriert, hat jedoch die folgenden Unterschiede:
Regast benötigt Python 3.10 oder höher.
Klonen Sie zunächst dieses Repository und seine Submodules:
git clone --recurse-submodules https://github.com/MiloTruck/regast.git
cd regast Installieren Sie Regast entweder pip oder setuptools :
# Using pip
pip3 install .
# Using setuptools
python3 setup.py installNach der Installation kann das Repository gelöscht werden:
cd ..
rm -r regast Der Befehl regast kann entweder in .sol -Datei oder in einem Ordner mit Soliditätsdateien verwendet werden:
$ 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
Im Folgenden finden Sie die derzeit implementierten Detektoren, die Regast standardmäßig ausgeführt haben. Die meisten Detektoren von 4Naly3er und Solstat werden in Zukunft aufgenommen.
| Detektor | Beschreibung | Einstufung |
|---|---|---|
address_balance | Verwenden Sie selfbalance() anstelle von address(this).balance . | Gas |
address_zero | Verwenden Sie die Montage, um address(0) zu überprüfen. | Gas |
assign_update_array_value | Aktualisieren Sie Array -Werte mit arr[i] += n anstelle von arr[i] = arr[i] + n . | Gas |
bool_comparison | Vergleichen Sie Booleans nicht mit true oder false . | Gas |
bool_storage | Verwenden von bool für die Aufbewahrung verursacht Overhead. | Gas |
byte_constant | bytes sind effizienter als string . | Gas |
cache_array_length | Cache-Array-Länge außerhalb von For-Schleifen. | Gas |
custom_error | Verwenden Sie benutzerdefinierte Fehler anstelle von require . | Gas |
initialize_default_value | Unnötige Initialisierung von Variablen mit Standardwerten | Gas |
long_revert_string | require Anweisungen mit langen Fehlermeldungen. | Gas |
post_increment | ++i kostet weniger Gas als i++ oder i += 1 . | Gas |
private_constant | Deklarieren Sie Konstanten als private anstatt nicht öffentlich, um Gas zu sparen. | Gas |
shift_arithmetic | Verwenden Sie nach Möglichkeit << und >> statt einer Multiplikation/Abteilung. | Gas |
split_require_statements | Verwenden Sie separate require Anweisungen anstelle von && . | Gas |
unchecked_increment | "Inkremente können in den Schleifen unchecked deklariert werden". | Gas |
unsigned_comparison | Verwendung != 0 anstelle von > 0 für den nicht signierten Ganzzahlvergleich. | Gas |
Informationen zum Schreiben von benutzerdefinierten Detektoren finden Sie unter docs/writing-custom-detectors.md .
Regast kann Markdown -Berichte mit den gefundenen Problemen erstellen. Ein Beispiel finden Sie in den folgenden Beispielberichten:
Regast basiert auf Baum-Sitter-Python, das Python-Bindungen für die Baum-Sitter-Parsing-Bibliothek bereitstellt. Die Grammatik für die Solidität wird aus Baum-Sitter-Solidität entnommen.
tree-sitter konvertiert zuerst Soliditätsquellcode in mehrere abstrakte Syntaxbäume (AST). Regast anschließend jeden Knoten in diesen ASTs in entsprechende Pythonklassen. Nach Abschluss des Parsens fragen einzelne Detektoren das AST durch diese Python -Klassen, um gemeinsame Sicherheitsanfälligkeitsmuster zu identifizieren.
Der größte Teil von Regasts Code befindet sich in den folgenden Verzeichnissen:
regast/core enthält Pythonklassen, die Teile des AST repräsentieren.regast/detectors enthält Detektoren, die standardmäßig ausführen .regast/parsing enthält die Logik für das Parsen des AST von tree-sitter in Python-Klassen.