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
chroot()
pode permitir que os invasores escapem de uma prisão chroot.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.