
Analisador Estático para contratos inteligentes Starknet
Caracal é uma ferramenta de análise estática sobre a representação SIERRA para contratos inteligentes Starknet.
Binários pré-compilados estão disponíveis na nossa página de releases. Se você estiver usando o compilador Cairo 1.x.x, use o binário v0.1.x; caso contrário, se estiver usando o compilador Cairo 2.x.x, use v0.2.x.
Você precisa do compilador Rust e do Cargo. Compilando a partir do git:
cargo install --git https://github.com/crytic/caracal --profile release --force
Compilando a partir de uma cópia local:
git clone https://github.com/crytic/caracal
cd caracal
cargo install --path . --profile release --force
Listar detectores:
caracal detectors
Listar impressoras:
caracal printers
Para usar com um arquivo cairo autônomo e você possui um binário local do compilador cairo, basta apontá-lo para o arquivo. Caso contrário, um compilador empacotado é usado e você precisa passar o caminho para a biblioteca corelib usando a opção --corelib da CLI ou definindo a variável de ambiente CORELIB_PATH.
Executar detectores:
caracal detect path/file/to/analyze
caracal detect path/file/to/analyze --corelib path/to/corelib/src
Executar impressoras:
caracal print path/file/to/analyze --printer printer_to_use --corelib path/to/corelib/src
Se você tem um projeto Cairo com vários arquivos e contratos, pode ser necessário especificar quais contratos com --contract-path. O binário local do compilador Cairo é usado se disponível; caso contrário, um compilador empacotado é usado. Neste último caso, você também precisa especificar o corelib, conforme explicado acima para o caso autônomo. O caminho é o diretório onde o cairo_project.toml reside.
Executar detectores:
caracal detect path/to/dir
caracal detect path/to/dir --contract-path token::myerc20::... token::myerc721::...
Executar impressoras:
caracal print path/to/dir --printer printer_to_use
Se você tem um projeto que usa Scarb, precisa adicionar o seguinte no Scarb.toml:
[[target.starknet-contract]]
sierra = true
[cairo]
sierra-replace-ids = true
Em seguida, passe o caminho para o diretório onde o Scarb.toml reside. Executar detectores:
caracal detect path/to/dir
Executar impressoras:
caracal print path/to/dir --printer printer_to_use
A coluna Cairo representa a(s) versão(ões) do compilador para as quais o detector é válido.
cfg: Exporta o CFG de cada função para um arquivo .dotcallgraph: Exporta o grafo de chamadas de funções para um arquivo .dotConfira a wiki sobre os seguintes tópicos:
| Num | Detector | O que detecta | Impacto | Confiança | Cairo |
|---|
| 1 | controlled-library-call | Chamadas de biblioteca com hash de classe controlado pelo usuário | Alto | Médio | 1 & 2 |
| 2 | unchecked-l1-handler-from | Detecta manipuladores L1 sem verificação de endereço de origem | Alto | Médio | 1 & 2 |
| 3 | felt252-unsafe-arithmetic | Detecta operações controladas pelo usuário com tipo felt252, que não é seguro contra overflow/underflow | Médio | Médio | 1 & 2 |
| 4 | reentrancy | Detecta quando uma variável de armazenamento é lida antes de uma chamada externa e escrita após | Médio | Médio | 1 & 2 |
| 5 | read-only-reentrancy | Detecta quando uma função view lê uma variável de armazenamento escrita após uma chamada externa | Médio | Médio | 1 & 2 |
| 6 | unused-events | Eventos definidos mas não emitidos | Médio | Médio | 1 & 2 |
| 7 | unused-return | Valores de retorno não utilizados | Médio | Médio | 1 & 2 |
| 8 | unenforced-view | Função possui decorador view mas modifica estado | Médio | Médio | 1 |
| 9 | tx-origin | Detecta uso do endereço de origem da transação como controle de acesso | Médio | Médio | 2 |
| 10 | unused-arguments | Argumentos não utilizados | Baixo | Médio | 1 & 2 |
| 11 | reentrancy-benign | Detecta quando uma variável de armazenamento é escrita após uma chamada externa mas não lida antes | Baixo | Médio | 1 & 2 |
| 12 | reentrancy-events | Detecta quando um evento é emitido após uma chamada externa, resultando em eventos fora de ordem | Baixo | Médio | 1 & 2 |
| 13 | dead-code | Funções privadas nunca usadas | Baixo | Médio | 1 & 2 |
| 14 | use-after-pop-front | Detecta uso de um array ou span após remover elemento(s) | Baixo | Médio | 1 & 2 |