Uma API é um contrato entre quem chama e o que se chama. As formas mais comuns de abuso de API ocorrem quando o responsável pela chamada não respeita sua parte do contrato. Por exemplo, se um programa não chama chdir() após chamar chroot(), ele viola o contrato que especifica como alterar o diretório raiz ativo de forma segura. Outro bom exemplo de abuso de biblioteca é esperar que o elemento chamado retorne informações confiáveis de DNS ao responsável pela chamada. Nesse caso, o responsável pela chamada abusa a API do elemento chamado ao fazer certas suposições sobre seu comportamento (isto é, que o valor de retorno pode ser usado para fins de autenticação). A outra parte também pode violar o contrato entre quem chama e o que se chama. Por exemplo, se um programador definir SecureRandom como subclasse e retornar um valor não aleatório, o contrato será violado.
Often Misused: Encoding
GetChars
nas classes Decoder
& Encoding
, e o método GetBytes
nas classes Encoder
& Encoding
no .NET Framework executam internamente a aritmética de ponteiro nas matrizes char e byte para converter o intervalo de caracteres em um intervalo de bytes e vice-versa. Durante a execução de operações de aritmética de ponteiro, os desenvolvedores muitas vezes substituem os métodos precedentes de uma maneira ruim e introduzem vulnerabilidades, como execução de código arbitrário, abuso da lógica do aplicativo e negação de serviço.
Exemplo 1: A seguinte chamada de codificação proporciona a um invasor um pouco de latitude para inserir JavaScript mal-intencionado:
out.println("x = " + encoder.encodeForJavaScript(input) + ";");
Exemplo 1: Em Objective-C, o seguinte exemplo converte um objeto NSString que contém um caractere UTF-8 em dados ASCII e depois o converte de volta:
...
unichar ellipsis = 0x2026;
NSString *myString = [NSString stringWithFormat:@"My Test String%C", ellipsis];
NSData *asciiData = [myString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding];
NSLog(@"Original: %@ (length %d)", myString, [myString length]);
NSLog(@"Best-fit-mapped: %@ (length %d)", asciiString, [asciiString length]);
// output:
// Original: My Test String... (length 15)
// Best-fit-mapped: My Test String... (length 17)
...
Se você observar a saída com cuidado, o caractere "..." foi traduzido para três pontos consecutivos. Se você tinha dimensionado o buffer de saída com base no buffer de entrada, o aplicativo poderia estar vulnerável a um buffer overflow. Outros caracteres podem ser mapeados de um caractere para dois. O caractere grego "fi" será mapeado como um "f" seguido por um "i". Ao fazer o carregamento frontal do buffer com esses caracteres, um invasor obtém o controle completo sobre o número de caracteres usados para estourar o buffer.
Exemplo 1: Em Swift, o seguinte exemplo converte um objeto NSString que contém um caractere UTF-8 em dados ASCII e depois o converte de volta:
...
let ellipsis = 0x2026;
let myString = NSString(format:"My Test String %C", ellipsis)
let asciiData = myString.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion:true)
let asciiString = NSString(data:asciiData!, encoding:NSASCIIStringEncoding)
NSLog("Original: %@ (length %d)", myString, myString.length)
NSLog("Best-fit-mapped: %@ (length %d)", asciiString!, asciiString!.length)
// output:
// Original: My Test String ... (length 16)
// Best-fit-mapped: My Test String ... (length 18)
...
Se você observar a saída com cuidado, o caractere "..." foi traduzido para três pontos consecutivos. Se você tinha dimensionado o buffer de saída com base no buffer de entrada, o aplicativo poderia estar vulnerável a um buffer overflow. Outros caracteres podem ser mapeados de um caractere para dois. O caractere grego "fi" será mapeado como um "f" seguido por um "i". Ao fazer o carregamento frontal do buffer com esses caracteres, um invasor obtém o controle completo sobre o número de caracteres usados para estourar o buffer.