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 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 sprintf(), FormatMessageW(), syslog(), NSLog, ou NSString.stringWithFormatcomo um argumento do formato String
Exemplo 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():


...
syslog(LOG_ERR, "%s", cmdBuf);
...
Exemplo 4: As classes principais da Apple proporcionam rotas interessantes para explorar as vulnerabilidades do formato String.

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