
Analizador estático para Solidity y Vyper
Únete al Slack de Empire Hacking
- 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.
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
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.
uv es un gestor de paquetes de Python rápido que es 10-100x más rápido que pip.```console
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install slither-analyzer
uvx --from slither-analyzer slither
Para actualizar:```console
uv tool upgrade slither-analyzer
python3 -m pip install slither-analyzer
Para actualizar:```console
python3 -m pip install --upgrade slither-analyzer
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.
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
$GIT_TAG con la etiqueta real) ```YAML
slither [objetivo] --checklist.slither [objetivo] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/ (reemplace ORG, REPO, COMMIT)| Núm | Detector | Qué Detecta | Impacto | Confianza |
|---|---|---|---|---|
| 1 | abiencoderv2-array | Array abiencoderv2 de almacenamiento | Alto | Alta |
| 2 | arbitrary-send-erc20 | transferFrom usa from arbitrario | Alto | Alta |
| 3 | array-by-reference | Modificar array de almacenamiento por valor | Alto | Alta |
| 4 | encode-packed-collision | Colisión de ABI encodePacked | Alto | Alta |
| 5 | incorrect-shift | El orden de los parámetros en una instrucción de desplazamiento es incorrecto. | Alto | Alta |
| 6 | multiple-constructors | Múltiples esquemas de constructor | Alto | Alta |
| 7 | name-reused | Nombre de contrato reutilizado | Alto | Alta |
| 8 | protected-vars | Variables no protegidas detectadas | Alto | Alta |
| 9 | public-mappings-nested | Mapeos públicos con variables anidadas |
Para más información, consulte
human-summary: Imprime un resumen legible por humanos de los contratosinheritance-graph: Exporta el gráfico de herencia de cada contrato a un archivo dotcontract-summary: Imprime un resumen de los contratosloc: Cuenta el número total de líneas de código (LOC), líneas de código fuente (SLOC) y líneas de código de comentario (CLOC) encontradas en archivos fuente (SRC), dependencias (DEP) y archivos de prueba (TEST).entry-points: Imprime todas las funciones de punto de entrada que cambian el estado y sus variables de los contratoscall-graph: Exportar el grafo de llamadas de los contratos a un archivo dotcfg: Exportar el CFG de cada funciónfunction-summary: Imprimir un resumen de las funcionesvars-and-auth: Imprimir las variables de estado escritas y la autorización de las funcionesnot-pausable: Imprimir funciones que no usan el modificador whenNotPaused.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.
slither-check-upgradeability: Revisar la actualización basada en delegatecallslither-prop: Generación automática de pruebas unitarias y propiedadesslither-flat: Aplanar una base de códigoslither-check-erc: Verificar la conformidad con los ERCslither-read-storage: Leer valores de almacenamiento de contratosslither-interface: Generar una interfaz para un contratoConsulte la documentación de Herramientas para herramientas adicionales.
Contáctenos para obtener ayuda en la creación de herramientas personalizadas.
La documentación sobre los componentes internos de Slither está disponible aquí.
No dude en pasar por nuestro canal de Slack (#ethereum) para obtener ayuda sobre el uso o la extensión de Slither.
La documentación de Printer describe la información que Slither es capaz de visualizar para cada contrato.
La documentación de Detector describe cómo escribir un nuevo análisis de vulnerabilidades.
La documentación de la API describe los métodos y objetos disponibles para análisis personalizados.
La documentación de SlithIR describe la representación intermedia SlithIR.
¿Cómo excluyo mocks o pruebas?
¿Cómo soluciono el error "archivo desconocido" o problemas de compilación?
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.Slither está licenciado y distribuido bajo la licencia AGPLv3. Contáctenos si busca una excepción a los términos.
| Título | Uso | Autores | Lugar | Código |
|---|---|---|---|---|
| ReJection: Un Método de Detección de Vulnerabilidades de Reentrancia basado en AST | Análisis basado en AST construido sobre Slither | Rui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS 19 | - |
| MPro: Combinando Análisis Estático y Simbólico para Pruebas Escalables de Contratos Inteligentes | Aprovechar la dependencia de datos a través de Slither | William Zhang, Sebastian Banescu, Leodardo Pasos, Steven Stewart, Vijay Ganesh | ISSRE 2019 | MPro |
| ETHPLOIT: Desde Fuzzing hasta Generación Eficiente de Exploits contra Contratos Inteligentes | Aprovechar la dependencia de datos a través de Slither | Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | SANER 20 | - |
| Verificación de Contratos Inteligentes Ethereum: Un Enfoque de Model Checking | Ejecución simbólica construida sobre el CFG de Slither | Tam Bang, Hoang H Nguyen, Dung Nguyen, Toan Trieu, Tho Quan | IJMLC 20 | - |
| Reparación de Contratos Inteligentes | Depender de los detectores de vulnerabilidades de Slither | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 | SCRepair |
| Desmitificando Bucles en Contratos Inteligentes | Aprovechar la dependencia de datos a través de Slither | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | ASE 20 | - |
| Estimación Dinámica de Gas Basada en Trazas de Bucles en Contratos Inteligentes | Usar el CFG de Slither para detectar bucles | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Comput. Soc. 1 (2020) |
Si está utilizando Slither en un trabajo académico, considere postularse al Premio de Investigación Crytic de $10k.
| Alto |
| Alta |
| 10 | rtlo | Se utiliza el carácter de control de anulación de derecha a izquierda | Alto | Alta |
| 11 | shadowing-state | Sombreado de variables de estado | Alto | Alta |
| 12 | suicidal | Funciones que permiten a cualquiera autodestruir el contrato | Alto | Alta |
| 13 | uninitialized-state | Variables de estado no inicializadas | Alto | Alta |
| 14 | uninitialized-storage | Variables de almacenamiento no inicializadas | Alto | Alta |
| 15 | unprotected-upgrade | Contrato actualizable desprotegido | Alto | Alta |
| 16 | arbitrary-send-erc20-permit | transferFrom usa from arbitrario con permit | Alto | Media |
| 17 | arbitrary-send-eth | Funciones que envían Ether a destinos arbitrarios | Alto | Media |
| 18 | controlled-array-length | Asignación de longitud de array contaminada | Alto | Media |
| 19 | controlled-delegatecall | Destino de delegatecall controlado | Alto | Media |
| 20 | delegatecall-loop | Funciones pagables que usan delegatecall dentro de un bucle | Alto | Media |
| 21 | incorrect-exp | Exponenciación incorrecta | Alto | Media |
| 22 | incorrect-return | Si se usa return incorrectamente en modo ensamblador. | Alto | Media |
| 23 | msg-value-loop | msg.value dentro de un bucle | Alto | Media |
| 24 | reentrancy-eth | Vulnerabilidades de reentrada (robo de ethers) | Alto | Media |
| 25 | reentrancy-balance | Vulnerabilidades de reentrada que conducen a comprobaciones de saldo desactualizadas | Alto | Media |
| 26 | return-leave | Si se usa return en lugar de leave. | Alto | Media |
| 27 | storage-array | Error del compilador de array de enteros con signo de almacenamiento | Alto | Media |
| 28 | unchecked-transfer | Transferencia de tokens no verificada | Alto | Media |
| 29 | weak-prng | PRNG débil | Alto | Media |
| 30 | domain-separator-collision | Detecta tokens ERC20 que tienen una función cuya firma colisiona con DOMAIN_SEPARATOR() de EIP-2612 | Medio | Alta |
| 31 | enum-conversion | Detecta conversión peligrosa de enum | Medio | Alta |
| 32 | erc20-interface | Interfaces ERC20 incorrectas | Medio | Alta |
| 33 | erc721-interface | Interfaces ERC721 incorrectas | Medio | Alta |
| 34 | incorrect-equality | Igualdades estrictas peligrosas | Medio | Alta |
| 35 | locked-ether | Contratos que bloquean ether | Medio | Alta |
| 36 | mapping-deletion | Eliminación en mapeo que contiene una estructura | Medio | Alta |
| 37 | pyth-deprecated-functions | Detecta funciones obsoletas de Pyth | Medio | Alta |
| 38 | pyth-unchecked-confidence | Detecta cuando el nivel de confianza de un precio de Pyth no está verificado | Medio | Alta |
| 39 | pyth-unchecked-publishtime | Detecta cuando el publishTime de un precio de Pyth no está verificado | Medio | Alta |
| 40 | shadowing-abstract | Sombreado de variables de estado de contratos abstractos | Medio | Alta |
| 41 | tautological-compare | Comparar una variable consigo misma siempre devuelve verdadero o falso, dependiendo de la comparación | Medio | Alta |
| 42 | tautology | Tautología o contradicción | Medio | Alta |
| 43 | write-after-write | Escritura no utilizada | Medio | Alta |
| 44 | boolean-cst | Uso incorrecto de constante booleana | Medio | Media |
| 45 | chronicle-unchecked-price | Detecta cuando el precio de Chronicle no está verificado. | Medio | Media |
| 46 | constant-function-asm | Funciones constantes que usan código ensamblador | Medio | Media |
| 47 | constant-function-state | Funciones constantes que cambian el estado | Medio | Media |
| 48 | divide-before-multiply | Orden de operaciones aritméticas impreciso | Medio | Media |
| 49 | gelato-unprotected-randomness | Llamada a _requestRandomness dentro de una función desprotegida | Medio | Media |
| 50 | out-of-order-retryable | Transacciones retryables fuera de orden | Medio | Media |
| 51 | reentrancy-no-eth | Vulnerabilidades de reentrada (sin robo de ethers) | Medio | Media |
| 52 | reused-constructor | Constructor base reutilizado | Medio | Media |
| 53 | tx-origin | Uso peligroso de tx.origin | Medio | Media |
| 54 | unchecked-lowlevel | Llamadas de bajo nivel no verificadas | Medio | Media |
| 55 | unchecked-send | Envío no verificado | Medio | Media |
| 56 | uninitialized-local | Variables locales no inicializadas | Medio | Media |
| 57 | unused-return | Valores de retorno no utilizados | Medio | Media |
| 58 | chainlink-feed-registry | Detecta cuando se utiliza el registro de feeds de Chainlink | Bajo | Alta |
| 59 | incorrect-modifier | Modificadores que pueden devolver el valor por defecto | Bajo | Alta |
| 60 | optimism-deprecation | Detecta cuando se utiliza un predeploy o función obsoleta de Optimism. | Bajo | Alta |
| 61 | shadowing-builtin | Sombreado de símbolos incorporados | Bajo | Alta |
| 62 | shadowing-local | Sombreado de variables locales | Bajo | Alta |
| 63 | uninitialized-fptr-cst | Llamadas a punteros de función no inicializados en constructores | Bajo | Alta |
| 64 | variable-scope | Variables locales usadas antes de su declaración | Bajo | Alta |
| 65 | void-cst | Constructor llamado no implementado | Bajo | Alta |
| 66 | calls-loop | Múltiples llamadas en un bucle | Bajo | Media |
| 67 | events-access | Control de acceso sin eventos | Bajo | Media |
| 68 | events-maths | Aritmética sin eventos | Bajo | Media |
| 69 | incorrect-unary | Expresiones unarias peligrosas | Bajo | Media |
| 70 | missing-zero-check | Validación de dirección cero faltante | Bajo | Media |
| 71 | reentrancy-benign | Vulnerabilidades de reentrada benignas | Bajo | Media |
| 72 | reentrancy-events | Vulnerabilidades de reentrada que conducen a eventos fuera de orden | Bajo | Media |
| 73 | return-bomb | Un destinatario de bajo nivel puede consumir todo el gas del llamante inesperadamente. | Bajo | Media |
| 74 | timestamp | Uso peligroso de block.timestamp | Bajo | Media |
| 75 | assembly | Uso de ensamblador | Informativo | Alta |
| 76 | assert-state-change | Cambio de estado en assert | Informativo | Alta |
| 77 | boolean-equal | Comparación con constante booleana | Informativo | Alta |
| 78 | cyclomatic-complexity | Detecta funciones con alta (> 11) complejidad ciclomática | Informativo | Alta |
| 79 | deprecated-standards | Estándares obsoletos de Solidity | Informativo | Alta |
| 80 | erc20-indexed | Parámetros de eventos ERC20 no indexados | Informativo | Alta |
| 81 | function-init-state | Función que inicializa variables de estado | Informativo | Alta |
| 82 | incorrect-using-for | Detecta el uso de la declaración using-for cuando ninguna función de una biblioteca determinada coincide con un tipo determinado | Informativo | Alta |
| 83 | low-level-calls | Llamadas de bajo nivel | Informativo | Alta |
| 84 | missing-inheritance | Herencia faltante | Informativo | Alta |
| 85 | naming-convention | Conformidad con las convenciones de nomenclatura de Solidity | Informativo | Alta |
| 86 | pragma | Si se utilizan diferentes directivas pragma | Informativo | Alta |
| 87 | redundant-statements | Declaraciones redundantes | Informativo | Alta |
| 88 | solc-version | Versión incorrecta de Solidity | Informativo | Alta |
| 89 | unimplemented-functions | Funciones no implementadas | Informativo | Alta |
| 90 | unindexed-event-address | Eventos con parámetros de dirección pero sin parámetros indexados | Informativo | Alta |
| 91 | unused-state | Variables de estado no utilizadas | Informativo | Alta |
| 92 | costly-loop | Operaciones costosas en un bucle | Informativo | Media |
| 93 | dead-code | Funciones que no se utilizan | Informativo | Media |
| 94 | reentrancy-unlimited-gas | Vulnerabilidades de reentrada a través de send y transfer | Informativo | Media |
| 95 | too-many-digits | Conformidad con las mejores prácticas de notación numérica | Informativo | Media |
| 96 | cache-array-length | Detecta bucles for que usan el miembro length de algún array de almacenamiento en su condición de bucle y no lo modifican. | Optimización | Alta |
| 97 | constable-states | Variables de estado que podrían declararse constantes | Optimización | Alta |
| 98 | external-function | Función pública que podría declararse externa | Optimización | Alta |
| 99 | immutable-states | Variables de estado que podrían declararse inmutables | Optimización | Alta |
| 100 | var-read-using-this | El contrato lee su propia variable usando this | Optimización | Alta |
| - |
| SAILFISH: Detectando Vulnerabilidades de Inconsistencia de Estado en Contratos Inteligentes en Segundos | Depender de SlithIR para construir un grafo de dependencia de almacenamiento | Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel, and Giovanni Vigna | S&P 22 | Sailfish |
| SolType: Tipos de Refinamiento para Desbordamiento Aritmético en Solidity | Usar Slither como frontend para construir un sistema de tipos de refinamiento | Bryan Tan, Benjamin Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 | - |
| No Me Estafes: Aprovechando Técnicas de Aprendizaje Automático para la Detección Automatizada de Estafas | Usar Slither para extraer características de tokens (minteable, pausable, ..) | Mazorra, Bruno, Victor Adan, and Vanesa Daza | Mathematics 10.6 (2022) | - |
| MANDO: Incrustaciones de Grafos Heterogéneos Multinivel para la Detección Fina de Vulnerabilidades en Contratos Inteligentes | Usar Slither para extraer el CFG y el grafo de llamadas | 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 |
| Auditoría Automatizada de Vulnerabilidades TOD de Sobreprecio en Contratos Inteligentes | Usar Slither para extraer el CFG y las dependencias de datos | Sidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris, and Fan Long | 2022 IEEE International Conference on Blockchain and Cryptocurrency (ICBC) | Smart-Contract-Repair |
| Modelado y Aplicación de Políticas de Control de Acceso para Contratos Inteligentes | Extender las dependencias de datos de 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 |
| Detección de Vulnerabilidades en Contratos Inteligentes Basada en Aprendizaje Profundo y Fusión de Decisiones Multimodales | Usar Slither para extraer el CFG | Weichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng, and Xuan Hu | Sensors 2023, 23, 7246 | - |
| Grafo de Conocimiento de Código Enriquecido Semánticamente para Revelar Desconocidos en la Reutilización de Código de Contratos Inteligentes | Usar 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 Xia | ACM Transactions on Software Engineering and Methodology, 2023 | - |
| Ejecución Paralela de Contratos Inteligentes con Accesos Finos al Estado | Usar Slither para construir grafos de acceso al estado | Xiaodong Qi, Jiao Jiao, Yi Li | International Conference on Distributed Computing Systems (ICDCS), 2023 | - |
| Manzanas Podridas: Comprendiendo los Riesgos de Seguridad Centralizados en Ecosistemas Descentralizados | Implementar un análisis interno sobre Slither | Kailun Yan , Jilian Zhang , Xiangyu Liu , Wenrui Diao , Shanqing Guo | ACM Web Conference April 2023 | - |
| Identificación de Vulnerabilidades en Contratos Inteligentes usando Análisis de Intervalos | Crear 4 detectores sobre Slither | Ştefan-Claudiu Susan, Andrei Arusoaie | FROM 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 Slither | Maha Ayub , Tania Saleem , Muhammad Janjua , Talha Ahmad | TOSEM 2023 | SmartMuv |