Análisis de vulnerabilidades del compilador Solidity: un riesgo en los contratos inteligentes que no se puede ignorar

robot
Generación de resúmenes en curso

Análisis de vulnerabilidades del compilador Solidity y medidas 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. Aunque los desarrolladores y el personal de seguridad suelen centrarse en la seguridad del código de las aplicaciones, el propio compilador, como programa informático, también puede presentar vulnerabilidades de seguridad, lo que en ciertos casos puede conllevar riesgos de seguridad graves.

Por ejemplo, cuando un navegador compila y ejecuta código JavaScript, puede dar lugar a la ejecución remota de código debido a vulnerabilidades en el motor de análisis, lo que permite a un atacante obtener el control del navegador de la víctima e incluso del sistema operativo. También hay investigaciones que indican que los errores en los compiladores de C++ también pueden provocar la ejecución remota de código y otras consecuencias graves.

El compilador de Solidity también presenta vulnerabilidades de seguridad. Según la alerta de seguridad del equipo de desarrollo, se han encontrado problemas de seguridad en varias versiones del compilador de Solidity.

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

El propósito del compilador de Solidity es transformar el código del contrato inteligente en código de instrucciones de la máquina virtual de Ethereum (EVM). Es necesario distinguir entre las vulnerabilidades del compilador de Solidity y las vulnerabilidades de la propia EVM. Las vulnerabilidades de la EVM se refieren a problemas de seguridad durante la ejecución de instrucciones de 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 surgen al convertir Solidity en código EVM, lo que no afecta directamente a la red de Ethereum, pero puede llevar a que el código EVM generado no sea coherente con lo que el desarrollador esperaba.

Debido a que los contratos inteligentes suelen involucrar activos de criptomonedas de los usuarios, cualquier error causado por el compilador puede tener graves consecuencias. Solo a través de la auditoría del código fuente del contrato, es difícil detectar vulnerabilidades del compilador, se necesita analizar en combinación con versiones específicas y patrones de código.

A continuación, se presentan varios casos reales que muestran las formas, causas y peligros específicos de las vulnerabilidades del compilador de Solidity.

SOL-2016-9 HighOrderByteCleanStorage

La vulnerabilidad existe en versiones anteriores del compilador Solidity (>=0.1.6 <0.4.4).

Considera el siguiente código:

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

La variable b no ha sido modificada, la función run() debería devolver el valor predeterminado 0. Sin embargo, en el código generado por la versión vulnerable del compilador, run() devolverá 1.

Esto se debe a que EVM utiliza elementos de pila de 32 bytes de tamaño, mientras que Solidity admite tipos de menos de 32 bytes como uint32. El compilador necesita realizar una operación de limpieza en los bits altos para garantizar la corrección de los datos. En el caso de un desbordamiento en la suma, el compilador no limpió correctamente los bits altos, lo que provocó que el bit desbordado de 1 se escribiera en el almacenamiento, sobrescribiendo la variable b.

SOL-2022-4 EfectosSecundariosEnMemoriaInlineAssembly

La vulnerabilidad existe en los compiladores de versiones >=0.8.13 <0.8.15.

Considera el siguiente código:

solidez contrato C { función f() pública pura devuelve (uint) { ensamblaje { mstore(0, 0x42) } uint x; ensamblaje { x := mload(0) } return x; } }

El compilador, durante el proceso de optimización, analiza el flujo de control y el flujo de datos para reducir el tamaño del código y optimizar el consumo de gas. Sin embargo, esta optimización puede fácilmente provocar errores.

En este ejemplo, el compilador incorrectamente considera que la escritura en la memoria 0 en el primer bloque de ensamblaje es redundante, la elimina, lo que provoca que la función f() devuelva 0 en lugar del correcto 0x42.

SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup

La vulnerabilidad afecta a compiladores de versiones >= 0.5.8 < 0.8.16.

Considera el siguiente código:

solidez contrato C { función f(string[1] calldata a) pública pura devuelve (string memory) { return abi.decode(abi.encode(a), (string[1]))[0]; } }

Normalmente, este código debería devolver el valor de la variable a "aaaa". Pero en la versión con vulnerabilidad, devolverá una cadena vacía "".

Esto se debe a que Solidity limpia incorrectamente ciertos datos al realizar la operación abi.encode en arreglos de tipo calldata, lo que provoca la modificación de datos adyacentes y causa inconsistencias en los datos después de la codificación y decodificación.

Es importante señalar que durante las llamadas externas y al emitir eventos se realiza implícitamente abi.encode, por lo que la probabilidad de que ocurra esta vulnerabilidad es bastante alta.

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

Consejos de seguridad

Para desarrolladores:

  • Utilizar una versión más reciente del compilador de Solidity, generalmente tiene menos problemas de seguridad conocidos.
  • Mejorar los casos de prueba unitarios, aumentar la cobertura del código, ayuda a descubrir problemas causados por el compilador.
  • Evitar el uso de ensamblaje en línea, operaciones complejas de codificación y decodificación de ABI, y no utilizar ciegamente nuevas características y funciones experimentales.

Para el personal de seguridad:

  • No subestime los riesgos que el compilador podría introducir durante la auditoría, correspondiente al ítem de verificación SWC-102.
  • En el proceso SDL, impulsar la actualización de la versión del compilador, considerar la introducción de una verificación automática.
  • Evaluar el impacto real de las vulnerabilidades del compilador, sin entrar en pánico excesivo.

Algunos recursos útiles:

  • Blog de alertas de seguridad oficial de Solidity
  • Lista de errores en el repositorio de Solidity
  • Lista de errores del compilador de cada versión
  • Advertencia de vulnerabilidad del compilador en la página del contrato de Etherscan

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

En resumen, las vulnerabilidades del compilador de Solidity pueden llevar a que el comportamiento real de los contratos inteligentes no coincida con lo esperado. Tanto los desarrolladores como el personal de seguridad deben estar alerta y tomar las medidas adecuadas para reducir los riesgos.

ETH-2.99%
SOL-4.3%
Ver originales
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
  • Recompensa
  • 5
  • Republicar
  • Compartir
Comentar
0/400
ColdWalletGuardianvip
· 08-06 10:09
Aún se atreve a usar el viejo compilador, cerebrito.
Ver originalesResponder0
LayerZeroHerovip
· 08-06 02:28
El compilador tampoco es muy estable.
Ver originalesResponder0
RektRecordervip
· 08-03 12:34
Tan peligroso, es absurdo familia
Ver originalesResponder0
BearMarketGardenervip
· 08-03 12:30
El compilador también tiene muchas vulnerabilidades, en el tiempo que duermes, los activos se desaparecen.
Ver originalesResponder0
SnapshotBotvip
· 08-03 12:27
El compilador ha vuelto a fallar. Se escapó, se escapó.
Ver originalesResponder0
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)