Pruebas y verificación formal para Web3 Smart Contract Security

Pruebas y verificación formal para Web3 Smart Contract Security

Testing and Formal Verification for Web3 Smart Contract Security PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Tiempo de lectura: 9 minutos

Imagina hacer paracaidismo. Antes de saltar del avión, comprobarás cien veces tu paracaídas, ¿verdad? La verificación y las pruebas son una parte integral de la seguridad; pensar en cualquier cosa relacionada con la seguridad. Es probable que haya un mecanismo de prueba posterior, ya sea la instalación de CCTV o la revisión de la tinta en el bolígrafo antes de un examen escrito en la escuela, todos seguimos las medidas de seguridad. Cuanto mayor es el riesgo involucrado, más probamos las cosas. Y cuando hablamos de contratos inteligentes, el riesgo es ENORME. No puede ser descuidado cuando se trata de seguridad de contratos inteligentes.

1. Siempre se necesita seguridad.

Seguro que puedes cerrar la puerta dos o tres veces, no importa. ¿Puedes estar seguro de que no pueden robar en tu casa mientras no estás? No puede porque no sabe qué podría hacer el ladrón para entrar en la casa; lo mismo ocurre con todas las medidas de seguridad que tomamos. No existe un método completamente seguro que garantice la seguridad. Aún así, la acción que tomamos rápidamente aumenta nuestras posibilidades de estar a salvo, que es de lo que se trata el juego. Queremos aumentar las probabilidades de estar seguros empleando diferentes medidas.

El mundo de Web3 no es diferente. No existe un método seguro para salvarse, pero tener auditores experimentados de QuillAudits puede aumentar enormemente las probabilidades de que su protocolo esté protegido y garantizará su seguridad actualizada. En web3, hay dos mecanismos importantes que lo ayudan a comprender qué tan seguro está al hacer algunas pruebas en su protocolo:

  1. Pruebas de contratos inteligentes
  2. Verificación formal de contratos inteligentes

Conozcámoslos en detalle y aprendamos cómo nos ayudan a conocer los puntos débiles o vulnerabilidades de nuestros contratos.

2. Pruebas de contratos inteligentes

Un desarrollador experimentado puede explicar el trabajo a una máquina con código. Aún así, a veces la máquina no representa el mecanismo exacto que el desarrollador tenía en mente debido a una falla o un error lógico en el código. La prueba es el proceso que ayuda a identificar dónde está fallando nuestro código y qué se puede hacer para que se corresponda con la acción que necesitamos que realice.

Pruebas de contratos inteligentes es una fase del ciclo de desarrollo en la que realizamos un análisis detallado de nuestros contratos e intentamos averiguar dónde y por qué falla nuestro código. Casi todos los contratos inteligentes pasan por esta fase. Hay dos formas en que se realizan las pruebas de contratos inteligentes. Explorémoslos.

2.1 automatizado

Como sugiere el nombre, este método para probar contratos inteligentes se utiliza para realizar pruebas con guiones. Se trata de un software automatizado que ejecuta pruebas repetidas para encontrar vulnerabilidades y defectos en los contratos inteligentes. Estas herramientas de prueba automatizadas se pueden configurar con datos de prueba y resultados esperados. Luego, el resultado real se compara con los esperados para verificar si el contrato funciona correctamente. Las pruebas automatizadas se pueden clasificar en tres categorías.

2.1.1. Pruebas funcionales

Suponga que escribe un programa para tomar dos números, a y b, y luego devuelve la suma de ambos números. Entonces, para verificar ese programa, le das 2 y 8 y alimentas el resultado esperado para que sea 10. Ahora, cuando el programa se ejecuta, también debería devolver 10. Si lo hace, entonces funciona bien y nuestro código es correcto, pero si no lo hace, entonces hay algún error con nuestro código. 

Las pruebas funcionales requieren comprender cómo debe comportarse su contrato en determinadas condiciones. Podemos probarlo ejecutando un cálculo con valores seleccionados y comparando la salida devuelta. Las pruebas funcionales tienen tres clases: -

  1. Prueba unitaria:- Se trata de probar la corrección de los componentes individuales del contrato inteligente. Es asertivo o requiere declaraciones sobre variables.
  1. moderna testing: – Se trata de probar varios componentes individuales juntos. La prueba de integración es un nivel más alto en la jerarquía que la prueba unitaria. Nos ayuda a determinar errores derivados de la interacción de diferentes funciones, que pueden formar parte de otros contratos inteligentes.
  1. System Textosng: – Este es el más alto en la jerarquía. En esto, probamos todo el contrato como un sistema completamente integrado para ver si funciona según nuestras necesidades. Se hace desde el punto de vista del usuario, y la mejor manera de hacerlo es desplegándolo en testnets.

