
Analisador Estático para Solidity e Vyper
Junte-se ao Slack do Empire Hacking
- Discussões e Suporte
Slither é um framework de análise estática para Solidity e Vyper escrito em Python3. Ele executa um conjunto de detectores de vulnerabilidades, exibe informações visuais sobre detalhes dos contratos e fornece uma API para escrever análises personalizadas facilmente. Slither permite que desenvolvedores encontrem vulnerabilidades, melhorem sua compreensão do código e criem protótipos rapidamente de análises personalizadas.
Execute o Slither em uma aplicação Hardhat/Foundry/Dapp/Brownie:```console slither .
Esta é a opção preferida se o seu projeto possui dependências, já que o Slither depende da estrutura de compilação subjacente para compilar o código-fonte.
No entanto, você pode executar o Slither em um único arquivo que não importa dependências:```console
slither tests/uninitialized.sol
Nota O Slither requer Python 3.10+. Se você não for usar um dos frameworks de compilação suportados, precisará do solc, o compilador Solidity; recomendamos usar o solc-select para alternar convenientemente entre versões do solc.
O uv é um gerenciador de pacotes Python rápido, 10 a 100 vezes mais rápido que o pip.```console
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install slither-analyzer
uvx --from slither-analyzer slither
Para atualizar:```console
uv tool upgrade slither-analyzer
python3 -m pip install slither-analyzer
Para atualizar:```console
python3 -m pip install --upgrade slither-analyzer
brew install slither-analyzer
### Usando Git (Desenvolvimento)```bash
git clone https://github.com/crytic/slither.git && cd slither
# Install as editable for development
uv tool install -e .
# Or use uv run for testing without installation
uv run slither <target>
A flag -e instala em modo editável, o que significa que as alterações no código-fonte são refletidas imediatamente sem necessidade de reinstalação.
Use a imagem docker eth-security-toolbox. Ela inclui todas as nossas ferramentas de segurança e todas as principais versões do Solidity em uma única imagem. /home/share será montado em /share no contêiner.```bash
docker pull trailofbits/eth-security-toolbox
Para compartilhar um diretório no contêiner:```bash
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
$GIT_TAG pela tag real) ```YAML
slither [target] --checklist.slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/ (substitua ORG, REPO, COMMIT)| Num | Detector | O que Detecta | Impacto | Confiança |
|---|---|---|---|---|
| 1 | abiencoderv2-array | Array abiencoderv2 de armazenamento | Alto | Alta |
| 2 | arbitrary-send-erc20 | transferFrom usa from arbitrário | Alto | Alta |
| 3 | array-by-reference | Modificando array de armazenamento por valor | Alto | Alta |
| 4 | encode-packed-collision | Colisão de ABI encodePacked | Alto | Alta |
| 5 | incorrect-shift | A ordem dos parâmetros em uma instrução de shift está incorreta. | Alto | Alta |
| 6 | multiple-constructors | Esquemas de múltiplos construtores | Alto | Alta |
| 7 | name-reused | Nome de contrato reutilizado | Alto | Alta |
| 8 | protected-vars | Variáveis não protegidas detectadas | Alto | Alta |
| 9 | public-mappings-nested | Mapeamentos públicos com variáveis aninhadas |
Para mais informações, veja
human-summary: Imprime um resumo legível por humanos dos contratosinheritance-graph: Exporta o gráfico de herança de cada contrato para um arquivo dotcontract-summary: Imprime um resumo dos contratosloc: Conta o número total de linhas de código (LOC), linhas de código fonte (SLOC) e linhas de código de comentário (CLOC) encontradas em arquivos fonte (SRC), dependências (DEP) e arquivos de teste (TEST).entry-points: Imprime todas as funções de ponto de entrada que alteram estado e suas variáveis dos contratoscall-graph: Exportar o grafo de chamadas dos contratos para um arquivo dotcfg: Exportar o CFG de cada funçãofunction-summary: Imprimir um resumo das funçõesvars-and-auth: Imprimir as variáveis de estado escritas e a autorização das funçõesnot-pausable: Imprimir funções que não usam o modificador whenNotPaused.Para executar um printer, use --print e uma lista separada por vírgulas de printers.
Consulte a Documentação do Printer para obter as listas completas.
slither-check-upgradeability: Revisar a atualizabilidade baseada em delegatecallslither-prop: Geração automática de testes unitários e propriedadesslither-flat: Achatar uma base de códigoslither-check-erc: Verificar a conformidade com os ERCsslither-read-storage: Ler valores de armazenamento de contratosslither-interface: Gerar uma interface para um contratoConsulte a Documentação de Ferramentas para ferramentas adicionais.
Entre em contato conosco para obter ajuda na construção de ferramentas personalizadas.
A documentação sobre os detalhes internos do Slither está disponível aqui.
Sinta-se à vontade para passar em nosso canal no Slack (#ethereum) para obter ajuda no uso ou na extensão do Slither.
A Documentação do Printer descreve as informações que o Slither é capaz de visualizar para cada contrato.
A Documentação do Detector descreve como escrever uma nova análise de vulnerabilidade.
A Documentação da API descreve os métodos e objetos disponíveis para análises personalizadas.
A Documentação do SlithIR descreve a representação intermediária SlithIR.
Como excluir mocks ou testes?
Como corrigir "arquivo desconhecido" ou problemas de compilação?
slither contract.sol falhará.
Em vez disso, use slither . no diretório pai de contracts/ (você deve ver contracts/ ao executar ls).
Se você tiver uma pasta node_modules/, ela deve estar no mesmo diretório que contracts/. Para verificar se esse problema está relacionado ao slither,
execute o comando de compilação do framework que você está usando, por exemplo, npx hardhat compile. Isso deve funcionar com sucesso;
caso contrário, o motor de compilação do slither, crytic-compile, não conseguirá gerar a AST.O Slither é licenciado e distribuído sob a licença AGPLv3. Entre em contato conosco se estiver procurando uma exceção aos termos.
| Título | Uso | Autores | Evento | Código |
|---|---|---|---|---|
| ReJection: A AST-Based Reentrancy Vulnerability Detection Method | Análise baseada em AST construída sobre o Slither | Rui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS 19 | - |
| MPro: Combining Static and Symbolic Analysis for Scalable Testing of Smart Contract | Aproveitar a dependência de dados através do Slither | William Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay Ganesh | ISSRE 2019 | MPro |
| ETHPLOIT: From Fuzzing to Efficient Exploit Generation against Smart Contracts | Aproveitar a dependência de dados através do Slither | Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | SANER 20 | - |
| Verification of Ethereum Smart Contracts: A Model Checking Approach | Execução simbólica construída sobre o CFG do Slither | Tam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho Quan | IJMLC 20 | - |
| Smart Contract Repair | Utilizar os detectores de vulnerabilidades do Slither | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 | SCRepair |
| Demystifying Loops in Smart Contracts | Aproveitar a dependência de dados através do Slither | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 | - |
| Trace-Based Dynamic Gas Estimation of Loops in Smart Contracts | Usar o CFG do Slither para detectar loops | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Comput. Soc. 1 (2020) | - |
| SAILFISH: Vetting Smart Contract State-Inconsistency Bugs in Seconds |
Se você estiver usando o Slither em um trabalho acadêmico, considere se candidatar ao Prêmio de Pesquisa Crytic de $10k.
| Alto |
| Alta |
| 10 | rtlo | Caractere de controle Right-To-Left-Override é usado | Alto | Alta |
| 11 | shadowing-state | Sombra de variáveis de estado | Alto | Alta |
| 12 | suicidal | Funções que permitem a qualquer um destruir o contrato | Alto | Alta |
| 13 | uninitialized-state | Variáveis de estado não inicializadas | Alto | Alta |
| 14 | uninitialized-storage | Variáveis de armazenamento não inicializadas | Alto | Alta |
| 15 | unprotected-upgrade | Contrato atualizável não protegido | Alto | Alta |
| 16 | arbitrary-send-erc20-permit | transferFrom usa from arbitrário com permit | Alto | Média |
| 17 | arbitrary-send-eth | Funções que enviam Ether para destinos arbitrários | Alto | Média |
| 18 | controlled-array-length | Atribuição de comprimento de array contaminado | Alto | Média |
| 19 | controlled-delegatecall | Destino de delegatecall controlado | Alto | Média |
| 20 | delegatecall-loop | Funções pagáveis que usam delegatecall dentro de um loop | Alto | Média |
| 21 | incorrect-exp | Exponenciação incorreta | Alto | Média |
| 22 | incorrect-return | Se um return for usado incorretamente no modo assembly. | Alto | Média |
| 23 | msg-value-loop | msg.value dentro de um loop | Alto | Média |
| 24 | reentrancy-eth | Vulnerabilidades de reentrância (roubo de ethers) | Alto | Média |
| 25 | reentrancy-balance | Vulnerabilidades de reentrância que levam a verificações de saldo desatualizadas | Alto | Média |
| 26 | return-leave | Se um return é usado em vez de um leave. | Alto | Média |
| 27 | storage-array | Bug do compilador de array de inteiros com sinal em armazenamento | Alto | Média |
| 28 | unchecked-transfer | Transferência de tokens não verificada | Alto | Média |
| 29 | weak-prng | PRNG fraco | Alto | Média |
| 30 | domain-separator-collision | Detecta tokens ERC20 que possuem uma função cuja assinatura colide com DOMAIN_SEPARATOR() do EIP-2612 | Médio | Alta |
| 31 | enum-conversion | Detecta conversão perigosa de enum | Médio | Alta |
| 32 | erc20-interface | Interfaces ERC20 incorretas | Médio | Alta |
| 33 | erc721-interface | Interfaces ERC721 incorretas | Médio | Alta |
| 34 | incorrect-equality | Igualdades estritas perigosas | Médio | Alta |
| 35 | locked-ether | Contratos que bloqueiam ether | Médio | Alta |
| 36 | mapping-deletion | Exclusão em mapeamento contendo uma estrutura | Médio | Alta |
| 37 | pyth-deprecated-functions | Detecta funções obsoletas do Pyth | Médio | Alta |
| 38 | pyth-unchecked-confidence | Detecta quando o nível de confiança de um preço Pyth não é verificado | Médio | Alta |
| 39 | pyth-unchecked-publishtime | Detecta quando o publishTime de um preço Pyth não é verificado | Médio | Alta |
| 40 | shadowing-abstract | Sombra de variáveis de estado de contratos abstratos | Médio | Alta |
| 41 | tautological-compare | Comparar uma variável consigo mesma sempre retorna true ou false, dependendo da comparação | Médio | Alta |
| 42 | tautology | Tautologia ou contradição | Médio | Alta |
| 43 | write-after-write | Escrita não utilizada | Médio | Alta |
| 44 | boolean-cst | Uso incorreto de constante booleana | Médio | Média |
| 45 | chronicle-unchecked-price | Detecta quando o preço Chronicle não é verificado. | Médio | Média |
| 46 | constant-function-asm | Funções constantes usando código assembly | Médio | Média |
| 47 | constant-function-state | Funções constantes alterando o estado | Médio | Média |
| 48 | divide-before-multiply | Ordem imprecisa de operações aritméticas | Médio | Média |
| 49 | gelato-unprotected-randomness | Chamada para _requestRandomness dentro de uma função não protegida | Médio | Média |
| 50 | out-of-order-retryable | Transações retryable fora de ordem | Médio | Média |
| 51 | reentrancy-no-eth | Vulnerabilidades de reentrância (sem roubo de ethers) | Médio | Média |
| 52 | reused-constructor | Construtor base reutilizado | Médio | Média |
| 53 | tx-origin | Uso perigoso de tx.origin | Médio | Média |
| 54 | unchecked-lowlevel | Chamadas de baixo nível não verificadas | Médio | Média |
| 55 | unchecked-send | Send não verificado | Médio | Média |
| 56 | uninitialized-local | Variáveis locais não inicializadas | Médio | Média |
| 57 | unused-return | Valores de retorno não utilizados | Médio | Média |
| 58 | chainlink-feed-registry | Detecta quando o registro de feed do Chainlink é usado | Baixo | Alta |
| 59 | incorrect-modifier | Modificadores que podem retornar o valor padrão | Baixo | Alta |
| 60 | optimism-deprecation | Detecta quando um predeploy ou função obsoleta do Optimism é usado. | Baixo | Alta |
| 61 | shadowing-builtin | Sombra de símbolo embutido | Baixo | Alta |
| 62 | shadowing-local | Sombra de variáveis locais | Baixo | Alta |
| 63 | uninitialized-fptr-cst | Chamadas de ponteiro de função não inicializadas em construtores | Baixo | Alta |
| 64 | variable-scope | Variáveis locais usadas antes de sua declaração | Baixo | Alta |
| 65 | void-cst | Construtor chamado não implementado | Baixo | Alta |
| 66 | calls-loop | Múltiplas chamadas em um loop | Baixo | Média |
| 67 | events-access | Eventos de controle de acesso ausentes | Baixo | Média |
| 68 | events-maths | Eventos aritméticos ausentes | Baixo | Média |
| 69 | incorrect-unary | Expressões unárias perigosas | Baixo | Média |
| 70 | missing-zero-check | Validação de endereço zero ausente | Baixo | Média |
| 71 | reentrancy-benign | Vulnerabilidades de reentrância benignas | Baixo | Média |
| 72 | reentrancy-events | Vulnerabilidades de reentrância que levam a Eventos fora de ordem | Baixo | Média |
| 73 | return-bomb | Uma função chamada de baixo nível pode consumir todo o gas do chamador inesperadamente. | Baixo | Média |
| 74 | timestamp | Uso perigoso de block.timestamp | Baixo | Média |
| 75 | assembly | Uso de assembly | Informativo | Alta |
| 76 | assert-state-change | Mudança de estado em assert | Informativo | Alta |
| 77 | boolean-equal | Comparação com constante booleana | Informativo | Alta |
| 78 | cyclomatic-complexity | Detecta funções com complexidade ciclomática alta (> 11) | Informativo | Alta |
| 79 | deprecated-standards | Padrões Solidity obsoletos | Informativo | Alta |
| 80 | erc20-indexed | Parâmetros de evento ERC20 não indexados | Informativo | Alta |
| 81 | function-init-state | Função inicializando variáveis de estado | Informativo | Alta |
| 82 | incorrect-using-for | Detecta uso de using-for quando nenhuma função de uma biblioteca corresponde a um tipo | Informativo | Alta |
| 83 | low-level-calls | Chamadas de baixo nível | Informativo | Alta |
| 84 | missing-inheritance | Herança ausente | Informativo | Alta |
| 85 | naming-convention | Conformidade com convenções de nomenclatura Solidity | Informativo | Alta |
| 86 | pragma | Se diferentes diretivas pragma são usadas | Informativo | Alta |
| 87 | redundant-statements | Declarações redundantes | Informativo | Alta |
| 88 | solc-version | Versão Solidity incorreta | Informativo | Alta |
| 89 | unimplemented-functions | Funções não implementadas | Informativo | Alta |
| 90 | unindexed-event-address | Eventos com parâmetros de endereço, mas nenhum parâmetro indexado | Informativo | Alta |
| 91 | unused-state | Variáveis de estado não utilizadas | Informativo | Alta |
| 92 | costly-loop | Operações custosas em um loop | Informativo | Média |
| 93 | dead-code | Funções que não são usadas | Informativo | Média |
| 94 | reentrancy-unlimited-gas | Vulnerabilidades de reentrância através de send e transfer | Informativo | Média |
| 95 | too-many-digits | Conformidade com boas práticas de notação numérica | Informativo | Média |
| 96 | cache-array-length | Detecta loops for que usam o membro length de algum array de armazenamento em sua condição de loop e não o modificam. | Otimização | Alta |
| 97 | constable-states | Variáveis de estado que poderiam ser declaradas constantes | Otimização | Alta |
| 98 | external-function | Função pública que poderia ser declarada externa | Otimização | Alta |
| 99 | immutable-states | Variáveis de estado que poderiam ser declaradas imutáveis | Otimização | Alta |
| 100 | var-read-using-this | Contrato lê sua própria variável usando this | Otimização | Alta |
| Utilizar o SlithIR para construir um gráfico de dependência de armazenamento |
| Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni Vigna |
| S&P 22 |
| Sailfish |
| SolType: Refinement Types for Arithmetic Overflow in Solidity | Usar o Slither como frontend para construir um sistema de tipos de refinamento | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 | - |
| Do Not Rug on Me: Leveraging Machine Learning Techniques for Automated Scam Detection | Usar o Slither para extrair características dos tokens (mintable, pausable, ..) | Mazorra, Bruno, Victor Adan, and Vanesa Daza | Mathematics 10.6 (2022) | - |
| MANDO: Multi-Level Heterogeneous Graph Embeddings for Fine-Grained Detection of Smart Contract Vulnerabilities | Usar o Slither para extrair o CFG e o grafo de chamadas | Hoang Nguyen, Nhat-Minh Nguyen, Chunyao Xie, Zahra Ahmadi, Daniel Kudendo, Thanh-Nam Doan and Lingxiao Jiang | IEEE 9th International Conference on Data Science and Advanced Analytics (DSAA, 2022) | ge-sc |
| Automated Auditing of Price Gouging TOD Vulnerabilities in Smart Contracts | Usar o Slither para extrair o CFG e dependências de dados | Sidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris, and Fan Long | 2022 IEEE International Conference on Blockchain and Cryptocurrency (ICBC) | Smart-Contract-Repair |
| Modeling and Enforcing Access Control Policies for Smart Contracts | Estender as dependências de dados do Slither | Jan-Philipp Toberg, Jonas Schiffl, Frederik Reiche, Bernhard Beckert, Robert Heinrich, Ralf Reussner | IEEE International Conference on Decentralized Applications and Infrastructures (DAPPS), 2022 | SolidityAccessControlEnforcement |
| Smart Contract Vulnerability Detection Based on Deep Learning and Multimodal Decision Fusion | Usar o Slither para extrair o CFG | Weichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng, and Xuan Hu | Sensors 2023, 23, 7246 | - |
| Semantic-enriched Code Knowledge Graph to Reveal Unknowns in Smart Contract Code Reuse | Usar o Slither para extrair as características do código (CFG, função, tipos de parâmetros, ..) | Qing Huang, Dianshu Liao, Zhenchang Xing, Zhengkang Zuo, Changjing Wang, Xin Xia | ACM Transactions on Software Engineering and Methodology, 2023 | - |
| Smart Contract Parallel Execution with Fine-Grained State Accesses | Usar o Slither para construir gráficos de acesso a estado | Xiaodong Qi, Jiao Jiao, Yi Li | International Conference on Distributed Computing Systems (ICDCS), 2023 | - |
| Bad Apples: Understanding the Centralized Security Risks in Decentralized Ecosystems | Implementar uma análise interna sobre o Slither | Kailun Yan , Jilian Zhang , Xiangyu Liu , Wenrui Diao , Shanqing Guo | ACM Web Conference April 2023 | - |
| Identifying Vulnerabilities in Smart Contracts using Interval Analysis | Criar 4 detectores sobre o Slither | Ştefan-Claudiu Susan, Andrei Arusoaie | FROM 2023 | - |
| Storage State Analysis and Extraction of Ethereum Blockchain Smart Contracts (sem PDF em acesso aberto) | Utilizar o CFG e a AST do Slither | Maha Ayub , Tania Saleem , Muhammad Janjua , Talha Ahmad | TOSEM 2023 | SmartMuv |