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.
Null Dereference
Abstract
O programa pode desfazer a referência a um ponteiro nulo, lançando assim uma
NullException
.Explanation
Erros de ponteiro nulo são geralmente o resultado da violação de uma ou mais das suposições do programador.
A maioria dos problemas de ponteiro nulo resulta em problemas gerais de confiabilidade de software, mas, se um invasor puder provocar intencionalmente um cancelamento de referência a um ponteiro nulo, talvez ele consiga usar a exceção resultante para se esquivar da lógica de segurança ou fazer com que o aplicativo revele informações de depuração que serão valiosas no planejamento de ataques subsequentes.
Exemplo 1: No código a seguir, o programador supõe que o sistema sempre tenha uma propriedade denominada "
A maioria dos problemas de ponteiro nulo resulta em problemas gerais de confiabilidade de software, mas, se um invasor puder provocar intencionalmente um cancelamento de referência a um ponteiro nulo, talvez ele consiga usar a exceção resultante para se esquivar da lógica de segurança ou fazer com que o aplicativo revele informações de depuração que serão valiosas no planejamento de ataques subsequentes.
Exemplo 1: No código a seguir, o programador supõe que o sistema sempre tenha uma propriedade denominada "
cmd
" definida. Se um invasor puder controlar o ambiente do programa de forma que "cmd
" não seja definido, o programa lançará uma exceção de ponteiro nulo quando tentar chamar o método Trim()
.
string cmd = null;
...
cmd = Environment.GetEnvironmentVariable("cmd");
cmd = cmd.Trim();
desc.controlflow.dotnet.null_dereference
Abstract
O programa pode desreferenciar um ponteiro nulo, causando uma falha de segmentação.
Explanation
Exceções de ponteiro nulo ocorrem geralmente quando uma ou mais suposições do programador são violadas. Existem pelo menos três faces desse problema: verificação após desreferência, desreferência após verificação e desreferência após armazenamento. Um erro de verificação após o cancelamento da referência ocorre quando um programa desfaz a referência a um ponteiro que pode ser
A maioria dos problemas de ponteiro nulo resulta em problemas gerais de confiabilidade de software. Porém, se um invasor puder provocar intencionalmente uma desreferência a um ponteiro nulo, talvez ele consiga usar a exceção resultante para se esquivar da lógica de segurança a fim de formular um ataque de negação de serviço ou fazer com que o aplicativo revele informações de depuração que serão valiosas no planejamento de ataques subsequentes.
Exemplo 1: No código a seguir, o programador supõe que a variável
null
antes que seja verificado se ele é realmente null
. Erros de desreferência após a verificação ocorrem quando um programa faz uma verificação explícita em busca de valores null
, mas prossegue para desreferenciar o ponteiro quando se sabe que ele é null
. Erros desse tipo são frequentemente o resultado de um erro de digitação ou de uma desatenção do programador. Um erro de desreferência após o armazenamento ocorre quando um programa define explicitamente um ponteiro como null
e o desreferencia mais tarde. Esse erro é frequentemente o resultado de um programador inicializar uma variável como null
quando ela é declarada.A maioria dos problemas de ponteiro nulo resulta em problemas gerais de confiabilidade de software. Porém, se um invasor puder provocar intencionalmente uma desreferência a um ponteiro nulo, talvez ele consiga usar a exceção resultante para se esquivar da lógica de segurança a fim de formular um ataque de negação de serviço ou fazer com que o aplicativo revele informações de depuração que serão valiosas no planejamento de ataques subsequentes.
Exemplo 1: No código a seguir, o programador supõe que a variável
ptr
não seja NULL
. Essa suposição se torna explícita quando o programador desreferencia o ponteiro. Mais tarde, essa suposição é contrariada quando o programador verifica ptr
contra NULL
. Se a variável ptr
puder ser NULL
quando for verificada na instrução if
, ela também poderá ser NULL
quando desreferenciada, podendo causar uma falha de segmentação.Exemplo 2: No código a seguir, o programador confirma que a variável
ptr->field = val;
...
if (ptr != NULL) {
...
}
ptr
é NULL
e depois a desreferencia erroneamente. Se a variável ptr
for NULL
quando for verificada na instrução if
, ocorrerá uma desreferência null
, causando assim uma falha de segmentação.Exemplo 3: No código a seguir, o programador se esquece de que a cadeia de caracteres
if (ptr == null) {
ptr->field = val;
...
}
'\0'
é, na verdade, 0 ou NULL
, desreferenciando assim um ponteiro nulo e provocando uma falha de segmentação.Exemplo 4: No código a seguir, o programador define explicitamente a variável
if (ptr == '\0') {
*ptr = val;
...
}
ptr
como NULL
. Mais tarde, o programador desreferencia ptr
antes de verificar o objeto em busca de um valor null
.
*ptr = NULL;
...
ptr->field = val;
...
}
desc.controlflow.cpp.null_dereference
Abstract
O programa pode desfazer a referência a um ponteiro nulo, lançando assim uma
NullPointerException
.Explanation
Erros de ponteiro nulo são geralmente o resultado da violação de uma ou mais das suposições do programador.
A maioria dos problemas de ponteiro nulo resulta em problemas gerais de confiabilidade de software, mas, se um invasor puder provocar intencionalmente um cancelamento de referência a um ponteiro nulo, talvez ele consiga usar a exceção resultante para se esquivar da lógica de segurança ou fazer com que o aplicativo revele informações de depuração que serão valiosas no planejamento de ataques subsequentes.
Exemplo: No código a seguir, o programador supõe que o sistema sempre tenha uma propriedade denominada "
A maioria dos problemas de ponteiro nulo resulta em problemas gerais de confiabilidade de software, mas, se um invasor puder provocar intencionalmente um cancelamento de referência a um ponteiro nulo, talvez ele consiga usar a exceção resultante para se esquivar da lógica de segurança ou fazer com que o aplicativo revele informações de depuração que serão valiosas no planejamento de ataques subsequentes.
Exemplo: No código a seguir, o programador supõe que o sistema sempre tenha uma propriedade denominada "
cmd
" definida. Se um invasor puder controlar o ambiente do programa de forma que "cmd
" não seja definido, o programa lançará uma exceção de ponteiro nulo quando tentar chamar o método trim()
.
String val = null;
...
cmd = System.getProperty("cmd");
if (cmd)
val = util.translateCommand(cmd);
...
cmd = val.trim();
desc.controlflow.java.null_dereference