2.1.2. Análisis estático

El análisis estático se puede realizar sin siquiera ejecutar el programa. Implica el análisis del código fuente o código de bytes del contrato inteligente antes de la ejecución. Así dando su nombre, el análisis estático puede resultar en la detección de algunas vulnerabilidades comunes.

2.1.3. Análisis dinámico

A diferencia del análisis estático, el análisis dinámico se lleva a cabo durante el tiempo de ejecución de los contratos inteligentes para identificar problemas en el código. Los analizadores de código dinámico observan el estado de ejecución del contrato y generan un informe detallado de vulnerabilidades y violaciones de propiedad. El fuzzing se incluye en el análisis DINÁMICO. Fuzzing está alimentando una entrada incorrecta o maliciosa para provocar la ejecución no deseada de código.

Manual de 2.2

Como sugiere el nombre, este método de prueba de contrato inteligente implica una interacción regular con un desarrollador humano. Las auditorías de código, en las que los desarrolladores pasan por líneas de códigos, se incluyen en el modo Manual de prueba de contrato inteligente.

El modo manual requiere mucho tiempo, habilidad, dinero y esfuerzo. Aún así, el resultado muchas veces vale la pena porque, con esto, identificamos vulnerabilidades que pueden pasar desapercibidas en las pruebas automáticas. Hay dos tipos esenciales de pruebas manuales: -

2.2.1 Auditorías de Código:- 

La mejor manera de probar si su medida de seguridad funciona correctamente es intentar romperla. Por ejemplo, si desea verificar si la cerradura de su automóvil funciona correctamente, intente romperla. Ahora puede pedir que un ladrón de autos hábil pueda entrar fácilmente en mi auto. Puede que no, así que la solución es contratar a alguien experto en allanamiento para que pueda guiarte.

 Sí, estoy hablando de QuillAudits. Somos un equipo de auditores calificados que pueden guiarlo. Las auditorías de código requieren una mentalidad de atacante para encontrar todas las posibles vulnerabilidades en el código fuente. Una auditoría de código es una evaluación detallada del código de un contrato inteligente para descubrir posibles vulnerabilidades y fallas.

2.2.2 Recompensa de errores: -

Si cree que puede haber algunas fallas de seguridad en su código fuente (que en su mayoría lo son) y no puede encontrarlas, puede subcontratar este trabajo a trabajadores independientes mediante la creación de un sistema de recompensas. Es más como anunciar una recompensa para cualquiera que pueda piratear su contrato inteligente. Al hacer esto, aprende sobre la vulnerabilidad presente en su contrato inteligente para que pueda protegerlo mejor y evitar pérdidas a sus usuarios.

3. Verificación formal de contratos inteligentes

La verificación formal es el proceso de evaluar la corrección de un contrato basado en especificaciones formales. Esto significa que la verificación formal evalúa si el código hace lo que se pretende. La verificación formal utiliza métodos formales para especificar, diseñar y verificar programas.

3.1 ¿Qué es la especificación formal?

En el contexto de los contratos inteligentes, las especificaciones formales se refieren a las propiedades que deben permanecer iguales en todas las circunstancias posibles. Estas son propiedades "invariantes" porque no pueden cambiar y representan afirmaciones lógicas sobre la ejecución del contrato.

La especificación formal es una colección de declaraciones escritas en lenguaje formal. Las especificaciones cubren diferentes propiedades y describen cómo deben comportarse las propiedades del contrato en otras circunstancias. Las especificaciones formales son críticas porque si los contratos no tienen variables invariables o si las propiedades cambian durante la ejecución, puede conducir a una posible explotación de la propiedad, lo que puede generar una gran pérdida.

Puede ayudarnos a determinar si un contrato inteligente cumple con las especificaciones o tiene comportamientos inesperados. La verificación formal tiene tres componentes: una especificación, un modelo y un motor de verificación.

3.1.1 Especificación

Una especificación es una descripción clara, inequívoca y completa de los requisitos para un contrato inteligente. Debe describir lo que se supone que debe hacer el contrato y lo que no debe hacer. Aquí hay una especificación de ejemplo para un contrato inteligente simple que agrega dos números:

// Specification: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public view returns (uint) {
// Implementation details are not relevant to the specification
// …
}

3.1.2 Modelo

Un modelo representa formalmente el contrato inteligente que se puede utilizar para razonar sobre su comportamiento. Un modelo popular para contratos inteligentes es el lenguaje de programación Solidity. Aquí hay un modelo de ejemplo para la función de agregar descrita anteriormente:

// Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public view returns (uint) {
return a + b;
}

3.1.3 Motor de verificación

Un motor de verificación es una herramienta que puede analizar un modelo y verificar su corrección con respecto a una especificación dada. Hay varios motores de verificación disponibles para contratos inteligentes, que incluyen:

