Reino: API Abuse

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

Abstract
A substituição indevida das classes no .NET Framework pode levar à execução de código arbitrário no servidor, abuso da lógica do aplicativo ou à negação de serviço.
Explanation
Independentemente da linguagem na qual um programa está escrito, os ataques mais devastadores muitas vezes envolvem a execução de código remoto, por meio da qual um invasor consegue executar código mal-intencionado com sucesso no contexto do programa. O método 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.
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1
[2] Standards Mapping - CIS Microsoft Azure Foundations Benchmark partial
[3] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 1
[4] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 1
[5] Standards Mapping - CIS Google Kubernetes Engine Benchmark confidentiality
[6] Standards Mapping - CIS Kubernetes Benchmark partial
[7] Standards Mapping - Common Weakness Enumeration CWE ID 176
[8] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[9] Standards Mapping - OWASP Application Security Verification Standard 4.0 5.3.2 Output Encoding and Injection Prevention Requirements (L1 L2 L3)
[10] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[11] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4
[12] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
desc.structural.dotnet.often_misused_encoding
Abstract
Esse método é difícil de usar corretamente.
Explanation
É fácil acreditar que esse método de codificação protegerá contra ataques de injeção, mas, se ele não for usado no contexto certo, poderá oferecer muito menos proteção do que anuncia.

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) + ";");
References
[1] OWASP ESAPI Secure Coding Guideline
[2] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1
[3] Standards Mapping - CIS Microsoft Azure Foundations Benchmark partial
[4] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 1
[5] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 1
[6] Standards Mapping - CIS Google Kubernetes Engine Benchmark confidentiality
[7] Standards Mapping - CIS Kubernetes Benchmark partial
[8] Standards Mapping - Common Weakness Enumeration CWE ID 176
[9] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[10] Standards Mapping - OWASP Application Security Verification Standard 4.0 5.3.2 Output Encoding and Injection Prevention Requirements (L1 L2 L3)
[11] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[12] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4
[13] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
desc.structural.java.often_misused_encoding
Abstract
A chamada identificada pode ajustar caracteres de uma forma melhor. Os caracteres não suportados passados para os métodos de API padrão podem ser mapeados com um melhor ajuste para caracteres perigosos.
Explanation
Quando conjuntos de caracteres são incompatíveis entre o sistema operacional e os aplicativos em execução no sistema operacional, os caracteres não suportados passados para os métodos de API padrão podem ser mapeados com um melhor ajuste para caracteres perigosos.

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.
References
[1] Apple Secure Coding Guide Apple
[2] String Programming Guide Apple
[3] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1
[4] Standards Mapping - CIS Microsoft Azure Foundations Benchmark partial
[5] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 1
[6] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 1
[7] Standards Mapping - CIS Google Kubernetes Engine Benchmark confidentiality
[8] Standards Mapping - CIS Kubernetes Benchmark partial
[9] Standards Mapping - Common Weakness Enumeration CWE ID 176
[10] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[11] Standards Mapping - OWASP Application Security Verification Standard 4.0 5.3.2 Output Encoding and Injection Prevention Requirements (L1 L2 L3)
[12] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[13] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4
[14] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
desc.semantic.objc.method_may_best_fit_map_characters
Abstract
A chamada identificada pode ajustar caracteres de uma forma melhor. Os caracteres não suportados passados para os métodos de API padrão podem ser mapeados com um melhor ajuste para caracteres perigosos.
Explanation
Quando conjuntos de caracteres são incompatíveis entre o sistema operacional e os aplicativos em execução no sistema operacional, os caracteres não suportados passados para os métodos de API padrão podem ser mapeados com um melhor ajuste para caracteres perigosos.

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.
References
[1] Apple Secure Coding Guide Apple
[2] String Programming Guide Apple
[3] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1
[4] Standards Mapping - CIS Microsoft Azure Foundations Benchmark partial
[5] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 1
[6] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 1
[7] Standards Mapping - CIS Google Kubernetes Engine Benchmark confidentiality
[8] Standards Mapping - CIS Kubernetes Benchmark partial
[9] Standards Mapping - Common Weakness Enumeration CWE ID 176
[10] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[11] Standards Mapping - OWASP Application Security Verification Standard 4.0 5.3.2 Output Encoding and Injection Prevention Requirements (L1 L2 L3)
[12] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[13] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4
[14] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
desc.semantic.swift.method_may_best_fit_map_characters