Reino: Input Validation and Representation
Problemas de validação e representação da entrada são causados por metacaracteres, codificações alternativas e representações numéricas. Confiar na entrada resulta em problemas de segurança. Os problemas incluem: “Buffer Overflows”, ataques de “Cross-Site Scripting”, “SQL Injection”, entre outros.
Format String
Abstract
Permitir que um invasor controle a string de formato de uma função pode resultar em um buffer overflow.
Explanation
Vulnerabilidades de string de formato ocorrem quando:
1. Os dados entram em um aplicativo por uma fonte não confiável.
2. Os dados são transmitidos como o argumento de string de formato para uma função como
Exemplo 1: O código a seguir copia um argumento de linha de comando em um buffer usando
Esse código permite que um invasor visualize o conteúdo da pilha e grave nessa pilha usando um argumento de linha de comando que contém uma sequência de diretivas de formatação. O invasor pode ler a partir da pilha fornecendo mais diretivas de formatação, como
Exemplo 2: Certas implementações facilitam ainda mais alguns ataques mais avançados, fornecendo diretivas de formato que controlam a localização na memória na qual realizar leituras ou gravações. Um exemplo dessas diretivas é mostrado no código a seguir, escrito para glibc:
Esse código produz a seguinte saída:
Também é possível usar meias-gravações (%hn) para controlar com precisão DWORDS arbitrários na memória, o que reduz significativamente a complexidade necessária para executar um ataque que, de outra forma, exigiria quatro gravações escalonadas, como o mencionado no
Exemplo 3: As vulnerabilidades de string de formato simples muitas vezes são resultantes de atalhos aparentemente inofensivos. O uso de alguns desses atalhos é tão arraigado que os programadores talvez nem mesmo percebam que a função que eles estão usando espera um argumento de string de formato.
Por exemplo, a função é
Como o segundo parâmetro para
O código a seguir mostra o uso correto de
1. Os dados entram em um aplicativo por uma fonte não confiável.
2. Os dados são transmitidos como o argumento de string de formato para uma função como
sprintf()
, FormatMessageW()
ou syslog()
.Exemplo 1: O código a seguir copia um argumento de linha de comando em um buffer usando
snprintf()
.
int main(int argc, char **argv){
char buf[128];
...
snprintf(buf,128,argv[1]);
}
Esse código permite que um invasor visualize o conteúdo da pilha e grave nessa pilha usando um argumento de linha de comando que contém uma sequência de diretivas de formatação. O invasor pode ler a partir da pilha fornecendo mais diretivas de formatação, como
%x
, do que a função utiliza como argumentos a serem formatados. (Neste exemplo, a função não usa argumentos a serem formatados.) Ao usar a diretiva de formatação %n
, o invasor pode gravar na pilha, fazendo com que snprintf()
grave no argumento especificado o número de bytes cuja saída foi processada até o momento (em vez de ler um valor do argumento, que é o comportamento pretendido). Uma versão sofisticada desse ataque usará quatro gravações escalonadas para controlar completamente o valor de um apontador na pilha.Exemplo 2: Certas implementações facilitam ainda mais alguns ataques mais avançados, fornecendo diretivas de formato que controlam a localização na memória na qual realizar leituras ou gravações. Um exemplo dessas diretivas é mostrado no código a seguir, escrito para glibc:
printf("%d %d %1$d %1$d\n", 5, 9);
Esse código produz a seguinte saída:
5 9 5 5
Também é possível usar meias-gravações (%hn) para controlar com precisão DWORDS arbitrários na memória, o que reduz significativamente a complexidade necessária para executar um ataque que, de outra forma, exigiria quatro gravações escalonadas, como o mencionado no
Example 1
.Exemplo 3: As vulnerabilidades de string de formato simples muitas vezes são resultantes de atalhos aparentemente inofensivos. O uso de alguns desses atalhos é tão arraigado que os programadores talvez nem mesmo percebam que a função que eles estão usando espera um argumento de string de formato.
Por exemplo, a função é
syslog()
por vezes utilizada da seguinte maneira:
...
syslog(LOG_ERR, cmdBuf);
...
Como o segundo parâmetro para
syslog()
é uma string de formato, qualquer diretiva de formatação incluída em cmdBuf
é interpretada conforme descrito no Example 1
.O código a seguir mostra o uso correto de
syslog()
:
...
syslog(LOG_ERR, "%s", cmdBuf);
...
References
[1] T. Newsham Format String Attacks Guardent, Inc.
desc.dataflow.cpp.format_string
Abstract
Um invasor pode controlar o argumento de formato String que permite um ataque muito parecido com um buffer overflow.
Explanation
Vulnerabilidades de string de formato ocorrem quando:
1. Os dados entram em um aplicativo por uma fonte não confiável.
2. Os dados são transmitidos a uma função tal como
Exemplo 1: O código a seguir utiliza um argumento de linha de comando como um formato String em
Esse código permite a um invasor visualizar o conteúdo da pilha e danificá-la ao usar um argumento de linha de comando que contém uma sequência de diretivas de formatação. O invasor pode ler a partir da pilha fornecendo mais diretivas de formatação, como
O Objective-C dá suporte às bibliotecas C padrão herdadas para que estes exemplos sejam exploráveis caso o seu aplicativo use APIs C.
Exemplo 2: Certas implementações facilitam ainda mais alguns ataques mais avançados, fornecendo diretivas de formato que controlam a localização na memória na qual realizar leituras ou gravações. Um exemplo dessas diretivas é mostrado no código a seguir, escrito para glibc:
Esse código produz a seguinte saída:
Também é possível usar meias-gravações (%hn) para controlar com precisão DWORDS arbitrários na memória, o que reduz significativamente a complexidade necessária para executar um ataque que, de outra forma, exigiria quatro gravações escalonadas, como o mencionado no
Exemplo 3: As vulnerabilidades de string de formato simples muitas vezes são resultantes de atalhos aparentemente inofensivos. O uso de alguns desses atalhos é tão arraigado que os programadores talvez nem mesmo percebam que a função que eles estão usando espera um argumento de string de formato.
Por exemplo, a função é
Como o segundo parâmetro para
O código a seguir mostra o uso correto de
Por exemplo, a função é
O stringByAppendingFormat analisará todos os caracteres do formato String contidos na NSString transmitidos a ele.
O código a seguir mostra o uso correto de
1. Os dados entram em um aplicativo por uma fonte não confiável.
2. Os dados são transmitidos a uma função tal como
sprintf()
, FormatMessageW()
, syslog()
, NSLog
, ou NSString.stringWithFormat
como um argumento do formato StringExemplo 1: O código a seguir utiliza um argumento de linha de comando como um formato String em
NSString.stringWithFormat:
.
int main(int argc, char **argv){
char buf[128];
...
[NSString stringWithFormat:argv[1], argv[2] ];
}
Esse código permite a um invasor visualizar o conteúdo da pilha e danificá-la ao usar um argumento de linha de comando que contém uma sequência de diretivas de formatação. O invasor pode ler a partir da pilha fornecendo mais diretivas de formatação, como
%x
, do que a função utiliza como argumentos a serem formatados. (Neste exemplo, a função não usa argumentos a serem formatados.)O Objective-C dá suporte às bibliotecas C padrão herdadas para que estes exemplos sejam exploráveis caso o seu aplicativo use APIs C.
Exemplo 2: Certas implementações facilitam ainda mais alguns ataques mais avançados, fornecendo diretivas de formato que controlam a localização na memória na qual realizar leituras ou gravações. Um exemplo dessas diretivas é mostrado no código a seguir, escrito para glibc:
printf("%d %d %1$d %1$d\n", 5, 9);
Esse código produz a seguinte saída:
5 9 5 5
Também é possível usar meias-gravações (%hn) para controlar com precisão DWORDS arbitrários na memória, o que reduz significativamente a complexidade necessária para executar um ataque que, de outra forma, exigiria quatro gravações escalonadas, como o mencionado no
Example 1
.Exemplo 3: As vulnerabilidades de string de formato simples muitas vezes são resultantes de atalhos aparentemente inofensivos. O uso de alguns desses atalhos é tão arraigado que os programadores talvez nem mesmo percebam que a função que eles estão usando espera um argumento de string de formato.
Por exemplo, a função é
syslog()
por vezes utilizada da seguinte maneira:
...
syslog(LOG_ERR, cmdBuf);
...
Como o segundo parâmetro para
syslog()
é uma string de formato, qualquer diretiva de formatação incluída em cmdBuf
é interpretada conforme descrito no Example 1
.O código a seguir mostra o uso correto de
syslog()
:Exemplo 4: As classes principais da Apple proporcionam rotas interessantes para explorar as vulnerabilidades do formato String.
...
syslog(LOG_ERR, "%s", cmdBuf);
...
Por exemplo, a função é
String.stringByAppendingFormat()
por vezes utilizada da seguinte maneira:
...
NSString test = @"Sample Text.";
test = [test stringByAppendingFormat:[MyClass
formatInput:inputControl.text]];
...
O stringByAppendingFormat analisará todos os caracteres do formato String contidos na NSString transmitidos a ele.
O código a seguir mostra o uso correto de
stringByAppendingFormat()
:
...
NSString test = @"Sample Text.";
test = [test stringByAppendingFormat:@"%@", [MyClass
formatInput:inputControl.text]];
...
References
[1] T. Newsham Format String Attacks Guardent, Inc.
desc.dataflow.objc.format_string