Volver a actualizaciones
Nuevo releaseJul 29, 2026

slither v0.11.6

Analizador estático para Solidity y Vyper

Compartir

Slither, el analizador estático de contratos inteligentes

Slither Static Analysis Framework Logo

Build Status PyPI Slither - Read the Docs Slither - Wiki

Únete al Slack de Empire Hacking

Slack Status

- Discusiones y Soporte

Slither es un framework de análisis estático para Solide y Vyper escrito en Python3. Ejecuta un conjunto de detectores de vulnerabilidades, imprime información visual sobre los detalles del contrato y proporciona una API para escribir fácilmente análisis personalizados. Slither permite a los desarrolladores encontrar vulnerabilidades, mejorar su comprensión del código y prototipar rápidamente análisis personalizados.

Características

  • Detecta código Solidity vulnerable con bajos falsos positivos (ver la lista de trofeos)
  • Identifica dónde ocurre la condición de error en el código fuente
  • Se integra fácilmente en la integración continua y en compilaciones de Hardhat/Foundry
  • 'Impresoras' integradas que reportan rápidamente información crucial del contrato
  • API de detectores para escribir análisis personalizados en Python
  • Capacidad de analizar contratos escritos con Solidity >= 0.4
  • Representación intermedia (SlithIR) permite análisis simples y de alta precisión
  • Analiza correctamente el 99.9% de todo el código Solidity público
  • Tiempo de ejecución promedio de menos de 1 segundo por contrato
  • Se integra con el escaneo de código de Github en CI
  • Soporte para contratos inteligentes Vyper

Uso

Ejecuta Slither en una aplicación Hardhat/Foundry/Dapp/Brownie:```console slither .

Esta es la opción preferida si tu proyecto tiene dependencias, ya que Slither se basa en el marco de compilación subyacente para compilar el código fuente.

Sin embargo, puedes ejecutar Slither en un solo archivo que no importe dependencias:```console
slither tests/uninitialized.sol

Cómo instalar

Nota Slither requiere Python 3.10+. Si no vas a usar uno de los frameworks de compilación compatibles, necesitas solc, el compilador de Solidity; recomendamos usar solc-select para cambiar convenientemente entre versiones de solc.

Usando uv (Recomendado)

uv es un gestor de paquetes de Python rápido que es 10-100x más rápido que pip.```console

Install uv if you haven't already

curl -LsSf https://astral.sh/uv/install.sh | sh

Install slither as a tool

uv tool install slither-analyzer

Or run slither without installation

uvx --from slither-analyzer slither

Para actualizar:```console
uv tool upgrade slither-analyzer

Usando Pip```console

python3 -m pip install slither-analyzer

Para actualizar:```console
python3 -m pip install --upgrade slither-analyzer

Usando Brew```console

brew install slither-analyzer

### Usando Git (Desarrollo)```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>

The -e flag installs in editable mode, meaning changes to the source code are immediately reflected without reinstalling.

Usando Docker

Use la imagen docker eth-security-toolbox. Incluye todas nuestras herramientas de seguridad y todas las versiones principales de Solidity en una sola imagen. /home/share se montará en /share dentro del contenedor.```bash docker pull trailofbits/eth-security-toolbox

Para compartir un directorio en el contenedor:```bash
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox

