Análisis de vulnerabilidades del compilador Solidity y estrategias prácticas para proteger la seguridad de los contratos inteligentes

Análisis de vulnerabilidades del compilador Solidity y estrategias de respuesta

El compilador es uno de los componentes básicos de los sistemas informáticos modernos, y su función es convertir el código fuente de lenguajes de programación de alto nivel en código de instrucciones ejecutables por la computadora. La mayoría de los desarrolladores y personal de seguridad generalmente se centran en la seguridad del código de la aplicación, pero a menudo pasan por alto la seguridad del propio compilador. De hecho, el compilador, como un programa informático, también puede tener vulnerabilidades de seguridad que pueden presentar riesgos de seguridad graves en ciertos escenarios.

Por ejemplo, al compilar y ejecutar código JavaScript, el navegador puede ser vulnerable a ataques que aprovechan fallos en el motor de JavaScript, lo que permite a los atacantes ejecutar código de forma remota cuando el usuario accede a una página web maliciosa, y finalmente controlar el navegador o incluso el sistema operativo de la víctima. Otro estudio también ha demostrado que los errores en los compiladores de C++ pueden resultar en graves consecuencias, como la ejecución remota de código.

El compilador de Solidity también presenta vulnerabilidades de seguridad. Según la alerta de seguridad del equipo de desarrollo de Solidity, hay vulnerabilidades de seguridad en varias versiones del compilador de Solidity. La función del compilador de Solidity es convertir el código de los contratos inteligentes en código de instrucción (EVM) para la máquina virtual de Ethereum, el cual finalmente se subirá a Ethereum y será ejecutado por el EVM.

Es necesario distinguir entre las vulnerabilidades del compilador de Solidity y las vulnerabilidades del propio EVM. Las vulnerabilidades del EVM se refieren a problemas de seguridad que surgen al ejecutar instrucciones en la máquina virtual, lo que puede afectar a toda la red de Ethereum. Por otro lado, las vulnerabilidades del compilador de Solidity se refieren a problemas que ocurren al convertir Solidity en código EVM, que no afectan directamente a la red de Ethereum, pero pueden llevar a que el código EVM generado no coincida con las expectativas del desarrollador.

Una de las amenazas de las vulnerabilidades del compilador de Solidity es que puede llevar a que el código EVM generado no coincida con las expectativas del desarrollador de contratos inteligentes. Dado que los contratos inteligentes suelen involucrar los activos de criptomonedas de los usuarios, cualquier error causado por el compilador podría resultar en la pérdida de activos de los usuarios, generando consecuencias graves.

Los desarrolladores y auditores a menudo se centran en la lógica del contrato y los problemas de seguridad comunes, mientras que las vulnerabilidades del compilador son difíciles de detectar a través de auditorías de código. Es necesario analizar conjuntamente la versión específica del compilador y los patrones de código para determinar si el contrato inteligente se ve afectado por vulnerabilidades del compilador.

Análisis de vulnerabilidades del compilador Solidity y medidas de respuesta

A continuación se presentan algunos ejemplos reales de vulnerabilidades en compiladores de Solidity:

  1. SOL-2016-9 HighOrderByteCleanStorage

La vulnerabilidad existe en versiones anteriores del compilador de Solidity (>=0.1.6 <0.4.4). Considere el siguiente código:

solidez contrato C { uint32 a = 0x12345678; uint32 b = 0; función f() pública { a = a + 1; } función run() público vista devuelve (uint32) { return b; } }

Teóricamente, la variable b no ha sido modificada, la función run() debería devolver 0. Sin embargo, en el código generado por el compilador de la versión con vulnerabilidad, run() devolverá 1. Esto se debe a que EVM utiliza elementos de pila de tamaño de 32 bytes, mientras que Solidity admite tipos de datos más pequeños como uint32. Al procesar, el compilador necesita limpiar los bits altos ( clean up ), pero no los maneja correctamente en caso de desbordamiento de suma, lo que provoca que un 1 en los bits altos se escriba en la variable b.

  1. SOL-2022-4 Efectos Secundarios de Memoria en Inline Assembly

La vulnerabilidad existe en las versiones del compilador de 0.8.13 a 0.8.15. Considere el siguiente código:

