Reino: Environment
Esta sección incluye todo lo que está fuera del código fuente pero aun así es importante para la seguridad del producto que se está creando. Dado que todas las cuestiones incluidas en esta sección no están directamente relacionadas con el código fuente, las hemos separado de las demás secciones.
Insecure Compiler Optimization
Abstract
Una limpieza inadecuada de datos confidenciales de la memoria puede poner en peligro la seguridad.
Explanation
Los errores de optimización del compilador se producen cuando:
1. Los datos secretos se almacenan en la memoria.
2. Los datos secretos se limpian de la memoria sobrescribiendo su contenido.
3. El código de origen se compila mediante un compilador de optimización, que identifica y elimina la función que sobrescribe el contenido como un almacén no alcanzado porque la memoria no se utiliza posteriormente.
Ejemplo 1: El siguiente código lee una contraseña del usuario, utiliza esta para conectarse a un gran sistema (mainframe) back-end y, a continuación, intenta limpiar la contraseña de la memoria mediante
El código del ejemplo se comporta correctamente si se ejecuta de forma literal, pero si este se compila mediante un compilador de optimización como, por ejemplo, Microsoft Visual C++(R) .NET o GCC 3.x, se eliminará la llamada a
Es práctica habitual sobrescribir datos confidenciales manipulados en la memoria como, por ejemplo, contraseñas o claves criptográficas, para impedir que los usuarios malintencionados averigüen secretos del sistema. Sin embargo, con la introducción de los compiladores de optimización, los programas no siempre se comportan como podría sugerir solo su código fuente. En el ejemplo, el compilador interpreta la llamada a
Por lo general, los usuarios malintencionados explotan este tipo de vulnerabilidad mediante un mecanismo de volcado del núcleo o de tiempo de ejecución para acceder a la memoria utilizada por una aplicación específica y recuperar la información secreta. Una vez que el usuario malintencionado tiene acceso a la información secreta, es relativamente sencillo explotar aún más el sistema y poner en peligro posiblemente otros recursos con los que interactúa la aplicación.
1. Los datos secretos se almacenan en la memoria.
2. Los datos secretos se limpian de la memoria sobrescribiendo su contenido.
3. El código de origen se compila mediante un compilador de optimización, que identifica y elimina la función que sobrescribe el contenido como un almacén no alcanzado porque la memoria no se utiliza posteriormente.
Ejemplo 1: El siguiente código lee una contraseña del usuario, utiliza esta para conectarse a un gran sistema (mainframe) back-end y, a continuación, intenta limpiar la contraseña de la memoria mediante
memset()
.
void GetData(char *MFAddr) {
char pwd[64];
if (GetPasswordFromUser(pwd, sizeof(pwd))) {
if (ConnectToMainframe(MFAddr, pwd)) {
// Interaction with mainframe
}
}
memset(pwd, 0, sizeof(pwd));
}
El código del ejemplo se comporta correctamente si se ejecuta de forma literal, pero si este se compila mediante un compilador de optimización como, por ejemplo, Microsoft Visual C++(R) .NET o GCC 3.x, se eliminará la llamada a
memset()
como almacén no alcanzado porque no se ha utilizado el búfer pwd
una vez sobrescrito su valor [2]. Como el búfer pwd
contiene un valor confidencial, es posible que la aplicación sea vulnerable a un ataque si se dejan datos en la memoria. Si los usuarios malintencionados pueden acceder a la región correcta de la memoria, es posible que usen la contraseña recuperada para obtener acceso al sistema.Es práctica habitual sobrescribir datos confidenciales manipulados en la memoria como, por ejemplo, contraseñas o claves criptográficas, para impedir que los usuarios malintencionados averigüen secretos del sistema. Sin embargo, con la introducción de los compiladores de optimización, los programas no siempre se comportan como podría sugerir solo su código fuente. En el ejemplo, el compilador interpreta la llamada a
memset()
como código no alcanzado porque la memoria en la que se está escribiendo no se utiliza posteriormente, a pesar del hecho de que hay claramente una motivación de seguridad para que se realice la operación. El problema aquí es que muchos compiladores y, de hecho, muchos lenguajes de programación, no tienen en cuenta esta u otras inquietudes acerca de la seguridad en su esfuerzo por mejorar la eficacia. Por lo general, los usuarios malintencionados explotan este tipo de vulnerabilidad mediante un mecanismo de volcado del núcleo o de tiempo de ejecución para acceder a la memoria utilizada por una aplicación específica y recuperar la información secreta. Una vez que el usuario malintencionado tiene acceso a la información secreta, es relativamente sencillo explotar aún más el sistema y poner en peligro posiblemente otros recursos con los que interactúa la aplicación.
References
[1] M. Howard Some Bad News and Some Good News Microsoft
[2] M. Howard, D. LeBlanc Writing Secure Code, Second Edition Microsoft Press
[3] Standards Mapping - Common Weakness Enumeration CWE ID 14
[4] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-001090
[5] Standards Mapping - FIPS200 MP
[6] Standards Mapping - General Data Protection Regulation (GDPR) Privacy Violation
[7] Standards Mapping - NIST Special Publication 800-53 Revision 4 SC-4 Information in Shared Resources (P1)
[8] Standards Mapping - NIST Special Publication 800-53 Revision 5 SC-4 Information in Shared System Resources
[9] Standards Mapping - OWASP Mobile 2014 M4 Unintended Data Leakage
[10] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-STORAGE-2
[11] Standards Mapping - OWASP Top 10 2004 A8 Insecure Storage
[12] Standards Mapping - OWASP Top 10 2007 A8 Insecure Cryptographic Storage
[13] Standards Mapping - OWASP Top 10 2010 A7 Insecure Cryptographic Storage
[14] Standards Mapping - OWASP Top 10 2013 A6 Sensitive Data Exposure
[15] Standards Mapping - OWASP Top 10 2017 A3 Sensitive Data Exposure
[16] Standards Mapping - OWASP Top 10 2021 A05 Security Misconfiguration
[17] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 Requirement 3.4, Requirement 6.5.8, Requirement 8.4
[18] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 Requirement 3.4, Requirement 6.3.1.3, Requirement 6.5.8, Requirement 8.4
[19] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0 Requirement 3.4, Requirement 6.5.3, Requirement 8.4
[20] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0 Requirement 3.4, Requirement 6.5.3, Requirement 8.2.1
[21] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1 Requirement 3.4, Requirement 6.5.3, Requirement 8.2.1
[22] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2 Requirement 3.4, Requirement 6.5.3, Requirement 8.2.1
[23] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.1 Requirement 3.4, Requirement 6.5.3, Requirement 8.2.1
[24] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 3.5.1, Requirement 6.2.4, Requirement 8.3.1
[25] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0.1 Requirement 3.3.2, Requirement 3.3.3, Requirement 3.5.1, Requirement 6.2.4, Requirement 8.3.1
[26] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 4.2 - Critical Asset Protection
[27] Standards Mapping - Payment Card Industry Software Security Framework 1.1 Control Objective 4.2 - Critical Asset Protection
[28] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 4.2 - Critical Asset Protection
[29] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP3230.2 CAT II
[30] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP3230.2 CAT II
[31] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP3230.2 CAT II
[32] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP3230.2 CAT II
[33] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP3230.2 CAT II
[34] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP3230.2 CAT II
[35] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP3230.2 CAT II
[36] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002380 CAT II
[37] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002380 CAT II
[38] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002380 CAT II
[39] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002380 CAT II
[40] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002380 CAT II
[41] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002380 CAT II
[42] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002380 CAT II
[43] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002380 CAT II
[44] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002380 CAT II
[45] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002380 CAT II
[46] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002380 CAT II
[47] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002380 CAT II
[48] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002380 CAT II
[49] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002380 CAT II
[50] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002380 CAT II
desc.semantic.cpp.insecure_compiler_optimization