Verificação de contaminação - Taint checking

A verificação de contaminação é um recurso em algumas linguagens de programação de computador , como Perl e Ruby , projetada para aumentar a segurança, evitando que usuários mal-intencionados executem comandos em um computador host. As verificações de contaminação destacam riscos de segurança específicos principalmente associados a sites que são atacados usando técnicas como injeção de SQL ou abordagens de ataque de estouro de buffer .

Visão geral

O conceito por trás da verificação de contaminação é que qualquer variável que pode ser modificada por um usuário externo (por exemplo, uma variável definida por um campo em um formulário da web ) representa um risco potencial de segurança. Se essa variável for usada em uma expressão que define uma segunda variável, essa segunda variável agora também é suspeita. A ferramenta de verificação de contaminação pode então prosseguir variável por variável formando uma lista de variáveis ​​que são potencialmente influenciadas por entradas externas. Se qualquer uma dessas variáveis ​​for usada para executar comandos perigosos (como comandos diretos para um banco de dados SQL ou o sistema operacional do computador host ), o verificador de contaminação avisa que o programa está usando uma variável contaminada potencialmente perigosa. O programador de computador pode então redesenhar o programa para erguer uma parede segura ao redor da entrada perigosa.

A verificação de contaminação pode ser vista como uma aproximação conservadora da verificação completa de não interferência ou o conceito mais geral de fluxo de informações seguro . Como o fluxo de informações em um sistema não pode ser verificado examinando um único traço de execução desse sistema, os resultados da análise de contaminação refletirão necessariamente informações aproximadas sobre as características do fluxo de informações do sistema ao qual é aplicado.

Exemplo

O seguinte código Perl perigoso abre uma grande vulnerabilidade de injeção de SQL ao não verificar o valor da $name variável:

#!/usr/bin/perl
my $name = $cgi->param("name");  # Get the name from the browser
...
$dbh->{TaintIn} = 1;
$dbh->execute("SELECT * FROM users WHERE name = '$name';"); # Execute an SQL query

Se a verificação de contaminação estiver ativada, Perl se recusará a executar o comando e sairá com uma mensagem de erro, porque uma variável contaminada está sendo usada em uma consulta SQL. Sem a verificação de contaminação, um usuário pode entrar foo'; DROP TABLE users -- , executando um comando que exclui toda a tabela do banco de dados. Muito mais seguro seria codificar o valor corrompido de $ name em um literal de string SQL e usar o resultado na consulta SQL, garantindo que nenhum comando perigoso embutido $name seja avaliado. Outra maneira de conseguir isso é usar uma instrução preparada para limpar todas as entradas de variáveis ​​para uma consulta.

Uma coisa a notar é que o Perl DBI requer que se defina o TaintIn atributo de um identificador de banco de dados , bem como habilite o modo de contaminação para verificar as strings SQL.

História

Perl suportava contaminação em scripts setuid pelo menos a partir da versão 3.0 (lançada em 1989), embora não tenha sido até a versão 5.0 (lançada em 1994) que o -T switch foi introduzido integrando contaminação em um único tempo de execução.

Em 1996, a Netscape implementou a contaminação de dados em JavaScript do lado do servidor no Netscape Communications Server , bem como no lado do cliente para o Netscape Navigator 3. No entanto, uma vez que o suporte do lado do cliente foi considerado experimental, ele foi enviado desativado (exigindo intervenção do usuário para ativar), e requereram que os autores das páginas modificassem os scripts para se beneficiarem com isso. Outros fornecedores de navegadores nunca implementaram a funcionalidade; nem o principal concorrente do Communications Server, o (então) novo Internet Information Server da Microsoft .

Referências

links externos