
Analyseur statique pour les contrats intelligents Starknet
Caracal est un outil d'analyse statique basé sur la représentation SIERRA pour les contrats intelligents Starknet.
Des binaires précompilés sont disponibles sur notre page des versions. Si vous utilisez le compilateur Cairo 1.x.x, utilisez le binaire v0.1.x ; sinon, si vous utilisez le compilateur Cairo 2.x.x, utilisez v0.2.x.
Vous avez besoin du compilateur Rust et de Cargo. Construction depuis git :
cargo install --git https://github.com/crytic/caracal --profile release --force
Construction à partir d'une copie locale :
git clone https://github.com/crytic/caracal
cd caracal
cargo install --path . --profile release --force
Lister les détecteurs :
caracal detectors
Lister les imprimantes :
caracal printers
Pour utiliser avec un fichier Cairo autonome et si vous avez un binaire du compilateur Cairo local, il suffit de le pointer vers le fichier. Sinon, un compilateur intégré est utilisé et vous devez fournir le chemin vers la bibliothèque corelib soit avec l'option CLI --corelib, soit en définissant la variable d'environnement CORELIB_PATH.
Exécuter les détecteurs :
caracal detect path/file/to/analyze
caracal detect path/file/to/analyze --corelib path/to/corelib/src
Exécuter les imprimantes :
caracal print path/file/to/analyze --printer printer_to_use --corelib path/to/corelib/src
Si vous avez un projet Cairo avec plusieurs fichiers et contrats, vous devrez peut-être spécifier quels contrats avec --contract-path. Le binaire du compilateur Cairo local est utilisé s'il est disponible, sinon un compilateur intégré est utilisé. Dans ce dernier cas, vous devez également spécifier le corelib comme expliqué ci-dessus pour le cas autonome. Le chemin est le répertoire où se trouve cairo_project.toml.
Exécuter les détecteurs :
caracal detect path/to/dir
caracal detect path/to/dir --contract-path token::myerc20::... token::myerc721::...
Exécuter les imprimantes :
caracal print path/to/dir --printer printer_to_use
Si vous avez un projet qui utilise Scarb, vous devez ajouter ce qui suit dans Scarb.toml :
[[target.starknet-contract]]
sierra = true
[cairo]
sierra-replace-ids = true
Ensuite, fournissez le chemin vers le répertoire où se trouve Scarb.toml. Exécuter les détecteurs :
caracal detect path/to/dir
Exécuter les imprimantes :
caracal print path/to/dir --printer printer_to_use
La colonne Cairo représente la ou les versions du compilateur pour lesquelles le détecteur est valide.
cfg : Exporte le CFG de chaque fonction dans un fichier .dotcallgraph : Exporte le graphe d'appels de fonctions dans un fichier .dotConsultez le wiki sur les sujets suivants :
| Num | Détecteur | Ce qu'il détecte | Impact | Confiance | Cairo |
|---|
| 1 | controlled-library-call | Appels de bibliothèque avec un hash de classe contrôlé par l'utilisateur | Élevé | Moyen | 1 & 2 |
| 2 | unchecked-l1-handler-from | Détecte les gestionnaires L1 sans vérification d'adresse from | Élevé | Moyen | 1 & 2 |
| 3 | felt252-unsafe-arithmetic | Détecte les opérations contrôlées par l'utilisateur avec le type felt252, qui n'est pas sûr contre les débordements/sous-débordements | Moyen | Moyen | 1 & 2 |
| 4 | reentrancy | Détecte quand une variable de stockage est lue avant un appel externe et écrite après | Moyen | Moyen | 1 & 2 |
| 5 | read-only-reentrancy | Détecte quand une fonction view lit une variable de stockage écrite après un appel externe | Moyen | Moyen | 1 & 2 |
| 6 | unused-events | Événements définis mais non émis | Moyen | Moyen | 1 & 2 |
| 7 | unused-return | Valeurs de retour inutilisées | Moyen | Moyen | 1 & 2 |
| 8 | unenforced-view | La fonction a un décorateur view mais modifie l'état | Moyen | Moyen | 1 |
| 9 | tx-origin | Détecte l'utilisation de l'adresse d'origine de la transaction comme contrôle d'accès | Moyen | Moyen | 2 |
| 10 | unused-arguments | Arguments inutilisés | Faible | Moyen | 1 & 2 |
| 11 | reentrancy-benign | Détecte quand une variable de stockage est écrite après un appel externe mais pas lue avant | Faible | Moyen | 1 & 2 |
| 12 | reentrancy-events | Détecte quand un événement est émis après un appel externe entraînant des événements dans le désordre | Faible | Moyen | 1 & 2 |
| 13 | dead-code | Fonctions privées jamais utilisées | Faible | Moyen | 1 & 2 |
| 14 | use-after-pop-front | Détecte l'utilisation d'un tableau ou d'un span après avoir supprimé un ou plusieurs éléments | Faible | Moyen | 1 & 2 |