Reino: Code Quality

Una mala calidad del código lleva a un comportamiento no predecible. Desde la perspectiva de un usuario, muchas veces también supone una usabilidad limitada. Pero para un atacante es una oportunidad para atacar al sistema de formas insospechadas.

4 elementos encontrados
Debilidades
Abstract
El comportamiento de esta función no está definido a menos que sus parámetros de control se establezcan en un valor específico.
Explanation
Linux Standard Base Specification 2.0.1 para libc establece restricciones en los argumentos de algunas funciones internas [1]. Si no se cumplen las restricciones, no se define el comportamiento de las funciones.


El valor 1 debe transferirse al primer parámetro (el número de versión) de la siguiente función del sistema de archivos:


__xmknod


El valor 2 debe transferirse al tercer parámetro (el argumento de grupo) de las siguientes funciones de cadenas de caracteres amplias:


__wcstod_internal
__wcstof_internal
_wcstol_internal
__wcstold_internal
__wcstoul_internal


El valor 3 debe transferirse como primer parámetro (el número de versión) de las siguientes funciones del sistema de archivos:


__xstat
__lxstat
__fxstat
__xstat64
__lxstat64
__fxstat64

References
[1] The Linux Standard Base Specification 2.0.1, Interfaces Definitions for libc.
[2] Standards Mapping - Common Weakness Enumeration CWE ID 475
[3] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2012 Rule 1.3
desc.semantic.cpp.undefined_behavior
Abstract
La aplicación utiliza una asignación que elimina la referencia a un objeto ARCHIVO del sistema.
Explanation
En función del compilador de C específico que se utilice, la dirección de un objeto ARCHIVO del sistema puede ser importante para el uso del objeto ARCHIVO como una secuencia. El uso de una copia del objeto ARCHIVO sin la dirección asociada puede generar un comportamiento indefinido que resulte en una posible fuga de información del sistema, un fallo del sistema o la capacidad de un actor malintencionado de leer o editar archivos a su discreción.

Ejemplo 1: El siguiente código muestra un objeto ARCHIVO del sistema al que se le desreferencia y se copia por valor.


FILE *sysfile = fopen(test.file, "w+");
FILE insecureFile = *sysfile;


Como sysfile se desreferencia en la asignación de insecureFile, el uso deinsecureFile puede resultar en una amplia variedad de problemas.
References
[1] Standards Mapping - Common Weakness Enumeration CWE ID 706
[2] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2012 Rule 22.5
desc.structural.cpp.undefined_behavior_file_pointer_dereference
Abstract
La aplicación utiliza una operación de archivo en un puntero de archivo cerrado.
Explanation
Realizar operaciones de archivos en un objeto ARCHIVO del sistema después de cerrar su secuencia asociada da como resultado un comportamiento indefinido. En función del compilador de C específico que se utilice, la operación del archivo puede provocar un fallo del sistema o incluso provocar la modificación o lectura del mismo archivo o de uno diferente.

Ejemplo 1: El siguiente código muestra un intento de leer un objeto ARCHIVO del sistema después de cerrar la secuencia correspondiente.


FILE *sysfile = fopen(test.file, "r+");
res = fclose(sysfile);
if(res == 0){
printf("%c", getc(sysfile));
}


Como la función getc() se ejecuta después de que la secuencia del archivo para sysfile esté cerrada, getc() da como resultado un comportamiento indefinido y puede provocar un fallo del sistema o una posible modificación o lectura del mismo archivo o de uno diferente.
References
[1] Standards Mapping - Common Weakness Enumeration CWE ID 910
[2] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2012 Rule 22.6
desc.controlflow.cpp.undefined_behavior_file_pointer_use_after_close
Abstract
Eliminar de forma explícita un puntero administrado provocará que el programa se bloquee o no se comporte correctamente.
Explanation
La eliminación de un puntero administrado provocará que el programa se bloquee o se comporte incorrectamente cuando, más adelante, el código de administración del puntero asuma que el puntero sigue siendo válido. El ejemplo siguiente ilustra el error.


std::auto_ptr<foo> p(new foo);
foo* rawFoo = p.get();
delete rawFoo;


La única excepción a esta regla aparece cuando una clase de puntero administrado es compatible con una operación "desasociar" lo que permite al programador tomar el control de la administración de la memoria para un puntero determinado. Si el programa desasocia el puntero de la clase de administración antes de llamar delete, la clase de administración sabrá que no puede seguir utilizando el puntero.
References
[1] Standards Mapping - Common Weakness Enumeration CWE ID 730
[2] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-001094
[3] Standards Mapping - NIST Special Publication 800-53 Revision 4 SC-5 Denial of Service Protection (P1)
[4] Standards Mapping - NIST Special Publication 800-53 Revision 5 SC-5 Denial of Service Protection
[5] Standards Mapping - OWASP Top 10 2004 A9 Application Denial of Service
[6] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 Requirement 6.5.9
[7] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP6080 CAT II
[8] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP6080 CAT II
[9] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP6080 CAT II
[10] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP6080 CAT II
[11] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP6080 CAT II
[12] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP6080 CAT II
[13] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP6080 CAT II
[14] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002400 CAT II
[15] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002400 CAT II
[16] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002400 CAT II
[17] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002400 CAT II
[18] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002400 CAT II
[19] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002400 CAT II
[20] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002400 CAT II
[21] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002400 CAT II
[22] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002400 CAT II
[23] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002400 CAT II
[24] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002400 CAT II
[25] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002400 CAT II
[26] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002400 CAT II
[27] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002400 CAT II
[28] Standards Mapping - Web Application Security Consortium Version 2.00 Denial of Service (WASC-10)
[29] Standards Mapping - Web Application Security Consortium 24 + 2 Denial of Service
desc.controlflow.cpp.redundant_delete