Reino: Input Validation and Representation

Los problemas de validación y representación de entradas están causados por metacaracteres, codificaciones alternativas y representaciones numéricas. Los problemas de seguridad surgen de entradas en las que se confía. Estos problemas incluyen: «desbordamientos de búfer», ataques de «scripts de sitios», "SQL injection" y muchas otras acciones.

String Termination Error

Abstract
El uso de la finalización de cadena adecuada puede provocar un desbordamiento del búfer.
Explanation
Los errores de finalización de cadena se producen cuando:

1. Los datos se introducen en un programa mediante una función que no finaliza con null su salida.

2. Los datos se transfieren a una función que requiere que su entrada se finalice con null.
Ejemplo 1: El siguiente código lee cfgfile y copia la entrada en inputbuf mediante strcpy(). El código presupone incorrectamente que inputbuf siempre contendrá un terminador null.


#define MAXLEN 1024
...
char *pathbuf[MAXLEN];
...
read(cfgfile,inputbuf,MAXLEN); //does not null-terminate
strcpy(pathbuf,inputbuf); //requires null-terminated input
...


El código del Example 1 presentará un comportamiento correcto si los datos leídos desde cfgfile se finalizan con null en el disco, tal y como se espera. Sin embargo, si el usuario malintencionado puede modificar esta entrada para que no contenga el carácter null esperado, la llamada a strcpy() continuará con el proceso de copia desde la memoria hasta que encuentre un carácter null arbitrario. Es probable que esto desborde el búfer de destino y, si el atacante puede controlar el contenido de la memoria que aparece justo después de inputbuf, este puede conseguir que la aplicación sea susceptible a un ataque de desbordamiento del búfer.

Ejemplo 2: en el siguiente código, readlink() amplía el nombre de un vínculo simbólico almacenado en el búfer path para que el búfer buf contenga la ruta absoluta del archivo al que hace referencia este vínculo. A continuación, la longitud del valor resultante se calcula mediante strlen().


...
char buf[MAXPATH];
...
readlink(path, buf, MAXPATH);
int length = strlen(buf);
...


El código del Example 2 no presentará un comportamiento correcto debido a que el valor leído en buf por readlink() no se finalizará con null. En las pruebas, es posible que no se detecten vulnerabilidades como esta debido a que el contenido de buf no utilizado y la memoria que aparece justo después pueden ser null, lo que provocaría que strlen() mostrase aparentemente un comportamiento correcto. Sin embargo, en un entorno real, strlen() seguirá recorriendo la memoria hasta que detecte un carácter null arbitrario en la pila, lo que genera un valor de length mucho más grande que el tamaño de buf y podría provocar un desbordamiento del búfer en los usos posteriores de este valor.

Ejemplo 3: El siguiente código utiliza snprintf() para copiar una cadena de entrada de usuario y colocarla en múltiples cadenas de salida. A pesar de proporcionar protecciones adicionales en comparación con sprintf(), en particular la especificación de un tamaño máximo de salida, la función snprintf() aún es susceptible a un error de terminación de cadena cuando el tamaño de salida especificado es mayor que la entrada prospectiva. Los errores de terminación de cadena pueden provocar problemas posteriores, como una pérdida de memoria o un buffer overflow.


...
char no_null_term[5] = getUserInput();

char output_1[20];
snprintf(output_1, 20, "%s", no_null_term);

char output_2[20];
snprintf(output_2, 20, "%s", no_null_term);


printf("%s\n", output_1);
printf("%s\n", output_2);
...


El código del Example 3 demuestra una pérdida de memoria. Cuando la output_2 incluye no_null_term, snprintf() debe leerse desde la ubicación de no_null_term hasta que se encuentre un carácter nulo o se alcance el límite de tamaño especificado. Como no hay terminación en no_null_term, snprintf continúa leyendo los datos de output_1, donde finalmente alcanza un carácter de terminación nulo proporcionado por la primera llamada de snprintf(). La pérdida de memoria se demuestra mediante printf() de output_2, que contiene la secuencia de caracteres de no_null_term dos veces.