Integración

  • Para integración de GitHub Action, usa slither-action.
  • Para integración de pre-commit, usa (reemplaza $GIT_TAG con la etiqueta real) ```YAML
  • Para generar un informe en Markdown, use slither [objetivo] --checklist.
  • Para generar un Markdown con resaltado de código fuente de GitHub, use slither [objetivo] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/ (reemplace ORG, REPO, COMMIT)

Detectores

NúmDetectorQué DetectaImpactoConfianza
1abiencoderv2-arrayArray abiencoderv2 de almacenamientoAltoAlta
2arbitrary-send-erc20transferFrom usa from arbitrarioAltoAlta
3array-by-referenceModificar array de almacenamiento por valorAltoAlta
4encode-packed-collisionColisión de ABI encodePackedAltoAlta
5incorrect-shiftEl orden de los parámetros en una instrucción de desplazamiento es incorrecto.AltoAlta
6multiple-constructorsMúltiples esquemas de constructorAltoAlta
7name-reusedNombre de contrato reutilizadoAltoAlta
8protected-varsVariables no protegidas detectadasAltoAlta
9public-mappings-nestedMapeos públicos con variables anidadasAltoAlta
10rtloSe utiliza el carácter de control de anulación de derecha a izquierdaAltoAlta
11shadowing-stateSombreado de variables de estadoAltoAlta
12suicidalFunciones que permiten a cualquiera autodestruir el contratoAltoAlta
13uninitialized-stateVariables de estado no inicializadasAltoAlta
14uninitialized-storageVariables de almacenamiento no inicializadasAltoAlta
15unprotected-upgradeContrato actualizable desprotegidoAltoAlta
16arbitrary-send-erc20-permittransferFrom usa from arbitrario con permitAltoMedia
17arbitrary-send-ethFunciones que envían Ether a destinos arbitrariosAltoMedia
18controlled-array-lengthAsignación de longitud de array contaminadaAltoMedia
19controlled-delegatecallDestino de delegatecall controladoAltoMedia
20delegatecall-loopFunciones pagables que usan delegatecall dentro de un bucleAltoMedia
21incorrect-expExponenciación incorrectaAltoMedia
22incorrect-returnSi se usa return incorrectamente en modo ensamblador.AltoMedia
23msg-value-loopmsg.value dentro de un bucleAltoMedia
24reentrancy-ethVulnerabilidades de reentrada (robo de ethers)AltoMedia
25reentrancy-balanceVulnerabilidades de reentrada que conducen a comprobaciones de saldo desactualizadasAltoMedia
26return-leaveSi se usa return en lugar de leave.AltoMedia
27storage-arrayError del compilador de array de enteros con signo de almacenamientoAltoMedia
28unchecked-transferTransferencia de tokens no verificadaAltoMedia
29weak-prngPRNG débilAltoMedia
30domain-separator-collisionDetecta tokens ERC20 que tienen una función cuya firma colisiona con DOMAIN_SEPARATOR() de EIP-2612MedioAlta
31enum-conversionDetecta conversión peligrosa de enumMedioAlta
32erc20-interfaceInterfaces ERC20 incorrectasMedioAlta
33erc721-interfaceInterfaces ERC721 incorrectasMedioAlta
34incorrect-equalityIgualdades estrictas peligrosasMedioAlta
35locked-etherContratos que bloquean etherMedioAlta
36mapping-deletionEliminación en mapeo que contiene una estructuraMedioAlta
37pyth-deprecated-functionsDetecta funciones obsoletas de PythMedioAlta
38pyth-unchecked-confidenceDetecta cuando el nivel de confianza de un precio de Pyth no está verificadoMedioAlta
39pyth-unchecked-publishtimeDetecta cuando el publishTime de un precio de Pyth no está verificadoMedioAlta
40shadowing-abstractSombreado de variables de estado de contratos abstractosMedioAlta
41tautological-compareComparar una variable consigo misma siempre devuelve verdadero o falso, dependiendo de la comparaciónMedioAlta
42tautologyTautología o contradicciónMedioAlta
43write-after-writeEscritura no utilizadaMedioAlta
44boolean-cstUso incorrecto de constante booleanaMedioMedia
45chronicle-unchecked-priceDetecta cuando el precio de Chronicle no está verificado.MedioMedia
46constant-function-asmFunciones constantes que usan código ensambladorMedioMedia
47constant-function-stateFunciones constantes que cambian el estadoMedioMedia
48divide-before-multiplyOrden de operaciones aritméticas imprecisoMedioMedia
49gelato-unprotected-randomnessLlamada a _requestRandomness dentro de una función desprotegidaMedioMedia
50out-of-order-retryableTransacciones retryables fuera de ordenMedioMedia
51reentrancy-no-ethVulnerabilidades de reentrada (sin robo de ethers)MedioMedia
52reused-constructorConstructor base reutilizadoMedioMedia
53tx-originUso peligroso de tx.originMedioMedia
54unchecked-lowlevelLlamadas de bajo nivel no verificadasMedioMedia
55unchecked-sendEnvío no verificadoMedioMedia
56uninitialized-localVariables locales no inicializadasMedioMedia
57unused-returnValores de retorno no utilizadosMedioMedia
58chainlink-feed-registryDetecta cuando se utiliza el registro de feeds de ChainlinkBajoAlta
59incorrect-modifierModificadores que pueden devolver el valor por defectoBajoAlta
60optimism-deprecationDetecta cuando se utiliza un predeploy o función obsoleta de Optimism.BajoAlta
61shadowing-builtinSombreado de símbolos incorporadosBajoAlta
62shadowing-localSombreado de variables localesBajoAlta
63uninitialized-fptr-cstLlamadas a punteros de función no inicializados en constructoresBajoAlta
64variable-scopeVariables locales usadas antes de su declaraciónBajoAlta
65void-cstConstructor llamado no implementadoBajoAlta
66calls-loopMúltiples llamadas en un bucleBajoMedia
67events-accessControl de acceso sin eventosBajoMedia
68events-mathsAritmética sin eventosBajoMedia
69incorrect-unaryExpresiones unarias peligrosasBajoMedia
70missing-zero-checkValidación de dirección cero faltanteBajoMedia
71reentrancy-benignVulnerabilidades de reentrada benignasBajoMedia
72reentrancy-eventsVulnerabilidades de reentrada que conducen a eventos fuera de ordenBajoMedia
73return-bombUn destinatario de bajo nivel puede consumir todo el gas del llamante inesperadamente.BajoMedia
74timestampUso peligroso de block.timestampBajoMedia
75assemblyUso de ensambladorInformativoAlta
76assert-state-changeCambio de estado en assertInformativoAlta
77boolean-equalComparación con constante booleanaInformativoAlta
78cyclomatic-complexityDetecta funciones con alta (> 11) complejidad ciclomáticaInformativoAlta
79deprecated-standardsEstándares obsoletos de SolidityInformativoAlta
80erc20-indexedParámetros de eventos ERC20 no indexadosInformativoAlta
81function-init-stateFunción que inicializa variables de estadoInformativoAlta
82incorrect-using-forDetecta el uso de la declaración using-for cuando ninguna función de una biblioteca determinada coincide con un tipo determinadoInformativoAlta
83low-level-callsLlamadas de bajo nivelInformativoAlta
84missing-inheritanceHerencia faltanteInformativoAlta
85naming-conventionConformidad con las convenciones de nomenclatura de SolidityInformativoAlta
86pragmaSi se utilizan diferentes directivas pragmaInformativoAlta
87redundant-statementsDeclaraciones redundantesInformativoAlta
88solc-versionVersión incorrecta de SolidityInformativoAlta
89unimplemented-functionsFunciones no implementadasInformativoAlta
90unindexed-event-addressEventos con parámetros de dirección pero sin parámetros indexadosInformativoAlta
91unused-stateVariables de estado no utilizadasInformativoAlta
92costly-loopOperaciones costosas en un bucleInformativoMedia
93dead-codeFunciones que no se utilizanInformativoMedia
94reentrancy-unlimited-gasVulnerabilidades de reentrada a través de send y transferInformativoMedia
95too-many-digitsConformidad con las mejores prácticas de notación numéricaInformativoMedia
96cache-array-lengthDetecta bucles for que usan el miembro length de algún array de almacenamiento en su condición de bucle y no lo modifican.OptimizaciónAlta
97constable-statesVariables de estado que podrían declararse constantesOptimizaciónAlta
98external-functionFunción pública que podría declararse externaOptimizaciónAlta
99immutable-statesVariables de estado que podrían declararse inmutablesOptimizaciónAlta
100var-read-using-thisEl contrato lee su propia variable usando thisOptimizaciónAlta

Para más información, consulte

Impresoras

Impresoras de Revisión Rápida

Impresoras de Revisión en Profundidad* call-graph: Exportar el grafo de llamadas de los contratos a un archivo dot

Para ejecutar un printer, use --print y una lista separada por comas de printers.

Consulte la documentación de Printer para obtener la lista completa.

Herramientas

Consulte la documentación de Herramientas para herramientas adicionales.

Contáctenos para obtener ayuda en la creación de herramientas personalizadas.

Documentación de la API

La documentación sobre los componentes internos de Slither está disponible aquí.

Obtener ayuda

No dude en pasar por nuestro canal de Slack (#ethereum) para obtener ayuda sobre el uso o la extensión de Slither.

FAQ

¿Cómo excluyo mocks o pruebas?

¿Cómo soluciono el error "archivo desconocido" o problemas de compilación?

  • Debido a que Slither requiere el AST de solc, debe tener todas las dependencias disponibles. Si un contrato tiene dependencias, slither contract.sol fallará. En su lugar, use slither . en el directorio padre de contracts/ (debería ver contracts/ cuando ejecute ls). Si tiene una carpeta node_modules/, debe estar en el mismo directorio que contracts/. Para verificar que este problema está relacionado con Slither, ejecute el comando de compilación del framework que está utilizando, por ejemplo npx hardhat compile. Eso debe funcionar correctamente; de lo contrario, el motor de compilación de Slither, crytic-compile, no puede generar el AST.

Licencia

Slither está licenciado y distribuido bajo la licencia AGPLv3. Contáctenos si busca una excepción a los términos.

Publicaciones

Publicación de Trail of Bits

Publicaciones externas

TítuloUsoAutoresLugarCódigo
ReJection: Un Método de Detección de Vulnerabilidades de Reentrancia basado en ASTAnálisis basado en AST construido sobre SlitherRui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia ChenCTCIS 19-
MPro: Combinando Análisis Estático y Simbólico para Pruebas Escalables de Contratos InteligentesAprovechar la dependencia de datos a través de SlitherWilliam Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay GaneshISSRE 2019MPro
ETHPLOIT: Desde Fuzzing hasta Generación Eficiente de Exploits contra Contratos InteligentesAprovechar la dependencia de datos a través de SlitherQingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi MaSANER 20-
Verificación de Contratos Inteligentes Ethereum: Un Enfoque de Model CheckingEjecución simbólica construida sobre el CFG de SlitherTam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho QuanIJMLC 20-
Reparación de Contratos InteligentesDepender de los detectores de vulnerabilidades de SlitherXiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik RoychoudhuryTOSEM 20SCRepair
Desmitificando Bucles en Contratos InteligentesAprovechar la dependencia de datos a través de SlitherBen Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil DilligASE 20-
Estimación Dinámica de Gas Basada en Trazas de Bucles en Contratos InteligentesUsar el CFG de Slither para detectar buclesChunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang HuIEEE Open J. Comput. Soc. 1 (2020)-
SAILFISH: Detectando Vulnerabilidades de Inconsistencia de Estado en Contratos Inteligentes en SegundosDepender de SlithIR para construir un grafo de dependencia de almacenamientoPriyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni VignaS&P 22Sailfish
SolType: Tipos de Refinamiento para Desbordamiento Aritmético en SolidityUsar Slither como frontend para construir un sistema de tipos de refinamientoBryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu FengPOPL 22-
No Me Estafes: Aprovechando Técnicas de Aprendizaje Automático para la Detección Automatizada de EstafasUsar Slither para extraer características de tokens (minteable, pausable, ..)Mazorra, Bruno, Victor Adan, and Vanesa DazaMathematics 10.6 (2022)-
MANDO: Incrustaciones de Grafos Heterogéneos Multinivel para la Detección Fina de Vulnerabilidades en Contratos InteligentesUsar Slither para extraer el CFG y el grafo de llamadasHoang Nguyen, Nhat-Minh Nguyen, Chunyao Xie, Zahra Ahmadi, Daniel Kudendo, Thanh-Nam Doan and Lingxiao JiangIEEE 9th International Conference on Data Science and Advanced Analytics (DSAA, 2022)ge-sc
Auditoría Automatizada de Vulnerabilidades TOD de Sobreprecio en Contratos InteligentesUsar Slither para extraer el CFG y las dependencias de datosSidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris, and Fan Long2022 IEEE International Conference on Blockchain and Cryptocurrency (ICBC)Smart-Contract-Repair
Modelado y Aplicación de Políticas de Control de Acceso para Contratos InteligentesExtender las dependencias de datos de SlitherJan-Philipp Toberg, Jonas Schiffl, Frederik Reiche, Bernhard Beckert, Robert Heinrich, Ralf ReussnerIEEE International Conference on Decentralized Applications and Infrastructures (DAPPS), 2022SolidityAccessControlEnforcement
Detección de Vulnerabilidades en Contratos Inteligentes Basada en Aprendizaje Profundo y Fusión de Decisiones MultimodalesUsar Slither para extraer el CFGWeichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng, and Xuan HuSensors 2023, 23, 7246-
Grafo de Conocimiento de Código Enriquecido Semánticamente para Revelar Desconocidos en la Reutilización de Código de Contratos InteligentesUsar Slither para extraer las características del código (CFG, función, tipos de parámetros, ..)Qing Huang, Dianshu Liao, Zhenchang Xing, Zhengkang Zuo, Changjing Wang, Xin XiaACM Transactions on Software Engineering and Methodology, 2023-
Ejecución Paralela de Contratos Inteligentes con Accesos Finos al EstadoUsar Slither para construir grafos de acceso al estadoXiaodong Qi, Jiao Jiao, Yi LiInternational Conference on Distributed Computing Systems (ICDCS), 2023-
Manzanas Podridas: Comprendiendo los Riesgos de Seguridad Centralizados en Ecosistemas DescentralizadosImplementar un análisis interno sobre SlitherKailun Yan , Jilian Zhang , Xiangyu Liu , Wenrui Diao , Shanqing GuoACM Web Conference April 2023-
Identificación de Vulnerabilidades en Contratos Inteligentes usando Análisis de IntervalosCrear 4 detectores sobre SlitherŞtefan-Claudiu Susan, Andrei ArusoaieFROM 2023-
Análisis y Extracción del Estado de Almacenamiento de Contratos Inteligentes en la Blockchain de Ethereum (sin PDF en acceso abierto)Depender del CFG y AST de SlitherMaha Ayub , Tania Saleem , Muhammad Janjua , Talha AhmadTOSEM 2023SmartMuv

Si está utilizando Slither en un trabajo académico, considere postularse al Premio de Investigación Crytic de $10k.

Categorías