Únete a Empire Hacking Slack
- Discusiones y soporte
Slither es un marco de análisis estático de Solidity & Vyper escrito en Python3. Ejecuta un conjunto de detectores de vulnerabilidad, 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 la comprensión del código y crear rápidamente prototipos de análisis personalizados.
Ejecute Slither en una aplicación Hardhat/Foundry/Dapp/Brownie:
slither .
Esta es la opción preferida si su 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 único archivo que no importe dependencias:
slither tests/uninitialized.sol
Nota
Deslizarse requiere Python 3.8+. Si no va a utilizar uno de los marcos de compilación compatibles, necesita solc, el compilador de Solidity; Recomendamos usar solc-select para cambiar cómodamente entre versiones de solc.
python3 -m pip install slither-analyzer
git clone https://github.com/crytic/slither.git && cd slither
python3 -m pip install .
Recomendamos utilizar un entorno virtual Python, como se detalla en las Instrucciones de instalación para desarrolladores, si prefiere instalar Slither a través de git.
Utilice la imagen acoplable 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
en el contenedor.
docker pull trailofbits/eth-security-toolbox
Para compartir un directorio en el contenedor:
docker run -it -v /home/share:/share trailofbits/eth-security-toolbox
$GIT_TAG
con etiqueta 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/
(reemplace ORG
, REPO
, COMMIT
) número | Detector | Lo que detecta | Impacto | Confianza |
---|---|---|---|---|
1 | abiencoderv2-array | Almacenamiento de matriz abiencoderv2 | Alto | Alto |
2 | arbitrary-send-erc20 | transferFrom utiliza arbitrario from | Alto | Alto |
3 | array-by-reference | Modificar la matriz de almacenamiento por valor | Alto | Alto |
4 | encode-packed-collision | Codificación ABI Colisión empaquetada | Alto | Alto |
5 | incorrect-shift | El orden de los parámetros en una instrucción de cambio es incorrecto. | Alto | Alto |
6 | multiple-constructors | Múltiples esquemas de constructor | Alto | Alto |
7 | name-reused | Se reutiliza el nombre del contrato | Alto | Alto |
8 | protected-vars | Variables desprotegidas detectadas | Alto | Alto |
9 | public-mappings-nested | Mapeos públicos con variables anidadas | Alto | Alto |
10 | rtlo | Se utiliza el carácter de control de anulación de derecha a izquierda | Alto | Alto |
11 | shadowing-state | Sombreado de variables de estado | Alto | Alto |
12 | suicidal | Funciones que permiten a cualquiera destruir el contrato. | Alto | Alto |
13 | uninitialized-state | Variables de estado no inicializadas | Alto | Alto |
14 | uninitialized-storage | Variables de almacenamiento no inicializadas | Alto | Alto |
15 | unprotected-upgrade | Contrato actualizable desprotegido | Alto | Alto |
16 | codex | Utilice Codex para encontrar vulnerabilidades. | Alto | Bajo |
17 | arbitrary-send-erc20-permit | transferFrom utiliza arbitrario desde con permiso | Alto | Medio |
18 | arbitrary-send-eth | Funciones que envían Ether a destinos arbitrarios | Alto | Medio |
19 | controlled-array-length | Asignación de longitud de matriz contaminada | Alto | Medio |
20 | controlled-delegatecall | Destino de llamada de delegado controlado | Alto | Medio |
21 | delegatecall-loop | Funciones pagables usando delegatecall dentro de un bucle | Alto | Medio |
22 | incorrect-exp | Exponenciación incorrecta | Alto | Medio |
23 | incorrect-return | Si una return se utiliza incorrectamente en modo ensamblado. | Alto | Medio |
24 | msg-value-loop | msg.value dentro de un bucle | Alto | Medio |
25 | reentrancy-eth | Vulnerabilidades de reentrada (robo de éteres) | Alto | Medio |
26 | return-leave | Si se utiliza una return en lugar de una leave . | Alto | Medio |
27 | storage-array | Error del compilador de matriz de enteros de almacenamiento firmado | Alto | Medio |
28 | unchecked-transfer | Transferencia de tokens sin control | Alto | Medio |
29 | weak-prng | PRNG débil | Alto | Medio |
30 | domain-separator-collision | Detecta tokens ERC20 que tienen una función cuya firma choca con DOMAIN_SEPARATOR() de EIP-2612 | Medio | Alto |
31 | enum-conversion | Detectar conversión de enumeración peligrosa | Medio | Alto |
32 | erc20-interface | Interfaces ERC20 incorrectas | Medio | Alto |
33 | erc721-interface | Interfaces ERC721 incorrectas | Medio | Alto |
34 | incorrect-equality | Peligrosas igualdades estrictas | Medio | Alto |
35 | locked-ether | Contratos que bloquean el éter | Medio | Alto |
36 | mapping-deletion | Eliminación en mapeo que contiene una estructura | Medio | Alto |
37 | shadowing-abstract | Variables de estado ocultas a partir de contratos abstractos. | Medio | Alto |
38 | tautological-compare | Comparar una variable consigo misma siempre devuelve verdadero o falso, dependiendo de la comparación. | Medio | Alto |
39 | tautology | Tautología o contradicción | Medio | Alto |
40 | write-after-write | Escritura no utilizada | Medio | Alto |
41 | boolean-cst | Mal uso de la constante booleana | Medio | Medio |
42 | constant-function-asm | Funciones constantes usando código ensamblador. | Medio | Medio |
43 | constant-function-state | Funciones constantes que cambian el estado. | Medio | Medio |
44 | divide-before-multiply | Orden de operaciones aritméticas impreciso | Medio | Medio |
45 | out-of-order-retryable | Transacciones reintentables fuera de orden | Medio | Medio |
46 | reentrancy-no-eth | Vulnerabilidades de reentrada (sin robo de éteres) | Medio | Medio |
47 | reused-constructor | Constructor de base reutilizado | Medio | Medio |
48 | tx-origin | Uso peligroso de tx.origin | Medio | Medio |
49 | unchecked-lowlevel | Llamadas de bajo nivel no marcadas | Medio | Medio |
50 | unchecked-send | Envío sin marcar | Medio | Medio |
51 | uninitialized-local | Variables locales no inicializadas | Medio | Medio |
52 | unused-return | Valores devueltos no utilizados | Medio | Medio |
53 | incorrect-modifier | Modificadores que pueden devolver el valor predeterminado. | Bajo | Alto |
54 | shadowing-builtin | Sombreado de símbolos incorporado | Bajo | Alto |
55 | shadowing-local | Sombreado de variables locales | Bajo | Alto |
56 | uninitialized-fptr-cst | Llamadas a punteros de funciones no inicializadas en constructores | Bajo | Alto |
57 | variable-scope | Variables locales utilizadas antes de su declaración. | Bajo | Alto |
58 | void-cst | Constructor llamado no implementado | Bajo | Alto |
59 | calls-loop | Varias llamadas en un bucle | Bajo | Medio |
60 | events-access | Control de acceso a eventos faltantes | Bajo | Medio |
61 | events-maths | Aritmética de eventos faltantes | Bajo | Medio |
62 | incorrect-unary | Expresiones unarias peligrosas | Bajo | Medio |
63 | missing-zero-check | Falta validación de dirección cero | Bajo | Medio |
64 | reentrancy-benign | Vulnerabilidades de reentrada benignas | Bajo | Medio |
65 | reentrancy-events | Vulnerabilidades de reentrada que conducen a eventos desordenados | Bajo | Medio |
66 | return-bomb | Una persona que llama con un nivel bajo puede consumir el gas de todas las personas que llaman inesperadamente. | Bajo | Medio |
67 | timestamp | Uso peligroso de block.timestamp | Bajo | Medio |
68 | assembly | Uso de ensamblaje | Informativo | Alto |
69 | assert-state-change | Afirmar el cambio de estado | Informativo | Alto |
70 | boolean-equal | Comparación con la constante booleana | Informativo | Alto |
71 | cyclomatic-complexity | Detecta funciones con alta complejidad ciclomática (> 11) | Informativo | Alto |
72 | deprecated-standards | Estándares de solidez obsoletos | Informativo | Alto |
73 | erc20-indexed | Parámetros de eventos ERC20 no indexados | Informativo | Alto |
74 | function-init-state | Función de inicialización de variables de estado. | Informativo | Alto |
75 | incorrect-using-for | Detecta el uso de declaraciones usando-para cuando ninguna función de una biblioteca determinada coincide con un tipo determinado | Informativo | Alto |
76 | low-level-calls | llamadas de bajo nivel | Informativo | Alto |
77 | missing-inheritance | herencia perdida | Informativo | Alto |
78 | naming-convention | Conformidad con las convenciones de nomenclatura de Solidity | Informativo | Alto |
79 | pragma | Si se utilizan diferentes directivas pragma | Informativo | Alto |
80 | redundant-statements | Declaraciones redundantes | Informativo | Alto |
81 | solc-version | Versión incorrecta de Solidez | Informativo | Alto |
82 | unimplemented-functions | Funciones no implementadas | Informativo | Alto |
83 | unused-import | Detecta importaciones no utilizadas | Informativo | Alto |
84 | unused-state | Variables de estado no utilizadas | Informativo | Alto |
85 | costly-loop | Operaciones costosas en bucle | Informativo | Medio |
86 | dead-code | Funciones que no se utilizan | Informativo | Medio |
87 | reentrancy-unlimited-gas | Vulnerabilidades de reentrada mediante envío y transferencia | Informativo | Medio |
88 | too-many-digits | Conformidad con las mejores prácticas de notación numérica | Informativo | Medio |
89 | cache-array-length | Detecta bucles for que utilizan un miembro length de alguna matriz de almacenamiento en su condición de bucle y no lo modifica. | Mejoramiento | Alto |
90 | constable-states | Variables de estado que podrían declararse constantes | Mejoramiento | Alto |
91 | external-function | Función pública que podría ser declarada externa | Mejoramiento | Alto |
92 | immutable-states | Variables de estado que podrían declararse inmutables | Mejoramiento | Alto |
93 | var-read-using-this | El contrato lee su propia variable usando this | Mejoramiento | Alto |
Para obtener 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 de puntoscontract-summary
: Imprime un resumen de los contratosloc
: Cuente 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 comentarios (CLOC) que se encuentran en los archivos fuente (SRC), dependencias (DEP) y archivos de prueba (TEST).call-graph
: exporta el call-graph de los contratos a un archivo de puntoscfg
: Exporta el CFG de cada función.function-summary
: imprime un resumen de las funcionesvars-and-auth
: Imprime las variables de estado escritas y la autorización de las funciones.not-pausable
: imprime funciones que no utilizan el modificador whenNotPaused
. Para ejecutar una impresora, use --print
y una lista de impresoras separadas por comas.
Consulte la documentación de la impresora para obtener las listas completas.
slither-check-upgradeability
: revisa la capacidad de actualización basada en delegatecall
slither-prop
: prueba unitaria automática y generación de propiedadesslither-flat
: aplana una base de códigoslither-check-erc
: comprueba la conformidad del ERCslither-format
: generación automática de parchesslither-read-storage
: leer valores de almacenamiento de contratosslither-interface
: genera una interfaz para un contratoConsulte la documentación de la herramienta para obtener herramientas adicionales.
Contáctenos para obtener ayuda sobre la creación de herramientas personalizadas.
La documentación sobre las partes internas de Slither está disponible aquí.
No dudes en visitar nuestro canal de Slack (#ethereum) para obtener ayuda sobre el uso o la ampliación de Slither.
La documentación de la impresora describe la información que Slither es capaz de visualizar para cada contrato.
La documentación de Detector describe cómo escribir nuevos análisis de vulnerabilidad.
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 de SlithIR.
¿Cómo excluyo simulacros o pruebas?
¿Cómo soluciono problemas de "archivo desconocido" o de compilación?
slither contract.sol
fallará. En su lugar, utilice slither .
en el directorio principal de contracts/
(deberías ver contracts/
cuando ejecutes ls
). Si tiene una carpeta node_modules/
, debe estar en el mismo directorio que contracts/
. Para verificar que este problema esté relacionado con el deslizamiento, ejecute el comando de compilación para el marco que está utilizando, por ejemplo, npx hardhat compile
. Eso debe funcionar con éxito; de lo contrario, el motor de compilación de slither, crytic-compile, no puede generar el AST. Slither tiene licencia y se distribuye bajo la licencia AGPLv3. Contáctenos si está buscando una excepción a los términos.
Título | Uso | Autores | Evento | Código |
---|---|---|---|---|
ReJection: un método de detección de vulnerabilidades de reentrada basado en AST | Análisis basado en AST construido sobre Slither | Rui Ma, Zefeng Jian, Guangyuan Chen, Ke Ma, Yujia Chen | CTCIS 19 | - |
MPro: combinación de análisis estático y simbólico para pruebas escalables de contratos inteligentes | Aproveche la dependencia de datos a través de Slither | William Zhang, Sebastián Banescu, Leodardo Pasos, Steven Stewart, Vijay Ganesh | ISSRE 2019 | mpro |
ETHPLOIT: Del fuzzing a la generación eficiente de exploits contra contratos inteligentes | Aproveche la dependencia de datos a través de Slither | Qingzhao Zhang, Yizhuo Wang, Juanru Li, Siqi Ma | MÁS cuerdo 20 | - |
Verificación de contratos inteligentes de Ethereum: un enfoque de verificación de modelos | 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 | Confíe en los detectores de vulnerabilidades de Slither | Xiao Liang Yu, Omar Al-Bataineh, David Lo, Abhik Roychoudhury | TOSEM 20 | SCReparación |
Desmitificando los bucles en los contratos inteligentes | Aproveche la dependencia de datos a través de Slither | Ben Mariano, Yanju Chen, Yu Feng, Shuvendu Lahiri, Isil Dillig | AS 20 | - |
Estimación dinámica de gas basada en trazas de bucles en contratos inteligentes | Utilice el CFG de Slither para detectar bucles | Chunmiao Li, Shijie Nie, Yang Cao, Yijun Yu, Zhenjiang Hu | IEEE Open J. Computación. Soc. 1 (2020) | - |
SAILFISH: Investigación de errores de inconsistencia de estado de contratos inteligentes en segundos | Confíe en SlithIR para crear un gráfico de dependencia de almacenamiento | Priyanka Bose, Dipanjan Das, Yanju Chen, Yu Feng, Christopher Kruegel y Giovanni Vigna | S&P 22 | Pez vela |
SolType: tipos de refinamiento para desbordamiento aritmético en solidez | Utilice Slither como interfaz para crear un sistema de tipos de refinamiento | Bryan Tan, Benjamín Mariano, Shuvendu K. Lahiri, Isil Dillig, Yu Feng | POPL 22 | - |
No me molestes: aprovechar las técnicas de aprendizaje automático para la detección automatizada de estafas | Utilice Slither para extraer las características de los tokens (mintables, pausables, etc.) | Mazorra, Bruno, Víctor Adán y Vanesa Daza. | Matemáticas 10.6 (2022) | - |
MANDO: incrustaciones de gráficos heterogéneos de varios niveles para la detección detallada de vulnerabilidades de contratos inteligentes | Utilice Slither para extraer el CFG y el gráfico de llamadas | Hoang Nguyen, Nhat-Minh Nguyen, Chunyao Xie, Zahra Ahmadi, Daniel Kudendo, Thanh-Nam Doan y Lingxiao Jiang | Novena Conferencia Internacional del IEEE sobre Ciencia de Datos y Análisis Avanzado (DSAA, 2022) | ge-sc |
Auditoría automatizada de vulnerabilidades TOD de aumento de precios en contratos inteligentes | Utilice Slither para extraer el CFG y las dependencias de datos | Sidi Mohamed Beillahi, Eric Keilty, Keerthi Nelaturu, Andreas Veneris y Fan Long | Conferencia internacional IEEE 2022 sobre Blockchain y Criptomonedas (ICBC) | Reparación de contratos inteligentes |
Modelado y aplicación de políticas de control de acceso para contratos inteligentes | Ampliar las dependencias de datos de Slither | Jan-Philipp Toberg, Jonas Schiffl, Frederik Reiche, Bernhard Beckert, Robert Heinrich, Ralf Reussner | Conferencia internacional IEEE sobre aplicaciones e infraestructuras descentralizadas (DAPPS), 2022 | SolidityAccessControlEnforcement |
Detección de vulnerabilidades de contratos inteligentes basada en aprendizaje profundo y fusión de decisiones multimodales | Usa Slither para extraer el CFG | Weichu Deng, Huanchun Wei, Teng Huang, Cong Cao, Yun Peng y Xuan Hu | Sensores 2023, 23, 7246 | - |
Gráfico de conocimiento de código enriquecido semánticamente para revelar incógnitas en la reutilización de código de contrato inteligente | Utilice 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 | Transacciones ACM sobre ingeniería y metodología de software, 2023 | - |
Ejecución paralela de contratos inteligentes con accesos estatales detallados | Utilice Slither para crear gráficos de acceso estatal | Xiaodong Qi, Jiao Jiao, Yi Li | Conferencia internacional sobre sistemas informáticos distribuidos (ICDCS), 2023 | - |
Manzanas podridas: comprensión de 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 | Conferencia web de ACM abril de 2023 | - |
Identificación de vulnerabilidades en contratos inteligentes mediante análisis de intervalos | Crea 4 detectores encima de Slither. | Ştefan-Claudiu Susan, Andrei Arusoaie | DESDE 2023 | - |
Análisis del estado de almacenamiento y extracción de contratos inteligentes de blockchain de Ethereum (sin PDF en acceso abierto) | Confíe en CFG y AST de Slither | Maha Ayub, Tania Saleem, Muhammad Janjua, Talha Ahmad | TOSEM 2023 | SmartMuv |
Si está utilizando Slither en un trabajo académico, considere postularse al Premio de Investigación Crytic de $10k.