Reino: Code Quality

Códigos de baixa qualidade levam a comportamentos imprevisíveis. Da perspectiva do usuário, isso normalmente se manifesta como usabilidade ruim. Para um invasor, trata-se de uma oportunidade para atacar o sistema de formas imprevistas.

Memory Leak

Abstract
A memória é alocada, mas nunca é liberada.
Explanation
Vazamentos de memória têm duas causas em comum, às vezes sobrepostas:

- Condições de erro e outras circunstâncias excepcionais.

- Confusão acerca de qual parte do programa é responsável por liberar a memória.

A maioria dos vazamentos de memória resultará em problemas gerais de confiabilidade de software, mas, se um invasor puder provocar intencionalmente um vazamento de memória, talvez ele consiga lançar um ataque de negação de serviço (fazendo com que o programa trave) ou tirar proveito de outro comportamento inesperado do programa resultante de uma condição de pouca memória [1].

Exemplo 1: A função C a seguir faz vazar um bloco de memória alocada quando a chamada para read() não consegue retornar o 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
A memória é alocada, mas nunca é liberada.
Explanation
Vazamentos de memória têm duas causas comuns e, às vezes, sobrepostas:

- Condições de erro e outras circunstâncias excepcionais.

- Confusão acerca de qual parte do programa é responsável pela liberação de memória.

A maioria dos vazamentos de memória resulta em problemas gerais de confiabilidade de software, mas se um invasor puder acionar intencionalmente um vazamento de memória, poderá lançar um ataque de denial of service (travando o programa) ou tirar vantagem de outro comportamento inesperado do programa resultante de uma condição de pouca memória [1].

Exemplo 1: O seguinte programa COBOL da Micro Focus vazará um bloco de memória alocada se ocorrer um erro:


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
Um objeto aloca memória para uma variável de membro e falha em liberá-la no método dealloc().
Explanation
Vazamentos de memória têm duas causas em comum, às vezes sobrepostas:

- Condições de erro e outras circunstâncias excepcionais.

- Confusão acerca de qual parte do programa é responsável por liberar a memória.

A maioria dos vazamentos de memória resultará em problemas gerais de confiabilidade de software, mas, se um invasor puder provocar intencionalmente um vazamento de memória, talvez ele consiga lançar um ataque de negação de serviço (fazendo com que o programa trave) ou tirar proveito de outro comportamento inesperado do programa resultante de uma condição de pouca memória [1].

Exemplo 1: O objeto Objective-C aloca memória no método init() mas falha em liberá-la no método deallocate() resultando em um vazamento de memória:


- (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