
Securify 2.0 es un escáner de seguridad para los contratos inteligentes de Ethereum respaldados por la Fundación Ethereum y la seguridad de las Chains. La investigación central detrás de Surify se realizó en el laboratorio de sistemas seguro, confiable e inteligente en ETH Zurich.
Es el sucesor del popular escáner Secury Security (puede encontrar la versión anterior aquí).
Para construir el contenedor:
sudo docker build -t securify .
Para ejecutar el contenedor:
sudo docker run -it -v <contract-dir-full-path>:/share securify /share/<contract>.sol
Nota: Para ejecutar el código a través de Docker con una versión de solidez que sea diferente a 0.5.12 , deberá modificar la variable ARG SOLC=0.5.12 en la parte superior del Dockerfile para señalar su versión. Después de construir con la versión correcta, no debe encontrar errores.
Las siguientes instrucciones suponen que una pitón ya está instalada. Además de eso, Surify requiere que se instalen solc , souffle y graphviz en el sistema:
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
Siga las instrucciones aquí: https://souffle-lang.github.io/download.html
No opte por la versión inestable, ya que podría romperse en cualquier momento.
sudo apt install graphviz
Después de que se hayan instalado los requisitos previos, podemos configurar el entorno virtual de Python desde el cual ejecutaremos los scripts en este proyecto.
En la carpeta raíz del proyecto, ejecute los siguientes comandos para configurar y activar el entorno virtual:
virtualenv --python=/usr/bin/python3.7 venv
source venv/bin/activate
Verifique que la versión python sea en realidad 3.7 :
python --version
Establecer LD_LIBRARY_PATH :
cd <securify_root>/securify/staticanalysis/libfunctors
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`
Finalmente, instale las dependencias del proyecto ejecutando los siguientes comandos desde la carpeta <securify_root> :
pip install --upgrade pip
pip install -r requirements.txt
pip install -e .
Ahora está listo para comenzar a usar el marco de Surify.
Recuerde: antes de ejecutar los scripts del marco, deberá activar el entorno virtual con el siguiente comando:
source venv/bin/activate
Actualmente, Securify2 admite solo contratos planos, es decir, contratos que no contienen declaraciones de importación.
Para analizar un contrato local simplemente se ejecute:
securify <contract_source>.sol [--use-patterns Pattern1 Pattern2 ...]
O descargarlo desde blockchain usando la API Etherscan.io:
securify <contract_address> --from-blockchain [--key <key-file>]
Observe que necesita un API-Key de Etherscan.io para usar esta funcionalidad.
Para analizar un contrato contra los niveles de gravedad específicos que se ejecutan:
securify <contract_source>.sol [--include-severity Severity1 Severity2]
securify <contract_source>.sol [--exclude-severity Severity1 Severity2]
Para que se ejecute todos los patrones disponibles:
securify --list
| IDENTIFICACIÓN | Nombre del patrón | Gravedad | Slither ID | ID de SWC | Comentario |
|---|---|---|---|---|---|
| 1 | Montañismo | Crítico | - | SWC-114 | |
| 2 | Tedrocante | Crítico | - | SWC-114 | |
| 3 | Toda | Crítico | - | SWC-114 | |
| 4 | Escribir sin restricciones | Crítico | - | SWC-124 | |
| 5 | Righttoleftoverride | Alto | rtlo | SWC-130 | |
| 6 | Shadowedstatevariable | Alto | shadowing-state , shadowing-abstract | SWC-119 | |
| 7 | Sin restricciones | Alto | suicidal | SWC-106 | |
| 8 | No inicializado | Alto | uninitialized-state | SWC-109 | |
| 9 | Estora no inicializada | Alto | uninitialized-storage | SWC-109 | |
| 10 | Sin restricciones | Alto | controlled-delegatecall | SWC-112 | |
| 11 | Dao | Alto | reentrancy-eth | SWC-107 | |
| 12 | ERC20Interface | Medio | erc20-interface | - | |
| 13 | ERC721Interface | Medio | erc721-interface | - | |
| 14 | Incorrectualidad | Medio | incorrect-equality | SWC-132 | |
| 15 | Encerrado | Medio | locked-ether | - | |
| 16 | Reentrarnoets | Medio | reentrancy-no-eth | SWC-107 | |
| 17 | Txorigin | Medio | tx-origin | SWC-115 | |
| 18 | Excepción no controladora | Medio | unchecked-lowlevel | - | |
| 19 | Flujo sin restricciones | Medio | unchecked-send | SWC-105 | |
| 20 | No inicializado local | Medio | uninitialized-local | SWC-109 | |
| 21 | No usado | Medio | unused-return | SWC-104 | |
| 22 | Shadowedbuiltin | Bajo | shadowing-builtin | - | |
| 23 | Shadowedlocalvariable | Bajo | shadowing-local | - | |
| 24 | CallToDeFaultConstructor? | Bajo | void-cst | - | |
| 25 | Callinloop | Bajo | calls-loop | SWC-104 | |
| 26 | Reentrancybenign | Bajo | reentrancy-benign | SWC-107 | |
| 27 | Marca de tiempo | Bajo | timestamp | SWC-116 | |
| 28 | Asamblea | Información | assembly | - | |
| 29 | ERC20Indexed | Información | erc20-indexed | - | |
| 30 | Bajas | Información | low-level-calls | - | |
| 31 | Naming -contrvention | Información | naming-convention | - | |
| 32 | Solcversión | Información | solc-version | SWC-103 | |
| 33 | No utilizado | Información | unused-state | - | |
| 34 | Toomanydigits | Información | too-many-digits | - | |
| 35 | EstreBestates | Información | constable-states | - | |
| 36 | Funciones externas | Información | external-function | - | |
| 37 | Estado Variables Defaultvisibility | Información | - | SWC-108 |
Surify no verifica los siguientes patrones de deslizamiento, ya que el compilador de solidez verifica los verificados (ver. 0.5.8):
constant-functiondeprecated-standardspragmaLas siguientes vulnerabilidades de SWC no se aplican a los contratos de solidez con pragma> = 5.8 y, por lo tanto, no se verifican por Surify: