
EVMLISA es un analizador estático basado en la interpretación abstracta para EVM Bytecode of Smart Contracts implementados en Ethereum Blockchain y construido sobre LISA. Dado un contrato Smart ByTecode EVM, Evmlisa construye un gráfico de flujo de control sólido y preciso del contrato inteligente.
Evmlisa se basa en la publicación revisada por pares
Vincenzo Arceri, Saverio Mattia Merenda, Greta Dolcetti, Luca Negrini, Luca Olivieri, Enea Zaffanella. "Hacia una construcción de sonido de los gráficos de flujo de control Bytecode EVM" . En Actas del 26º Taller Internacional de ACM sobre técnicas formales para programas similares a Java (FTFJP 2024), ubicado en Ecoop 2024.
Compilar Evmlisa requiere:
Necesitas:
git clone https://github.com/lisa-analyzer/evm-lisa.git
cd evm-lisaAntes de ejecutar EVMLISA, asegúrese de haber configurado una variable de entorno con su clave API Esterscan. Siga los pasos a continuación para configurar la variable de entorno:
.env en el proyecto Evmlisa..env , agregue la siguiente línea: ETHERSCAN_API_KEY=<your_etherscan_api_key>
<your_etherscan_api_key> con su tecla API Esterscan.Aquí puede encontrar cómo generar una clave API de Esterscan.
Una vez que haya configurado la variable de entorno, puede ejecutar Evmlisa a través de Docker o a través de Bash.
Construya el contenedor:
mkdir -p execution/docker &&
docker build -t evm-lisa:latest .
Entonces puedes ejecutar Evmlisa con:
docker run --rm -it
-v $(pwd)/.env:/app/.env
-v $(pwd)/execution/docker:/app/execution/results
evm-lisa:latest
-a <smart_contract_address> [options]
-v $(pwd)/.env:/app/.env : monte el archivo .env .-v $(pwd)/execution/docker:/app/execution/results : comparte la carpeta de resultados '.Reemplace
<smart_contract_address>con la dirección del contrato Smart Ethereum que desea analizar.
Construye el proyecto:
./gradlew buildCrear distribución zip:
./gradlew distZipDescomprima la distribución:
unzip build/distributions/evm-lisa.zip -d executionEntonces puedes ejecutar Evmlisa con:
./execution/evm-lisa/bin/evm-lisa
-a < smart_contract_address > [options]Reemplace
<smart_contract_address>con la dirección del contrato Smart Ethereum que desea analizar.
Este comando iniciará el proceso de análisis para el contrato inteligente especificado, proporcionando información y resultados basados en el código de bytes EVM del contrato.
Options:
-a,--address <arg> address of an Ethereum smart contract
-b,--benchmark <arg> filepath of the benchmark suite (i.e., a list of smart contract addresses)
-C,--cores <arg> number of cores to use
-c,--dump-cfg dump the CFG
-d,--dump-analysis <arg> dump the analysis (html, dot)
-D,--download-bytecode download the bytecode, without analyzing it
-f,--filepath <arg> filepath of an EVM bytecode smart contract
-o,--output <arg> output directory path
-q,--stack-size <arg> maximal height of stack
-s,--dump-stats dump statistics
-S,--use-live-storage use the live storage in SLOAD
-w,--stack-set-size <arg> maximal size of stack sets
En el análisis de los programas ByTecode EVM, EVMLISA emplea un dominio de conjuntos de pilas abstractas para mejorar la precisión, particularmente cuando se encuentran bucles en el código fuente.
Evmlisa presenta el dominio de PowerSet de pila abstracta
Aquí hay un ejemplo de cómo ejecutar Evmlisa. En este ejemplo, analizaremos un contrato inteligente en la dirección 0x7c21C4Bbd63D05Fa9F788e38d14e18FC52E9557B con opciones específicas para el tamaño de la pila, el tamaño del conjunto de pilas, el uso de almacenamiento en vivo y el volcado del CFG:
./execution/evm-lisa/bin/evm-lisa
-a 0x7c21C4Bbd63D05Fa9F788e38d14e18FC52E9557B
--stack-size 64
--stack-set-size 10
--dump-stats
--use-live-storagedocker run --rm -it
-v $( pwd ) /.env:/app/.env
-v $( pwd ) /execution/docker:/app/execution/results
evm-lisa:latest
-a 0x7c21C4Bbd63D05Fa9F788e38d14e18FC52E9557B
--stack-size 64
--stack-set-size 10
--dump-stats
--use-live-storageUse
docker run -a stderrpara descargar solo el informe JSON como salida estándar.
La salida esperada es la siguiente:
# #############
Total opcodes : 344
Total jumps : 45
Resolved jumps : 44
Definitely unreachable jumps : 1
Maybe unreachable jumps : 0
Unsound jumps : 0
Maybe unsound jumps : 0
# #############