
Analizzatore statico per smart contract di Starknet
Caracal è uno strumento di analisi statica sulla rappresentazione SIERRA per smart contract Starknet.
I binari precompilati sono disponibili nella nostra pagina delle release. Se stai usando il compilatore Cairo 1.x.x, utilizza il binario v0.1.x; altrimenti, se stai usando il compilatore Cairo 2.x.x, utilizza v0.2.x.
Necessiti del compilatore Rust e di Cargo. Compilazione da git:
cargo install --git https://github.com/crytic/caracal --profile release --force
Compilazione da una copia locale:
git clone https://github.com/crytic/caracal
cd caracal
cargo install --path . --profile release --force
Elenca i rilevatori:
caracal detectors
Elenca le stampanti:
caracal printers
Per utilizzarlo con un file cairo autonomo e disponi di un binario del compilatore cairo locale, è sufficiente puntarlo al file. Altrimenti, viene utilizzato un compilatore integrato e devi passare il percorso della libreria corelib tramite l'opzione --corelib della CLI o impostando la variabile d'ambiente CORELIB_PATH.
Esegui i rilevatori:
caracal detect path/file/to/analyze
caracal detect path/file/to/analyze --corelib path/to/corelib/src
Esegui le stampanti:
caracal print path/file/to/analyze --printer printer_to_use --corelib path/to/corelib/src
Se hai un progetto cairo con più file e contratti, potresti dover specificare quali contratti con --contract-path. Il binario del compilatore cairo locale viene utilizzato se disponibile, altrimenti viene usato un compilatore integrato. In quest'ultimo caso, devi anche specificare il corelib come spiegato sopra per il caso autonomo. Il percorso è la directory in cui si trova cairo_project.toml.
Esegui i rilevatori:
caracal detect path/to/dir
caracal detect path/to/dir --contract-path token::myerc20::... token::myerc721::...
Esegui le stampanti:
caracal print path/to/dir --printer printer_to_use
Se hai un progetto che utilizza Scarb, devi aggiungere quanto segue in Scarb.toml:
[[target.starknet-contract]]
sierra = true
[cairo]
sierra-replace-ids = true
Quindi passa il percorso alla directory in cui si trova Scarb.toml. Esegui i rilevatori:
caracal detect path/to/dir
Esegui le stampanti:
caracal print path/to/dir --printer printer_to_use
| Num | Detector | Cosa Rileva | Impatto | Confidenza | Cairo |
|---|---|---|---|---|---|
| 1 | controlled-library-call | Chiamate a libreria con un class hash controllato dall'utente | Alto | Medium | 1 & 2 |
| 2 | unchecked-l1-handler-from | Rileva gestori L1 senza controllo dell'indirizzo from | Alto | Medium | 1 & 2 |
| 3 | felt252-unsafe-arithmetic | Rileva operazioni controllate dall'utente con tipo felt252, che non è sicuro contro overflow/underflow | Medio | Medium | 1 & 2 |
| 4 | reentrancy | Rileva quando una variabile di storage viene letta prima di una chiamata esterna e scritta dopo | Medio | Medium | 1 & 2 |
| 5 | read-only-reentrancy | Rileva quando una funzione view legge una variabile di storage scritta dopo una chiamata esterna | Medio | Medium | 1 & 2 |
| 6 | unused-events | Eventi definiti ma non emessi | Medio | Medium | 1 & 2 |
| 7 | unused-return | Valori di ritorno non utilizzati | Medio | Medium | 1 & 2 |
| 8 | unenforced-view | La funzione ha il decorator view ma modifica lo stato | Medio | Medium | 1 |
| 9 | tx-origin | Rileva l'uso dell'indirizzo di origine della transazione come controllo accessi | Medio | Medium | 2 |
| 10 | unused-arguments | Argomenti non utilizzati | Basso | Medium | 1 & 2 |
| 11 | reentrancy-benign | Rileva quando una variabile di storage viene scritta dopo una chiamata esterna ma non letta prima | Basso | Medium | 1 & 2 |
| 12 | reentrancy-events | Rileva quando un evento viene emesso dopo una chiamata esterna causando eventi fuori ordine | Basso |
La colonna Cairo rappresenta la/e versione/i del compilatore per cui il rilevatore è valido.
cfg: Esporta il CFG di ogni funzione in un file .dotcallgraph: Esporta il grafo delle chiamate delle funzioni in un file .dotConsulta il wiki sui seguenti argomenti:
| Medium |
| 1 & 2 |
| 13 | dead-code | Funzioni private mai utilizzate | Basso | Medium | 1 & 2 |
| 14 | use-after-pop-front | Rileva l'uso di un array o uno span dopo la rimozione di elementi | Basso | Medium | 1 & 2 |