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.
DBMS_UTILITY.EXEC_DDL_STATEMENT
executará apenas instruções classificadas como parte da linguagem de definição de dados. Outras declarações que não tenham suporte do SQL embutido serão ignoradas. Esse comportamento faz com que seja difícil detectar erros ao utilizar o processo.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);
}
?>
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.xp_cmdshell
não pode ser usada com segurança. Ela não deve ser usada.xp_cmdshell
inicializa uma shell de comando do Windows para executar a cadeia de comando fornecida. O comando é executado no sistema padrão ou em um contexto de proxy fornecido. No entanto, não há qualquer maneira de limitar um usuário a um conjunto pré-especificado de operações privilegiadas e qualquer concessão de privilégios permite o usuário a executar qualquer cadeia de comando.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.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.
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);
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.java.io
.FileResponse
com entrada de usuário poderia permitir que um invasor fizesse o download dos binários do aplicativo ou visualizasse arquivos arbitrários dentro de diretórios protegidos.
from django.http import FileResponse
...
def file_disclosure(request):
path = request.GET['returnURL']
return FileResponse(open(path, 'rb'))
...
Exemplo 2: O código a seguir usa dados não confiáveis para construir um caminho que é usado em um redirecionamento no lado do servidor.
...
String returnURL = request.getParameter("returnURL");
RequestDispatcher rd = request.getRequestDispatcher(returnURL);
rd.forward();
...
...
<% String returnURL = request.getParameter("returnURL"); %>
<jsp:include page="<%=returnURL%>" />
...
...
String returnURL = request.getParameter("returnURL");
return new ModelAndView(returnURL);
...
<webflow:end-state id="finalStep" view="${requestParameters.url}"/>
<webflow:view-state id="showView" view="${requestParameters.test}">
<bean class="org.springframework.web.servlet.view.
InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
InternalResourceViewResolver
pegará o prefixo com o qual está configurado, concatenará o valor passado no atributo de visualização e finalmente adicionará o sufixo.
...
String returnURL = request.getParameter("returnURL");
return new ActionForward(returnURL);
...
realloc()
para redimensionar buffers que armazenam informações confidenciais. A função pode deixar uma cópia dessas informações confidenciais retida na memória, onde elas não podem ser sobrescritas.realloc()
costuma ser usada para aumentar o tamanho de um bloco de memória alocada. Muitas vezes, essa operação requer a cópia do conteúdo do bloco de memória antigo em um bloco novo e maior. Essa operação deixa o conteúdo do bloco original intacto, mas inacessível ao programa, impedindo que ele consiga limpar dados confidenciais da memória. Se mais tarde um invasor puder examinar o conteúdo de um despejo de memória, os dados confidenciais poderão ficar expostos.realloc()
em um buffer contendo dados confidenciais:
plaintext_buffer = get_secret();
...
plaintext_buffer = realloc(plaintext_buffer, 1024);
...
scrub_memory(plaintext_buffer, 1024);
realloc()
é usado, uma cópia dos dados ainda pode ser exposta na memória originalmente alocada para plaintext_buffer
.VirtualLock
para bloquear páginas que contêm dados confidenciais. A função nem sempre é implementada.VirtualLock
destina-se a bloquear páginas na memória para impedir que elas sejam paginadas no disco. No entanto, no Windows 95/98/ME, a função é implementada apenas como rascunho e não tem nenhum efeito.