Junte-se ao Empire Hacking Slack
- Discussões e Suporte
Slither é uma estrutura de análise estática Solidity & Vyper escrita em Python3. Ele executa um conjunto de detectores de vulnerabilidade, imprime informações visuais sobre detalhes do contrato e fornece uma API para escrever facilmente análises personalizadas. O Slither permite que os desenvolvedores encontrem vulnerabilidades, melhorem a compreensão do código e criem rapidamente protótipos de análises personalizadas.
Execute o Slither em um aplicativo Hardhat/Foundry/Dapp/Brownie:
slither .
Esta é a opção preferida se o seu projeto tiver dependências, pois 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 importe dependências:
slither tests/uninitialized.sol
Observação
Slither requer Python 3.8+. Se você não for usar uma das estruturas de compilação suportadas, precisará de solc, o compilador Solidity; recomendamos usar solc-select para alternar convenientemente entre versões solc.
python3 -m pip install slither-analyzer
git clone https://github.com/crytic/slither.git && cd slither
python3 -m pip install .
Recomendamos usar um ambiente virtual Python, conforme detalhado nas Instruções de instalação do desenvolvedor, se você preferir instalar o Slither via git.
Use a imagem docker eth-security-toolbox
. Inclui todas as nossas ferramentas de segurança e todas as versões principais do Solidity em uma única imagem. /home/share
será montado em /share
no contêiner.
docker pull trailofbits/eth-security-toolbox
Para compartilhar um diretório no contêiner:
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
$GIT_TAG
pela tag real) - repo : https://github.com/crytic/slither
rev : $GIT_TAG
hooks :
- id : slither
slither [target] --checklist
.slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/
(substitua ORG
, REPO
, COMMIT
) Núm. | Detector | O que detecta | Impacto | Confiança |
---|---|---|---|---|
1 | abiencoderv2-array | Matriz abiencoderv2 de armazenamento | Alto | Alto |
2 | arbitrary-send-erc20 | transferFrom usa from arbitrário | Alto | Alto |
3 | array-by-reference | Modificando matriz de armazenamento por valor | Alto | Alto |
4 | encode-packed-collision | Colisão ABI encodePacked | Alto | Alto |
5 | incorrect-shift | A ordem dos parâmetros em uma instrução shift está incorreta. | Alto | Alto |
6 | multiple-constructors | Vários esquemas de construtor | Alto | Alto |
7 | name-reused | Nome do contrato reutilizado | Alto | Alto |
8 | protected-vars | Variáveis desprotegidas detectadas | Alto | Alto |
9 | public-mappings-nested | Mapeamentos públicos com variáveis aninhadas | Alto | Alto |
10 | rtlo | O caractere de controle de substituição da direita para a esquerda é usado | Alto | Alto |
11 | shadowing-state | Sombreamento de variáveis de estado | Alto | Alto |
12 | suicidal | Funções que permitem a qualquer pessoa destruir o contrato | Alto | Alto |
13 | uninitialized-state | Variáveis de estado não inicializadas | Alto | Alto |
14 | uninitialized-storage | Variáveis de armazenamento não inicializadas | Alto | Alto |
15 | unprotected-upgrade | Contrato atualizável desprotegido | Alto | Alto |
16 | codex | Use o Codex para encontrar vulnerabilidades. | Alto | Baixo |
17 | arbitrary-send-erc20-permit | transferFrom usa from arbitrário com permissão | Alto | Médio |
18 | arbitrary-send-eth | Funções que enviam Ether para destinos arbitrários | Alto | Médio |
19 | controlled-array-length | Atribuição de comprimento de matriz contaminada | Alto | Médio |
20 | controlled-delegatecall | Destino de chamada de delegação controlada | Alto | Médio |
21 | delegatecall-loop | Funções pagáveis usando delegatecall dentro de um loop | Alto | Médio |
22 | incorrect-exp | Exponenciação incorreta | Alto | Médio |
23 | incorrect-return | Se um return for usado incorretamente no modo de montagem. | Alto | Médio |
24 | msg-value-loop | msg.value dentro de um loop | Alto | Médio |
25 | reentrancy-eth | Vulnerabilidades de reentrada (roubo de éteres) | Alto | Médio |
26 | return-leave | Se um return for usado em vez de um leave . | Alto | Médio |
27 | storage-array | Bug do compilador de array inteiro de armazenamento assinado | Alto | Médio |
28 | unchecked-transfer | Transferência de tokens não verificada | Alto | Médio |
29 | weak-prng | PRNG fraco | Alto | Médio |
30 | domain-separator-collision | Detecta tokens ERC20 que possuem uma função cuja assinatura colide com DOMAIN_SEPARATOR() do EIP-2612 | Médio | Alto |
31 | enum-conversion | Detectar conversão de enum perigosa | Médio | Alto |
32 | erc20-interface | Interfaces ERC20 incorretas | Médio | Alto |
33 | erc721-interface | Interfaces ERC721 incorretas | Médio | Alto |
34 | incorrect-equality | Igualdades estritas perigosas | Médio | Alto |
35 | locked-ether | Contratos que bloqueiam o Ether | Médio | Alto |
36 | mapping-deletion | Exclusão no mapeamento contendo uma estrutura | Médio | Alto |
37 | shadowing-abstract | Variáveis de estado sombreadas de contratos abstratos | Médio | Alto |
38 | tautological-compare | Comparar uma variável consigo mesma sempre retorna verdadeiro ou falso, dependendo da comparação | Médio | Alto |
39 | tautology | Tautologia ou contradição | Médio | Alto |
40 | write-after-write | Gravação não utilizada | Médio | Alto |
41 | boolean-cst | Uso indevido da constante booleana | Médio | Médio |
42 | constant-function-asm | Funções constantes usando código assembly | Médio | Médio |
43 | constant-function-state | Funções constantes mudando o estado | Médio | Médio |
44 | divide-before-multiply | Ordem imprecisa de operações aritméticas | Médio | Médio |
45 | out-of-order-retryable | Transações repetíveis fora de ordem | Médio | Médio |
46 | reentrancy-no-eth | Vulnerabilidades de reentrada (sem roubo de éteres) | Médio | Médio |
47 | reused-constructor | Construtor base reutilizado | Médio | Médio |
48 | tx-origin | Uso perigoso de tx.origin | Médio | Médio |
49 | unchecked-lowlevel | Chamadas de baixo nível desmarcadas | Médio | Médio |
50 | unchecked-send | Envio desmarcado | Médio | Médio |
51 | uninitialized-local | Variáveis locais não inicializadas | Médio | Médio |
52 | unused-return | Valores de retorno não utilizados | Médio | Médio |
53 | incorrect-modifier | Modificadores que podem retornar o valor padrão | Baixo | Alto |
54 | shadowing-builtin | Sombreamento de símbolo integrado | Baixo | Alto |
55 | shadowing-local | Sombreamento de variáveis locais | Baixo | Alto |
56 | uninitialized-fptr-cst | Chamadas de ponteiro de função não inicializadas em construtores | Baixo | Alto |
57 | variable-scope | Variáveis locais usadas antes de sua declaração | Baixo | Alto |
58 | void-cst | Construtor chamado não implementado | Baixo | Alto |
59 | calls-loop | Várias chamadas em loop | Baixo | Médio |
60 | events-access | Controle de acesso a eventos ausentes | Baixo | Médio |
61 | events-maths | Aritmética de eventos ausentes | Baixo | Médio |
62 | incorrect-unary | Expressões unárias perigosas | Baixo | Médio |
63 | missing-zero-check | Validação de endereço zero ausente | Baixo | Médio |
64 | reentrancy-benign | Vulnerabilidades benignas de reentrada | Baixo | Médio |
65 | reentrancy-events | Vulnerabilidades de reentrada que levam a eventos fora de ordem | Baixo | Médio |
66 | return-bomb | Um receptor de nível baixo pode consumir todo o gás do chamador inesperadamente. | Baixo | Médio |
67 | timestamp | Uso perigoso de block.timestamp | Baixo | Médio |
68 | assembly | Uso de montagem | Informativo | Alto |
69 | assert-state-change | Afirmar mudança de estado | Informativo | Alto |
70 | boolean-equal | Comparação com constante booleana | Informativo | Alto |
71 | cyclomatic-complexity | Detecta funções com alta (> 11) complexidade ciclomática | Informativo | Alto |
72 | deprecated-standards | Padrões de solidez obsoletos | Informativo | Alto |
73 | erc20-indexed | Parâmetros de eventos ERC20 não indexados | Informativo | Alto |
74 | function-init-state | Função inicializando variáveis de estado | Informativo | Alto |
75 | incorrect-using-for | Detecta o uso da instrução using-for quando nenhuma função de uma determinada biblioteca corresponde a um determinado tipo | Informativo | Alto |
76 | low-level-calls | Chamadas de baixo nível | Informativo | Alto |
77 | missing-inheritance | Herança ausente | Informativo | Alto |
78 | naming-convention | Conformidade com as convenções de nomenclatura do Solidity | Informativo | Alto |
79 | pragma | Se diferentes diretivas pragmáticas forem usadas | Informativo | Alto |
80 | redundant-statements | Declarações redundantes | Informativo | Alto |
81 | solc-version | Versão incorreta do Solidity | Informativo | Alto |
82 | unimplemented-functions | Funções não implementadas | Informativo | Alto |
83 | unused-import | Detecta importações não utilizadas | Informativo | Alto |
84 | unused-state | Variáveis de estado não utilizadas | Informativo | Alto |
85 | costly-loop | Operações caras em um loop | Informativo | Médio |
86 | dead-code | Funções que não são usadas | Informativo | Médio |
87 | reentrancy-unlimited-gas | Vulnerabilidades de reentrada por meio de envio e transferência | Informativo | Médio |
88 | too-many-digits | Conformidade com as melhores práticas de notação numérica | Informativo | Médio |
89 | cache-array-length | Detecta loops for que usam membros length de alguma matriz de armazenamento em sua condição de loop e não o modificam. | Otimização | Alto |
90 | constable-states | Variáveis de estado que podem ser declaradas constantes | Otimização | Alto |
91 | external-function | Função pública que pode ser declarada externa | Otimização | Alto |
92 | immutable-states | Variáveis de estado que podem ser declaradas imutáveis | Otimização | Alto |
93 | var-read-using-this | O contrato lê sua própria variável usando this | Otimização | Alto |
Para obter mais informações, consulte
human-summary
: imprima um resumo legível dos contratosinheritance-graph
: exporta o gráfico de herança de cada contrato para um arquivo de pontocontract-summary
: imprime um resumo dos contratosloc
: conte 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 de origem (SRC), dependências (DEP) e arquivos de teste (TEST).call-graph
: Exporta o call-graph dos contratos para um arquivo de pontoscfg
: Exporta o CFG de cada funçãofunction-summary
: Imprime um resumo das funçõesvars-and-auth
: Imprime as variáveis de estado escritas e a autorização das funçõesnot-pausable
: Funções de impressão que não usam o modificador whenNotPaused
. Para executar uma impressora, use --print
e uma lista de impressoras separadas por vírgula.
Consulte a documentação da impressora para obter as listas completas.
slither-check-upgradeability
: Revise a capacidade de atualização baseada em delegatecall
slither-prop
: Teste de unidade automático e geração de propriedadesslither-flat
: Achatar uma base de códigoslither-check-erc
: Verifique a conformidade do ERCslither-format
: geração automática de patchesslither-read-storage
: Ler valores de armazenamento de contratosslither-interface
: Gera uma interface para um contratoConsulte a documentação da ferramenta para ferramentas adicionais.
Contate-nos para obter ajuda na construção de ferramentas personalizadas.
A documentação interna do Slither está disponível aqui.
Sinta-se à vontade para visitar nosso canal do Slack (#ethereum) para obter ajuda para usar ou estender o Slither.
A documentação da impressora descreve as informações que o Slither é capaz de visualizar para cada contrato.
A documentação do Detector descreve como escrever novas análises 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 do SlithIR.
Como excluo simulações ou testes?
Como faço para corrigir “arquivos desconhecidos” ou problemas de compilação?
slither contract.sol
falhará. Em vez disso, use slither .
no diretório pai de contracts/
(você deverá ver contracts/
ao executar ls
). Se você tiver uma pasta node_modules/
, ela deverá estar no mesmo diretório que contracts/
. Para verificar se esse problema está relacionado ao slither, execute o comando de compilação para a estrutura que você está usando, por exemplo, npx hardhat compile
. Isso deve funcionar com sucesso; caso contrário, o mecanismo de compilação do slither, crytic-compile, não poderá gerar o AST. 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 | Local | Código |
---|---|---|---|---|
ReJection: um método de detecção de vulnerabilidade de reentrada baseado em AST | Análise baseada em AST construída sobre Slither | Rui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS 19 | - |
MPro: Combinando Análise Estática e Simbólica para Testes Escaláveis de Contratos Inteligentes | Aproveite a dependência de dados por meio do Slither | William Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay Ganesh | ISSRE 2019 | MPro |
ETHPLOIT: Da difusão à geração eficiente de exploração contra contratos inteligentes | Aproveite a dependência de dados por meio do Slither | Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | SANER 20 | - |
Verificação de contratos inteligentes Ethereum: uma abordagem de verificação de modelo | Execução simbólica construída em cima do CFG de Slither | Tam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho Quan | IJMLC20 | - |
Reparo de contrato inteligente | Confie nos detectores de vulnerabilidades do Slither | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 | SCReparar |
Desmistificando Loops em Contratos Inteligentes | Aproveite a dependência de dados por meio do Slither | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 | - |
Estimativa dinâmica de gás baseada em rastreamento de loops em contratos inteligentes | Use 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: Verificando bugs de inconsistência de estado de contrato inteligente em segundos | Confie no SlithIR para construir um gráfico de dependência de armazenamento | Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel e Giovanni Vigna | S&P 22 | Veleiro |
SolType: Tipos de refinamento para estouro aritmético no Solidity | Use o Slither como frontend para construir um sistema de tipo de refinamento | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 | - |
Não me afaste: aproveitando técnicas de aprendizado de máquina para detecção automatizada de golpes | Use o Slither para extrair recursos de tokens (mintable, pausável, ..) | Mazorra, Bruno, Victor Adan e Vanesa Daza | Matemática 10.6 (2022) | - |
MANDO: Incorporações de gráficos heterogêneos de vários níveis para detecção refinada de vulnerabilidades de contratos inteligentes | Use o Slither para extrair o CFG e o gráfico de chamadas | Hoang Nguyen, Nhat-Minh Nguyen, Chunyao Xie, Zahra Ahmadi, Daniel Kudendo, Thanh-Nam Doan e Lingxiao Jiang | 9ª Conferência Internacional IEEE sobre Ciência de Dados e Análise Avançada (DSAA, 2022) | ge-sc |
Auditoria automatizada de vulnerabilidades TOD de manipulação de preços em contratos inteligentes | Use o Slither para extrair o CFG e as dependências de dados | Sidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris e Fan Long | Conferência Internacional IEEE 2022 sobre Blockchain e Criptomoeda (ICBC) | Reparo de contrato inteligente |
Modelando e aplicando políticas de controle de acesso para contratos inteligentes | Estenda as dependências de dados do Slither | Jan-Philipp Toberg, Jonas Schiffl, Frederik Reiche, Bernhard Beckert, Robert Heinrich, Ralf Reussner | Conferência Internacional IEEE sobre Aplicações e Infraestruturas Descentralizadas (DAPPS), 2022 | SolidityAccessControlEnforcement |
Detecção inteligente de vulnerabilidades em contratos com base em aprendizado profundo e fusão de decisões multimodais | Use o Slither para extrair o CFG | Weichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng e Xuan Hu | Sensores 2023, 23, 7246 | - |
Gráfico de conhecimento de código enriquecido semântico para revelar incógnitas na reutilização de código de contrato inteligente | Use o Slither para extrair os recursos do código (CFG, função, tipos de parâmetros, ..) | Qing Huang, Dianshu Liao, Zhenchang Xing, Zhengkang Zuo, Changjing Wang, Xin Xia | Transações ACM em Engenharia e Metodologia de Software, 2023 | - |
Execução paralela de contrato inteligente com acessos estaduais refinados | Use o Slither para construir gráficos de acesso de estado | Xiaodong Qi, Jiao Jiao, Yi Li | Conferência Internacional sobre Sistemas de Computação Distribuída (ICDCS), 2023 | - |
Maçãs Ruins: Compreendendo os Riscos de Segurança Centralizados em Ecossistemas Descentralizados | Implementar uma análise interna em cima do Slither | Kailun Yan, Jilian Zhang, Xiangyu Liu, Wenrui Diao, Shanqing Guo | Conferência Web ACM, abril de 2023 | - |
Identificando vulnerabilidades em contratos inteligentes usando análise de intervalo | Crie 4 detectores em cima do Slither | Ştefan-Claudiu Susan, Andrei Arusoaie | A PARTIR DE 2023 | - |
Análise do estado de armazenamento e extração de contratos inteligentes Ethereum Blockchain (sem PDF em acesso aberto) | Confie no CFG e AST do Slither | Maha Ayub, Tania Saleem, Muhammad Janjua, Talha Ahmad | TOSEM 2023 | SmartMuv |
Se você estiver usando o Slither em um trabalho acadêmico, considere se inscrever no Crytic $ 10k Research Prize.