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.
Dangerous Function: Unsafe Regular Expression
Exemplo 1: Dada a URL
http://www.example.com/index.php?param=...
, o seguinte trecho de código php em index.php
imprimirá o valor do parâmetro de URL param
(passado no lugar de "...") na tela se ele corresponder à expressão regular POSIX '^[[:alnum:]]*$'
que representa "zero ou mais caracteres alfanuméricos":
<?php
$pattern = '^[[:alnum:]]*$';
$string = $_GET['param'];
if (ereg($pattern, $string)) {
echo($string);
}
?>
Embora o
Example 1
funcione conforme esperado na entrada alfanumérica, como a função ereg()
não segura é usada para validar a entrada contaminada, é possível realizar um ataque cross-site scripting (XSS) por meio da injeção de byte null
. Passar um valor param
que contém uma string alfanumérica válida, seguida por um byte null
e uma marca <script>
(ex.: "Hello123%00<script>alert("XSS")</script>"
), ereg($pattern, $string)
ainda retornará true
, já que a função ereg()
ignora tudo após um caractere de byte null
ao ler a string de entrada (esquerda para direita). Neste exemplo, isso significa que a marca <script>
inserida após o byte null
será exibida para o usuário e avaliada.