Las cadenas se representan tradicionalmente como una región de memoria que contiene datos finalizados con un carácter null. Los métodos de administración de cadenas anteriores utilizaban frecuentemente este carácter null para determinar la longitud de la cadena. Si un búfer que no contiene un terminador null se transfiere a una de estas funciones, la función leerá más allá del final del búfer.

Por lo general, los usuarios malintencionados explotan este tipo de vulnerabilidad mediante la inserción de datos de contenido o tamaño inesperados en la aplicación. Pueden proporcionar la entrada malintencionada de forma directa como entrada en el programa o de forma indirecta mediante la modificación de los recursos de la aplicación como, por ejemplo, los archivos de configuración. En caso de que el usuario malintencionado provoque que la aplicación lea más allá de los límites de un búfer, es posible que este pueda utilizar el buffer overflow resultante para introducir y ejecutar código arbitrario en el sistema.
References
[1] M. Howard, D. LeBlanc Writing Secure Code, Second Edition Microsoft Press
[2] Standards Mapping - Common Weakness Enumeration CWE ID 170, CWE ID 665
[3] Standards Mapping - Common Weakness Enumeration Top 25 2024 [12] CWE ID 020
[4] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002754, CCI-002824
[5] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[6] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2012 Rule 1.3
[7] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2023 Directive 4.14, Rule 1.3, Rule 21.17
[8] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C++ Guidelines 2008 Rule 0-3-1
[9] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C++ Guidelines 2023 Rule 4.1.3
[10] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-10 Information Input Validation (P1), SI-16 Memory Protection (P1)
[11] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-10 Information Input Validation, SI-16 Memory Protection
[12] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[13] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4
[14] Standards Mapping - OWASP Top 10 2004 A5 Buffer Overflow
[15] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 Requirement 6.5.5
[16] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 Requirement 6.3.1.1
[17] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0 Requirement 6.5.2
[18] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0 Requirement 6.5.2
[19] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1 Requirement 6.5.2
[20] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2 Requirement 6.5.2
[21] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.1 Requirement 6.5.2
[22] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
[23] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0.1 Requirement 6.2.4
[24] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 4.2 - Critical Asset Protection
[25] Standards Mapping - Payment Card Industry Software Security Framework 1.1 Control Objective 4.2 - Critical Asset Protection, Control Objective B.3.1 - Terminal Software Attack Mitigation, Control Objective B.3.1.1 - Terminal Software Attack Mitigation
[26] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 4.2 - Critical Asset Protection, Control Objective B.3.1 - Terminal Software Attack Mitigation, Control Objective B.3.1.1 - Terminal Software Attack Mitigation, Control Objective C.3.2 - Web Software Attack Mitigation
[27] Standards Mapping - SANS Top 25 2009 Risky Resource Management - CWE ID 665
[28] Standards Mapping - SANS Top 25 2010 Risky Resource Management - CWE ID 665
[29] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP3510 CAT I, APP3590.1 CAT I
[30] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP3510 CAT I, APP3590.1 CAT I
[31] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP3510 CAT I, APP3590.1 CAT I
[32] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP3510 CAT I, APP3590.1 CAT I
[33] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP3510 CAT I, APP3590.1 CAT I
[34] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP3510 CAT I, APP3590.1 CAT I
[35] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP3510 CAT I, APP3590.1 CAT I
[36] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[37] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[38] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[39] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[40] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[41] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[42] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[43] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[44] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[45] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[46] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[47] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[48] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[49] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002530 CAT II, APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[50] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002530 CAT II, APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[51] Standards Mapping - Web Application Security Consortium Version 2.00 Buffer Overflow (WASC-07)
[52] Standards Mapping - Web Application Security Consortium 24 + 2 Buffer Overflow
desc.dataflow.cpp.string_termination_error.master