mitrilo: una herramienta de ejecución simbólica de código abierto que puede detectar una amplia gama de vulnerabilidades de seguridad en los contratos inteligentes de Solidity.

IDE de remezcla: un entorno de desarrollo integrado que incluye una herramienta de verificación formal que puede verificar la corrección de los contratos inteligentes.

Probador de Certora: una herramienta comercial que puede verificar la exactitud de los contratos inteligentes utilizando razonamiento matemático automatizado. Aquí hay un ejemplo de cómo se puede usar la verificación formal para verificar la corrección de un contrato inteligente usando Certora Prover:

pragma solidity 0.7.6; // Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint)
function add(uint a, uint b) public pure returns (uint) {
return a + b;
} // Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public pure returns (uint) {
return a + b;
} // Specification: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function test_add(uint a, uint b) public pure returns (bool) {
uint expected = a + b;
uint actual = add(a, b);
return expected == actual;
} // Verification: Verify the correctness of the add function contract TestAdd {
function test_add(uint a, uint b) public view returns (bool) {
return CertoraProver.verify(test_add, a, b);
}
}

En el ejemplo anterior, definimos un contrato inteligente de Solidity que incluye un modelo de la función de agregar, una especificación para la función y un motor de verificación (Certora Prover) que puede verificar la corrección de la función. También definimos una función de prueba (test_add) que se puede usar para verificar la corrección de la función.

3.2 Prueba VS Verificación formal

Como comentamos, la prueba devuelve el resultado esperado para algunos bots de datos de entrada que le faltan porque no podemos decir acerca de los datos en los que no se ha probado. Es prácticamente imposible verificarlo en cada entrada posible. Por lo tanto, no estamos seguros de su "corrección funcional". Ahí es donde entra la verificación formal. Los métodos de verificación formal utilizan técnicas matemáticas rigurosas para especificar y verificar software o contratos inteligentes.

3.3 Técnicas de verificación formal

La verificación formal tiene una amplia gama de técnicas para mejorar seguridad de contrato inteligente. En esta parte del blog, exploraremos algunos individualmente.

3.3.1 Verificación del modelo

Como discutimos qué es una especificación formal, verificamos el contrato inteligente con su especificación en esta técnica de verificación formal. Estos contratos inteligentes se representan como sistemas de transición de estado y las propiedades se definen mediante una lógica temporal. 

Esta técnica se utiliza principalmente para evaluar las propiedades temporales que representan el comportamiento de los contratos inteligentes a lo largo del tiempo. Propiedad de control de acceso (llamadas de administrador auto destrucción) se puede escribir como lógica formal. Luego, el algoritmo de verificación del modelo puede verificar si el contrato cumple con esta verificación formal.

La verificación de modelos utiliza una técnica llamada exploración del espacio de estado, que consiste básicamente en probar todos los estados posibles en los que puede estar nuestro contrato inteligente y luego verificar si alguno de ellos resulta en una violación de la propiedad. Sin embargo, esto puede conducir a un número infinito de estados; por lo tanto, los verificadores de modelos se basan en técnicas de abstracción para hacer posible un análisis eficiente de los contratos inteligentes.

3.3.2 Demostración de teoremas

La demostración de teoremas se trata del razonamiento matemático sobre la corrección de los programas. Se trata de crear una impresión lógica del sistema y especificación del contrato y de verificar la “equivalencia lógica” entre las declaraciones. La equivalencia lógica es una relación matemática que dice que el enunciado A es verdadero si y solo si el enunciado B es verdadero.

Como aprendimos en la técnica de verificación de modelos, modelamos los contratos como sistemas de transición con estados finitos. La demostración de teoremas puede manejar el análisis de sistemas de estado infinito. Sin embargo, un probador de teoremas automatizado no siempre puede saber si un problema lógico es decidible; por lo tanto, a menudo se requiere la asistencia humana para guiar al probador de teoremas en la obtención de pruebas de corrección.

4. Conclusión

Las pruebas y la verificación formal son partes integrales del desarrollo de contratos inteligentes. Estos son los métodos utilizados para hacer que los contratos inteligentes sean seguros y ayudar a preparar los contratos para su implementación. Pero como sabes, la seguridad nunca es suficiente. Muchos contratos inteligentes fueron pirateados solo porque no se realizaron las pruebas adecuadas. Ahora más que nunca la comunidad web3 necesita protocolos más seguros. 

En QuillAudits tenemos la misión de ayudar a proteger sus protocolos. Con nuestro equipo hábil y experimentado, nos aseguramos de que ni una sola vulnerabilidad pase desapercibida. ¡Visite nuestro sitio web y asegure su proyecto Web3!

28 Vistas

Sello de tiempo:

Mas de hachís