solidez contrato C { function f() public pure returns (uint) { ensamblaje { mstore(0, 0x42) } uint x; ensamblaje { x := mload(0) } return x; } }

El compilador elimina las operaciones de escritura en memoria que parecen inútiles para optimizar, pero erróneamente también elimina el acceso a la memoria que cruza bloques de ensamblaje. Esto provoca que la función f() devuelva 0 en lugar del correcto 0x42.

  1. SOL-2022-6 DesbordamientoDeCabezaAbiReencodingConLimpiezaDeArregloEstático

La vulnerabilidad afecta a las versiones del compilador de 0.5.8 a 0.8.16. Considere el siguiente código:

solidez contrato C { función f(string[1] calldata a) externo puro devuelve (string memoria) { return abi.decode(abi.encode(a), (string[1]))[0]; } }

En condiciones normales, esta función debería devolver la cadena de entrada. Pero en la versión con vulnerabilidad, devolverá una cadena vacía. Esto se debe a que el compilador, al codificar de manera ABI el array calldata, limpió incorrectamente ciertos datos, lo que provocó una inconsistencia en los datos después de la codificación y decodificación.

Análisis de vulnerabilidades del compilador Solidity y medidas de respuesta

En respuesta a las vulnerabilidades del compilador Solidity, el equipo de seguridad blockchain de Cobo propone las siguientes recomendaciones:

Para los desarrolladores:

  1. Utiliza una versión más reciente del compilador de Solidity, ya que generalmente hay menos problemas de seguridad conocidos.

  2. Mejorar los casos de prueba unitarios. La mayoría de los errores a nivel de compilador provocan que los resultados de la ejecución del código no coincidan con las expectativas; al aumentar la cobertura de las pruebas se pueden evitar este tipo de problemas.

  3. Evite el uso de ensamblaje en línea, operaciones complejas de codificación y decodificación de ABI, y no use ciegamente nuevas características y funciones experimentales. La mayoría de las vulnerabilidades de los compiladores están relacionadas con estas operaciones complejas.

Para el personal de seguridad:

  1. No ignore los riesgos de seguridad que pueden introducir los compiladores durante la auditoría. El ítem de verificación relacionado es SWC-102: Versión de compilador obsoleta.

  2. En el proceso de desarrollo, instar al equipo de desarrollo a actualizar la versión del compilador, se puede introducir una verificación automática de la versión en CI/CD.

  3. No es necesario preocuparse demasiado por las vulnerabilidades del compilador. La mayoría de las vulnerabilidades solo se activan en patrones de código específicos, por lo que es necesario evaluar el impacto en la seguridad según el proyecto específico.

Algunos recursos prácticos:

  • Alerta de seguridad oficial de Solidity:
  • Lista de errores oficial de Solidity:
  • Lista de errores del compilador de las distintas versiones:
  • El símbolo de advertencia en la esquina superior derecha de la página del contrato de Etherscan puede indicar vulnerabilidades de seguridad en la versión actual del compilador.

Análisis de vulnerabilidades del compilador Solidity y medidas de respuesta

En resumen, los desarrolladores y el personal de seguridad deben prestar atención a los riesgos de seguridad que pueden surgir de las vulnerabilidades del compilador de Solidity, tomar las medidas adecuadas para mitigar los riesgos y garantizar la seguridad de los contratos inteligentes.

Ver originales
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
  • Recompensa
  • 6
  • Compartir
Comentar
0/400
MetaverseLandlordvip
· 07-12 19:10
El compilador tiene un gran problema
Ver originalesResponder0
NFTHoardervip
· 07-12 03:00
El compilador también puede tener errores.
Ver originalesResponder0
0xOverleveragedvip
· 07-10 21:09
El compilador es el antepasado.
Ver originalesResponder0
TestnetNomadvip
· 07-10 21:08
La clase pequeña de compiladores es genial.
Ver originalesResponder0
ParallelChainMaxivip
· 07-10 21:06
La seguridad del compilador no debe pasarse por alto.
Ver originalesResponder0
DegenApeSurfervip
· 07-10 20:55
La seguridad de los contratos no es simple.
Ver originalesResponder0
  • Anclado
Opere con criptomonedas en cualquier momento y lugar
qrCode
Escanee para descargar la aplicación Gate
Comunidad
Español
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)