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.

Memory Leak

Abstract
La memoria se asigna, pero nunca se libera.
Explanation
Las pérdidas de memoria 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.

Por lo general, la mayoría de las pérdidas de memoria provocan problemas de confiabilidad pero si un atacante puede desencadenar de forma intencionada una pérdida de memoria, este puede ser capaz de iniciar un ataque de denegación de servicio (bloqueando el programa) o aprovechar otro comportamiento inesperado del programa derivado de una situación de bajo nivel de memoria [1].

Ejemplo 1: la siguiente función de C pierde un bloque de memoria asignada si la llamada a read() no devuelve el número esperado de bytes:


char* getBlock(int fd) {
char* buf = (char*) malloc(BLOCK_SIZE);
if (!buf) {
return NULL;
}
if (read(fd, buf, BLOCK_SIZE) != BLOCK_SIZE) {
return NULL;
}
return buf;
}
References
[1] J. Whittaker and H. Thompson How to Break Software Security Addison Wesley
desc.controlflow.cpp.memory_leak
Abstract
La memoria está asignada, pero nunca se libera.
Explanation
Las pérdidas de memoria tienen dos causas comunes que a menudo se solapan:

- Condiciones de error y otras circunstancias excepcionales.

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

La mayoría de pérdidas de memoria derivan en problemas generales de confiabilidad de software, pero si un atacante puede desencadenar intencionadamente una pérdida de memoria, también puede ser capaz de lanzar un ataque de denegación de servicio (bloqueando el programa) o aprovecharse de otro comportamiento inesperado del programa derivado de una situación de bajo nivel de memoria [1].

Ejemplo 1: El siguiente programa de Micro Focus COBOL genera fugas de un bloque de memoria asignada si se produce un error:


CALL "CBL_ALLOC_MEM"
USING mem-pointer
BY VALUE mem-size
BY VALUE flags
RETURNING status-code
END-CALL

IF status-code NOT = 0
DISPLAY "Error!"
GOBACK
ELSE
SET ADDRESS OF mem TO mem-pointer
END-IF

PERFORM write-data
IF ws-status-code NOT = 0
DISPLAY "Error!"
GOBACK
ELSE
DISPLAY "Success!"
END-IF

CALL "CBL_FREE_MEM"
USING BY VALUE mem-pointer
RETURNING status-code
END-CALL

GOBACK
.
References
[1] J. Whittaker and H. Thompson How to Break Software Security Addison Wesley
desc.controlflow.cobol.memory_leak
Abstract
Un objeto asigna memoria a una variable miembro y no consigue liberarla en su método dealloc().
Explanation
Las pérdidas de memoria 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.

Por lo general, la mayoría de las pérdidas de memoria provocan problemas de confiabilidad pero si un atacante puede desencadenar de forma intencionada una pérdida de memoria, este puede ser capaz de iniciar un ataque de denegación de servicio (bloqueando el programa) o aprovechar otro comportamiento inesperado del programa derivado de una situación de bajo nivel de memoria [1].

Ejemplo 1: El objeto de Objective-C asigna memoria al método init() pero no consigue liberarla en el método deallocate(), por lo que se produce una falta de memoria:


- (void)init
{
myVar = [NSString alloc] init];
...
}

- (void)dealloc
{
[otherVar release];
}
References
[1] J. Whittaker and H. Thompson How to Break Software Security Addison Wesley
desc.structural.objc.memory_leak