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, responsable de convertir lenguajes de programación de alto nivel en instrucciones ejecutables de bajo nivel. Aunque los desarrolladores suelen centrarse en la seguridad del código de la aplicación, la seguridad del propio compilador también es importante. Las vulnerabilidades del compilador pueden, en ciertos casos, causar graves riesgos de seguridad, como las vulnerabilidades del motor JavaScript del navegador que pueden llevar a la ejecución remota de código.
El compilador de Solidity no es una excepción, existen múltiples versiones con vulnerabilidades de seguridad. A diferencia de las vulnerabilidades en la EVM, las vulnerabilidades en el compilador de Solidity solo afectan a los desarrolladores de contratos y no ponen en peligro directamente la seguridad de la red de Ethereum. Sin embargo, puede llevar a que el código EVM generado no coincida con las expectativas del desarrollador, lo que puede provocar vulnerabilidades en los contratos inteligentes y poner en riesgo la seguridad de los activos de los usuarios.
A continuación se presentan algunos ejemplos reales de vulnerabilidades del compilador Solidity:
Esta vulnerabilidad podría provocar que la variable de almacenamiento se modifique accidentalmente. Por ejemplo:
solidez
contrato C {
uint32 a = 0x1234;
uint32 b = 0;
function run() returns (uint) {
a += 1;
return b;
}
}
la función run() debería devolver 0, pero en realidad devuelve 1. Esto se debe a que el compilador no limpió correctamente los bits altos al manejar el desbordamiento de enteros, lo que provocó que los bits de desbordamiento se escribieran en una variable adyacente.
La vulnerabilidad se origina en el proceso de optimización de la compilación. Por ejemplo:
solidez
contrato C {
function f() public pure returns (uint) {
ensamblaje {
mstore(0, 0x42)
}
uint x;
ensamblaje {
x := mload(0)
}
return x;
}
}
f() La función debería devolver 0x42, pero la versión con vulnerabilidad devolverá 0. Esto se debe a que el compilador eliminó incorrectamente la operación de escritura en memoria en el primer bloque de assembly.
SOL-2022-6 Desbordamiento de Encabezado AbiReencodingConLimpiezaDeArregloEstático
Versión afectada: >= 0.5.8 < 0.8.16
Esta vulnerabilidad involucra la codificación ABI del array calldata. Por ejemplo:
solidez
contrato C {
función f(bytes[1] calldata a) pública pura devuelve (bytes memoria) {
return abi.encode(a);
}
}
f() La función debería devolver el array de entrada, pero la versión con vulnerabilidad devuelve una cadena vacía. Esto se debe a que el compilador limpió incorrectamente los datos adyacentes durante el proceso de codificación.
Para reducir el riesgo de vulnerabilidades en el compilador de Solidity, los desarrolladores deben:
Utilizar una versión más reciente del compilador
Mejorar las pruebas unitarias, aumentar la cobertura del código
Evitar el uso de características de lenguaje complejas, como ensamblaje en línea, codificación ABI de arreglos multidimensionales, etc.
Los auditores de seguridad deben:
Considerar los riesgos potenciales del compilador durante el proceso de auditoría
Se sugiere al equipo de desarrollo que actualice a la versión más reciente del compilador.
Incluir la verificación automática de la versión del compilador en el flujo de CI/CD
Recursos de referencia útiles:
Blog oficial de advertencias de seguridad de Solidity
Lista de errores del repositorio de Solidity en GitHub
Advertencia de vulnerabilidad del compilador en la página de contratos de Etherscan
En resumen, aunque las vulnerabilidades del compilador no son comunes, su impacto puede ser grave. Los desarrolladores y el personal de seguridad deben estar alertas y tomar medidas correspondientes para reducir el riesgo.
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.
8 me gusta
Recompensa
8
5
Compartir
Comentar
0/400
blockBoy
· hace7h
Otra vez un fallo en el contrato, ¡qué molesto!~
Ver originalesResponder0
GasGuzzler
· 07-07 09:10
Otra vez el compilador está haciendo de las suyas
Ver originalesResponder0
GweiTooHigh
· 07-07 09:05
¿Qué demonios? ¿Otra vulnerabilidad?
Ver originalesResponder0
RektRecovery
· 07-07 09:00
*suspiro* otra vulnerabilidad predecible... ¿cuándo aprenderán los desarrolladores a dejar de jugar con fuego?
Ver originalesResponder0
GasGuzzler
· 07-07 08:44
No he tenido este problema después de probar durante medio día.
Análisis de vulnerabilidades del compilador Solidity: riesgos de seguridad y estrategias de respuesta
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, responsable de convertir lenguajes de programación de alto nivel en instrucciones ejecutables de bajo nivel. Aunque los desarrolladores suelen centrarse en la seguridad del código de la aplicación, la seguridad del propio compilador también es importante. Las vulnerabilidades del compilador pueden, en ciertos casos, causar graves riesgos de seguridad, como las vulnerabilidades del motor JavaScript del navegador que pueden llevar a la ejecución remota de código.
El compilador de Solidity no es una excepción, existen múltiples versiones con vulnerabilidades de seguridad. A diferencia de las vulnerabilidades en la EVM, las vulnerabilidades en el compilador de Solidity solo afectan a los desarrolladores de contratos y no ponen en peligro directamente la seguridad de la red de Ethereum. Sin embargo, puede llevar a que el código EVM generado no coincida con las expectativas del desarrollador, lo que puede provocar vulnerabilidades en los contratos inteligentes y poner en riesgo la seguridad de los activos de los usuarios.
A continuación se presentan algunos ejemplos reales de vulnerabilidades del compilador Solidity:
Versión afectada: >=0.1.6 <0.4.4
Esta vulnerabilidad podría provocar que la variable de almacenamiento se modifique accidentalmente. Por ejemplo:
solidez contrato C { uint32 a = 0x1234; uint32 b = 0; function run() returns (uint) { a += 1; return b; } }
la función run() debería devolver 0, pero en realidad devuelve 1. Esto se debe a que el compilador no limpió correctamente los bits altos al manejar el desbordamiento de enteros, lo que provocó que los bits de desbordamiento se escribieran en una variable adyacente.
Versión afectada: >=0.8.13 <0.8.15
La vulnerabilidad se origina en el proceso de optimización de la compilación. Por ejemplo:
solidez contrato C { function f() public pure returns (uint) { ensamblaje { mstore(0, 0x42) } uint x; ensamblaje { x := mload(0) } return x; } }
f() La función debería devolver 0x42, pero la versión con vulnerabilidad devolverá 0. Esto se debe a que el compilador eliminó incorrectamente la operación de escritura en memoria en el primer bloque de assembly.
Versión afectada: >= 0.5.8 < 0.8.16
Esta vulnerabilidad involucra la codificación ABI del array calldata. Por ejemplo:
solidez contrato C { función f(bytes[1] calldata a) pública pura devuelve (bytes memoria) { return abi.encode(a); } }
f() La función debería devolver el array de entrada, pero la versión con vulnerabilidad devuelve una cadena vacía. Esto se debe a que el compilador limpió incorrectamente los datos adyacentes durante el proceso de codificación.
Para reducir el riesgo de vulnerabilidades en el compilador de Solidity, los desarrolladores deben:
Los auditores de seguridad deben:
Recursos de referencia útiles:
En resumen, aunque las vulnerabilidades del compilador no son comunes, su impacto puede ser grave. Los desarrolladores y el personal de seguridad deben estar alertas y tomar medidas correspondientes para reducir el riesgo.