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.
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.
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.
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.
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
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.
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.
16 me gusta
Recompensa
16
5
Republicar
Compartir
Comentar
0/400
ColdWalletGuardian
· 08-06 10:09
Aún se atreve a usar el viejo compilador, cerebrito.
Ver originalesResponder0
LayerZeroHero
· 08-06 02:28
El compilador tampoco es muy estable.
Ver originalesResponder0
RektRecorder
· 08-03 12:34
Tan peligroso, es absurdo familia
Ver originalesResponder0
BearMarketGardener
· 08-03 12:30
El compilador también tiene muchas vulnerabilidades, en el tiempo que duermes, los activos se desaparecen.
Ver originalesResponder0
SnapshotBot
· 08-03 12:27
El compilador ha vuelto a fallar. Se escapó, se escapó.
Análisis de vulnerabilidades del compilador Solidity: un riesgo en los contratos inteligentes que no se puede ignorar
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.
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.
Consejos de seguridad
Para desarrolladores:
Para el personal de seguridad:
Algunos recursos útiles:
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.