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.

93 elementos encontrados
Debilidades
Abstract
El programa no se ha podido deshacer de un objeto administrado que utiliza recursos del sistema no administrados.
Explanation
El programa no se ha podido deshacer de un objeto administrado que emplea recursos del sistema no administrados.
La incapacidad para deshacerse correctamente de un objeto administrado que utilice recursos del sistema no administrado presenta al menos dos causas habituales:

- Condiciones de error y otras circunstancias excepcionales.
- Confusión en cuanto a la parte del programa responsable de liberar el recurso.

Un pequeño subconjunto de objetos .NET administrados utiliza recursos del sistema no administrados. Es posible que el recopilador de elementos no utilizados de .NET no libere los objetos administrados originales en la forma prevista. Por consiguiente, la aplicación puede quedarse sin memoria disponible, ya que el recopilador de elementos no utilizados no conoce la memoria consumida por los recursos no administrados. La mayoría de los problemas de pérdida de recursos no administrados provocan problemas generales de confiabilidad del software. Sin embargo, si un atacante puede activar de forma intencionada una pérdida de recursos no administrados, es posible que este pueda iniciar un ataque de denegación de servicios agotando el conjunto de recursos no administrados.

Ejemplo 1: el siguiente método crea un objeto de mapa de bits administrado a partir de una secuencia de entrada incomingStream. El mapa de bits se manipula y almacena en la secuencia de salida outgoingStream. Nunca se llama de forma explícita al método Dispose() de incomingBitmap y outgoingBitmap.

Normalmente se puede confiar de forma segura en que el recopilador de elementos no utilizados realizará esta tarea en el momento seguro para los objetos administrados que no utilicen recursos del sistema no administrados. El recopilador de elementos no utilizados llama a Bitmap.Dispose() cuando lo cree conveniente Sin embargo, el objeto Bitmap utiliza pocos recursos del sistema no administrados. Es posible que el recopilador de elementos no utilizados llame a Dispose() antes de que se agote el conjunto de recursos no administrados.


private void processBitmap(Stream incomingStream, Stream outgoingStream, int thumbnailSize)
{
Bitmap incomingBitmap = (Bitmap)System.Drawing.Image.FromStream(incomingStream);

bool validBitmap = validateBitmap(incomingBitmap);
if (!validBitmap)
throw new ValidationException(incomingBitmap);

Bitmap outgoingBitmap = new Bitmap(incomingBitmap, new Size(thumbnailSize, thumbnailSize));
outgoingBitmap.Save(outgoingStream, ImageFormat.Bmp);
}
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1
[2] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 3
[3] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 1
[4] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[5] Standards Mapping - Common Weakness Enumeration CWE ID 772
[6] Standards Mapping - Common Weakness Enumeration Top 25 2019 [21] CWE ID 772
[7] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-001094
[8] Standards Mapping - NIST Special Publication 800-53 Revision 4 SC-5 Denial of Service Protection (P1)
[9] Standards Mapping - NIST Special Publication 800-53 Revision 5 SC-5 Denial of Service Protection
[10] Standards Mapping - OWASP Top 10 2004 A9 Application Denial of Service
[11] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 Requirement 6.5.9
[12] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0 Requirement 6.5.6
[13] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2 Requirement 6.5.6
[14] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.1 Requirement 6.5.6
[15] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1 Requirement 6.5.6
[16] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
[17] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 4.2 - Critical Asset Protection
[18] Standards Mapping - Payment Card Industry Software Security Framework 1.1 Control Objective 4.2 - Critical Asset Protection
[19] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 4.2 - Critical Asset Protection, Control Objective C.3.3 - Web Software Attack Mitigation
[20] Standards Mapping - SANS Top 25 2009 Risky Resource Management - CWE ID 404
[21] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP6080 CAT II
[22] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP6080 CAT II
[23] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP6080 CAT II
[24] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP6080 CAT II
[25] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP6080 CAT II
[26] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP6080 CAT II
[27] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP6080 CAT II
[28] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002400 CAT II
[29] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002400 CAT II
[30] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002400 CAT II
[31] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002400 CAT II
[32] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002400 CAT II
[33] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002400 CAT II
[34] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002400 CAT II
[35] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002400 CAT II
[36] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002400 CAT II
[37] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002400 CAT II
[38] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002400 CAT II
[39] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002400 CAT II
[40] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002400 CAT II
[41] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002400 CAT II
[42] Standards Mapping - Web Application Security Consortium Version 2.00 Denial of Service (WASC-10)
[43] Standards Mapping - Web Application Security Consortium 24 + 2 Denial of Service
desc.controlflow.dotnet.unreleased_resource_unmanaged_object
Abstract
Al hacer referencia a una memoria una vez liberada, se puede producir un bloqueo del programa.
Explanation
Los errores de uso tras la liberación se producen cuando un programa sigue usando un puntero una vez que este se ha liberado. Al igual que los errores de doble liberación y las pérdidas de memoria, los errores de uso tras la liberación presentan dos causas habituales, que a veces se superponen:

- Condiciones de error y otras circunstancias excepcionales.

- Confusión en cuanto a la parte del programa responsable de liberar la memoria

Los errores de uso tras la liberación a menudo no tienen ningún efecto, pero en otras ocasiones pueden provocar que se bloquee el programa. Aunque es técnicamente factible reasignar la memoria liberada y que el usuario malintencionado utilice esta reasignación para iniciar un ataque de buffer overflow, no conocemos ningún ataque basado en este tipo de método.

Ejemplo: el siguiente código muestra un error de uso tras la liberación:


char* ptr = (char*)malloc (SIZE);
...
if (err) {
abrt = 1;
free(ptr);
}
...
if (abrt) {
logError("operation aborted before commit", ptr);
}
desc.controlflow.cpp.use_after_free