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.

Directory Restriction

Abstract
O uso indevido da chamada de sistema chroot() pode permitir que os invasores escapem de uma prisão chroot.
Explanation
A chamada de sistema chroot() permite que um processo altere sua percepção do diretório raiz do sistema de arquivos. Depois de invocar chroot() corretamente, um processo não pode acessar arquivos fora da árvore de diretórios definida pelo novo diretório raiz. Esse ambiente recebe o nome de prisão chroot e é comumente utilizado para impedir que um processo possa ser corrompido e usado para acessar arquivos não autorizados. Por exemplo, muitos servidores FTP são executados em prisões chroot para impedir que um invasor que descobrir uma nova vulnerabilidade em um servidor seja capaz de baixar o arquivo de senha ou outros arquivos confidenciais do sistema.

O uso indevido de chroot() pode permitir que os invasores escapem da prisão chroot. A chamada de função chroot() não altera o diretório de trabalho atual do processo e, portanto, caminhos relativos ainda podem fazer referência a recursos do sistema de arquivos fora da prisão chroot depois que chroot() é chamada.

Exemplo 1: Considere o seguinte código-fonte de um servidor FTP (hipotético):


chroot("/var/ftproot");
...
fgets(filename, sizeof(filename), network);
localfile = fopen(filename, "r");
while ((len = fread(buf, 1, sizeof(buf), localfile)) != EOF) {
fwrite(buf, 1, sizeof(buf), network);
}
fclose(localfile);


Esse código é responsável pela leitura de um nome de arquivo na rede, pela abertura do arquivo correspondente na máquina local e pelo envio do conteúdo na rede. Esse código pode ser usado para implementar o comando FTP GET. O servidor FTP chama chroot() em suas rotinas de inicialização, na tentativa de impedir o acesso a arquivos fora de /var/ftproot. Porém, como o servidor não consegue alterar o diretório de trabalho atual chamando chdir("/"), um invasor poderia solicitar o arquivo "../../../../../etc/passwd"e obter uma cópia do arquivo de senha do sistema.
References
[1] J. Viega, G. McGraw Building Secure Software Addison-Wesley
[2] A. Chuvakin Using Chroot Securely
[3] Standards Mapping - Common Weakness Enumeration CWE ID 243
[4] Standards Mapping - General Data Protection Regulation (GDPR) Access Violation
[5] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2023 Directive 4.14
[6] Standards Mapping - OWASP Mobile 2014 M4 Unintended Data Leakage
[7] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-STORAGE-2
[8] Standards Mapping - Web Application Security Consortium Version 2.00 Insufficient Authorization (WASC-02)
[9] Standards Mapping - Web Application Security Consortium 24 + 2 Insufficient Authorization
desc.semantic.cpp.directory_restriction