Protegendo Formulários Web de Robôs Protegendo Formulários Web de Robôs Marcos de Paula Muniz Especialização em Segurança da Informação – Setembro de 2011 Faculdade Pitágoras – Uberlândia, MG – Brasil [email protected] Resumo. Um CAPTCHA é uma solução computacional que protege sites contra bots através da geração de testes do tipo desafio e resposta que os seres humanos consigam facilmente resolver, mas os programas de computador atuais não. Um CAPTCHA faz isso desafiando o usuário a resolver um teste que um computador ainda não consiga resolver, como decifrar caracteres distorcidos. Essa pesquisa analisa o CAPTCHA mais usado na proteção de formulários da Internet atualmente, o reCAPTCHA, apresenta inúmeras vantagens à utilização de um CAPTCHA, mostra como um formulário desprotegido pode ser facilmente atacado por um bot, mostra também que alguns tipos de CAPTCHAs convencionais estão sujeitos a ataques de OCR, mas, que o reCAPTCHA é resistente à maioria deles. Palavras-chave: CAPTCHA, reCAPTCHA, bot, Segurança. Abstract. A CAPTCHA is a computer solution that protects websites against bots through the generation of tests response challenge those human beings able to easily solve, but actual computer programs no. A CAPTCHA does so by challenging the user to solve a test that a computer still cannot, as deciphering distorted characters. This research analyzes the CAPTCHA most used to protect fill forms of Internet today, the reCAPTCHA, presents numerous advantages to using a CAPTCHA, and shows how an unprotected form can be easily attacked by a bot, also shows that some types of conventional CAPTCHAs are subject to attack by OCR, but that reCAPTCHA is resistant to most of them. Keywords: CAPTCHA, reCAPTCHA, bot, security. Marcos de Paula Muniz Página: 1 Protegendo Formulários Web de Robôs 1. Introdução Os serviços de Internet estão cada vez mais populares e mais presentes no dia-a-dia das pessoas, como mostrado por Márcio Moreira (2007). Com esta popularização e com a utilização cada vez maior do envio de informações de formulários Web para e-mails, os Spammers (pessoas que enviam Spam, que são e-mails indesejados) passaram a explorar uma vulnerabilidade da função mail() do PHP que permite o uso de formulários Web desprotegidos para enviar e-mails para outros destinatários, como mostrado por Bruno Lustosa (2006). Para automatizar este ataque os Spammers criaram os bots (web robot ou robôs web) de preenchimento automático de formulários Web. Jeff Yan e Ahmad Salah El Ahmad (2008), afirmam que esses bots são utilizados, não apenas para disseminação dos Spams em formulários Web, mas também na criação em massa de contas de usuário em serviços Web, como serviços de e-mail por exemplo. Para impedir o funcionamento deste tipo de bot, impedindo o preenchimento automático de formulário Web, foi criado o CAPTCHA (Completely Automated Public Turing Test To Tell Computers and Humans Apart), em 2000 por Luis von Ahn, Manuel Blum, Nicholas Hopper e John Langford, uma solução computacional baseada em uma idéia da década de 1950: o Teste de Turing, de Alan M. Turing, que identificava o que era computável. O objetivo de um CAPTCHA é o inverso da máquina de Turing, ou seja, é distinguir os humanos dos computadores apresentando testes em imagens que apenas humanos consigam resolver, impedindo assim que um formulário preenchido por um bot possa ser enviado com sucesso, afirmam Manuel Blum, Luis von Ahn, John Langford and Nicholas Hopper no site do projeto CAPTCHA. Os testes CAPTCHAs convencionais, baseados em textos distorcidos, podem ser facilmente quebrados, como mostrado por Jeff Yan e Ahmad Salah El Ahmad da Newcastle University no artigo “A Low-cost Attack on a Microsoft CAPTCHA” (2008). Neste artigo apresentamos o conceito do CAPTCHA, uma solução computacional que protege formulários Web contra abusos por programas automatizados. O objetivo deste artigo é reunir informações sobre o CAPTCHA e reCAPTCHA (um tipo de CAPTCHA) para mostrar a importância da utilização desde método de proteção para formulários Web, demonstrando como um formulário Web pode ser facilmente explorado Marcos de Paula Muniz Página: 2 Protegendo Formulários Web de Robôs caso não possua a proteção adequada. Este artigo também tem o objetivo de mostrar que a utilização do reCAPTCHA é melhor, do ponto de vista de segurança, do que a utilização de um CAPTCHA convencional. Começamos descrevendo os fundamentos teóricos da solução, destacando aplicações práticas para segurança. Em seguida apresentamos o reCAPTCHA, uma implementação CAPTCHA que é mais resistente aos tipos de ataques conhecidos atualmente contra CAPTCHAs. Mostramos também como um formulário com alguns tipos de CAPTCHA convencionais podem ser quebrados utilizando somente um software de OCR (Optical Character Recognition ou Reconhecimento Ótico de Caracteres), como obter e utilizar o reCAPTCHA e finalizamos o trabalho com nossas conclusões sobre o tema. 2. CAPTCHA O termo CAPTCHA foi concebido em 2000 por Luis von Ahn, Manuel Blum, Nicholas Hopper e John Langford da Universidade Carnegie Mellon. Segundo eles, um CAPTCHA é uma imagem com caracteres distorcidos que aparecem na base de um formulário Web, onde os usuários devem identificar e digitar os caracteres da imagem para provarem que são humanos e não bots tentando abusarem do serviço. Monica Chew e J. D. Tygar (2004), afirmam que um CAPTCHA deve satisfazer três propriedades, onde os testes devem ser: • Fácil para os humanos resolverem • Fácil para uma máquina gerar • Difícil para uma máquina resolver. A única máquina que deve ser capaz de resolver é aquela que gerou o CAPTCHA. O CAPTCHA possui várias aplicações práticas para segurança, algumas delas são: • Prevenir Spam em comentários de Blogs. • Proteger contra a criação automática de contas de usuários. • Proteger votações de enquetes contra manipulação de resultados. Marcos de Paula Muniz Página: 3 Protegendo Formulários Web de Robôs • Proteger contra ataques de dicionário em serviços de autenticação. • Proteger serviços de e-mail contra Worms e Spam. Os testes CAPTCHAs convencionais, baseados em textos distorcidos, podem ser facilmente quebrados, como mostrado por Jeff Yan e Ahmad Salah El (2008). 3. reCAPTCHA Segundo L. von Ahn, B. Maurer, C. McMillen, D. Abraham e M. Blum (2008), o reCAPTCHA amplia o uso do esforço mental humano para resolver seus CAPTCHAs dando às pessoas desafios CAPTCHAs com palavras extraídas de trechos de livros antigos, publicados na maioria das vezes muito antes do surgimento dos computadores, palavras estas que os computadores não conseguem identificar durante o processo de digitalização automática desses livros. Com o reCAPTCHA está sendo possível, além da geração de desafios para distinção de humanos de robôs, a digitalização em massa de livros antigos (exemplo disto é o projeto Google Books) ajudando a preservar o conhecimento humano e tornando a informação mais acessível ao mundo. As páginas são copiadas e as imagens bitmaps resultantes são transformadas em arquivos de texto pelo processo de reconhecimento ótico de caractere (OCR). Luis von Ahn, Benjamin Maurer, Colin McMillen, David Abraham e Manuel Blum, afirmam que em impressões mais antigas, com tinta borrada e páginas amareladas, um OCR não consegue reconhecer cerca de 20% das palavras, enquanto humanos conseguem 99% de precisão no reconhecimento das mesmas palavras. As soluções humanas apresentadas pelo reCAPTCHA são usadas na melhoria do processo de digitalização de impressos antigos, como mostram os pesquisadores Luis von Ahn, Benjamin Maurer, Colin McMillen, David Abraham e Manuel Blum (2008): Nosso método, chamado de reCAPTCHA, é usado por mais de 40.000 sites e demonstra que materiais impressos antigos podem ser transcritos, palavra por palavra, por ter pessoas resolvendo CAPTCHAs em toda World Wide Web [...] As soluções inscritas pelos seres humanos são usadas para melhorar o processo de digitalização. Para aumentar a eficiência e segurança, apenas as palavras que os programas de OCR não conseguem reconhecer, são mandas para os humanos. Para atingir o objetivo de um CAPTCHA, além de diferenciar humanos de computadores, também é necessário validar a resposta. Para fazer isso, o reCAPTCHA aplica duas palavras Marcos de Paula Muniz Página: 4 Protegendo Formulários Web de Robôs em seu teste, uma desconhecia, extraída de um texto em que o OCR não conseguiu decifrar, e uma palavra de controle já conhecida, para determinar se o CAPTCHA foi respondido corretamente, como mostrado na Figura 1. Se fossem utilizadas apenas as palavras desconhecidas extraídas de textos, seria impossível o reCAPTCHA determinar se a digitação foi realizada por um humano ou um computador. Por outro lado, o fato de apenas uma das duas palavras ter que ser digitada corretamente é uma fraqueza do reCAPTCHA. Fig. 1. O sistema reCAPTCHA mostra palavras de textos escaneados para os humanos na World Wide Web. Para gerar as imagens do reCAPTCHA, uma página de um livro é escaneada e analisada por dois softwares de OCR diferentes, o resultado destas analises é então comparado por um algoritmo um com o outro e depois a um dicionário da língua inglesa. Cada palavra decifrada de forma diferente pelos dois softwares de OCR, ou que não forem encontradas no dicionário, são marcadas como suspeitas. Cada palavra marcada como suspeita é então coloca em uma imagem com outra palavra já conhecida. As duas palavras são distorcidas para garantir que nenhum software de OCR seja capaz de decifrá-las. A principal vantagem do reCAPTCHA é que como ele é gerado a partir de palavras escaneadas de livros que softwares de OCR não conseguem decifrar, os algoritmos de quebra de CAPTCHA atuais falham em 100% das vezes que tentam quebrá-lo, como afirmam L. von Marcos de Paula Muniz Página: 5 Protegendo Formulários Web de Robôs Ahn, B. Maurer, C. McMillen, D. Abraham e M. Blum em seu artigo Human-Based Character Recognition via Web Security Measures (2008). 4. Atacando um Formulário Desprotegido Para demonstrar como um formulário desprotegido pode ser facilmente atacado, iremos utilizar uma técnica de ataque chamada Spoofing HTTP Resquests (Falsificação de Requisições HTTP). Para demonstrar o ataque, considere o formulário hospedado em http://msoftware.com.br/captcha/noticia.php, contendo o conteúdo mostrado a seguir. Este formulário aparece no navegador de Internet (browser) como mostrado na Figura 2. <form action="envia_comentario.php" method="POST"> <p>Nome:<br /><input type="text" name="nome" ></p> <p>Comentário:<br /><textarea name="comentario" cols="40" rows="10" ></textarea></p> <input type="submit" value="Enviar" /> </form> Fig. 2. Formulário desprotegido. Marcos de Paula Muniz Página: 6 Protegendo Formulários Web de Robôs Se um usuário preencher o formulário colocando no nome o valor João, no comentário o valor “Parabéns pela notícia.” e em seguida clicar no botão Enviar, o browser enviará a seguinte requisição HTTP ao servidor: POST /captcha/envia_comentario.php HTTP/1.1 Host: msoftware.com.br User-Agent: Mozilla/5.0 (Windows NT 6.1) Referer: http://msoftware.com.br/captcha/noticia.php Content-Type: application/x-www-form-urlencoded Content-Length: 43 nome=João&comentario=Parabéns pela notícia. Ao modificar uma requisição HTTP um atacante passa a ter controle total sobre seu conteúdo, podendo facilmente se passar por um usuário real. Este é o principal motivo de não poder confiar cegamente nos dados enviados para formulários Web. Um atacante pode forjar uma requisição HTTP de forma muito simples, criando uma conexão telnet com o servidor remoto de destino na porta 80. Veja abaixo o exemplo de como uma requisição HTTP manual, realizada através de uma conexão telnet com o servidor remoto http://msoftware.com.br na porta 80, pode explorar facilmente a fragilidade do formulário do exemplo mostrado acima: $ telnet msoftware.com.br 80 Trying 187.45.193.169... Connected to msoftware.com.br (187.45.193.169). Escape character is '^]'. POST /captcha/envia_comentario.php HTTP/1.1 Host: msoftware.com.br User-Agent: Mozilla/5.0 (Windows NT 6.1) Referer: http://msoftware.com.br/captcha/noticia.php Content-Type: application/x-www-form-urlencoded Content-Length: 89 Marcos de Paula Muniz Página: 7 Protegendo Formulários Web de Robôs nome=Google Inc&comentario=Anúncie agora mesmo no <a href="http://bing.com">bing.com</a>. A requisição HTTP será enviada ao servidor ao inserir duas quebras de linhas (pressionar enter duas vezes), porque isto é o que indica o fim da requisição. Se tudo correr bem, o servidor remoto retornará o seguinte: HTTP/1.1 200 OK Date: Sun, 29 May 2011 19:10:12 GMT Server: Apache Content-Length: 0 Connection: close Content-Type: text/html Connection closed by foreign host. A tela do atacante ficará como mostrada na Figura 3. A página do formulário ficará como mostrada na Figura 4. Fig. 3. Tela do atacante após ataque bem sucedido ao formulário utilizado como exemplo. Marcos de Paula Muniz Página: 8 Protegendo Formulários Web de Robôs Fig. 4. Página do formulário após ataque bem sucedido. Chris Shiflett (2005), afirma que existem inúmeras outras formas de enviar informações diretamente para servidores Web remotos e que uma maneira mais prática de fazer isto é automatizar a requisição HTTP utilizando PHP para enviar centenas ou até milhares de requisições automaticamente. O fato é que como as requisições podem ser facilmente manipuladas, e as validações de dados não são suficientes para barrar este tipo de ataque, a melhor maneira de proteger os formulários Web é, além das validações triviais de dados, utilizarem também um CAPTCHA. 5. Ataques Contra CAPTCHAs Convencionais Para demonstrarmos como um CAPTCHA convencional pode ser quebrado utilizando um software de OCR, utilizamos o OCRopus para Linux, disponível para download no endereço http://code.google.com/p/ocropus/. O OCRopus é um software que foi desenvolvido com o objetivo principal de digitalizar livros. Nosso objetivo ao utilizar o OCRopus nesta Marcos de Paula Muniz Página: 9 Protegendo Formulários Web de Robôs demonstração é comprovarmos que alguns tipos de CAPTCHAs convencionais estão sujeitos a quebra por um simples software de OCR. Utilizamos três imagens de CAPTCHAs obtidas aleatoriamente na Internet. A Figura 5 é um tipo de CAPTCHA muito utilizado em serviços de Hotspot (serviço de acesso à Internet oferecido em um determinado local, geralmente público, através de rede sem fio), a Figura 8 é um tipo de CAPTCHA muito utilizado em blogs e fóruns na Internet e a Figura 10 apresenta o CAPTCHA utilizado pelo Gmail. Fig. 5. hotspot-captcha.png A Figura 6 mostra a utilização do OCRopus na tentativa de quebra do CAPTCHA da Figura 5, gerando o resultado no arquivo teste1.html. Fig. 6. Tentativa de quebra do CAPTCHA da Figura 5 utilizando OCRopus. A Figura 7 mostra o conteúdo do arquivo teste1.html, que é o resultado da execução do OCRopus na tentativa de quebra da Figura 5. O OCR identificou corretamente o texto do CAPTCHA. Marcos de Paula Muniz Página: 10 Protegendo Formulários Web de Robôs Fig. 7. Resultado da digitalização do CAPTCHA da Figura 5 com OCRopus. Fig. 8. Internet-captcha.jpg A Figura 9 mostra o resultado da execução do OCRopus na tentativa de quebra do CAPTCHA da Figura 8. Neste caso, o OCR reconheceu todas as letras do CAPTCHA, mas inseriu um espaço entre a segunda e terceira letra que pode ser ignorado automaticamente por um bot, já que os CAPTCHAs convencionais não utilizam espaços em seus testes. Fig. 9. Resultado da digitalização do CAPTCHA da Figura 8 com OCRopus. Fig. 10. Google-captcha.jpg Marcos de Paula Muniz Página: 11 Protegendo Formulários Web de Robôs A Figura 11 mostra o resultado da execução do OCRopus na tentativa de quebra do CAPTCHA da Figura 10. Note que neste caso, o OCR falhou. Fig. 11. Resultado da digitalização do CAPTCHA da Figura 10 com OCRopus. Como podemos ver, o OCRopus obteve 100% de sucesso no reconhecimento das Figuras 5 e 8, que apresentam um tipo de CAPTCHA convencional com pouca distorção, já no CAPTCHA da Figura 10, que possui distorções, fonte e distância entre as letras mais bem trabalhadas, o OCRopus não conseguiu reconhecer nenhuma letra. O OCRopus pode ser estendido pelo C++, como afirma o Web site que o disponibiliza para download, o que possibilita o desenvolvimento de um script que automatize o processo de quebra de CAPTCHAs convencionais que são sujeitos a ataques de OCR, como os utilizados nas Figuras 5 e 8. 6. Ataques Contra o reCAPTCHA Ataques de OCR no reCAPTCHA são inúteis, como mostrado no Web site do projeto de mesmo nome, pois os testes do reCAPTCHA são gerados para serem resistentes a este tipo de ataque. Abaixo mostramos que esta afirmação é verdadeira submetendo a imagem da Figura 12 de um teste reCAPTCHA ao OCRopus. Marcos de Paula Muniz Página: 12 Protegendo Formulários Web de Robôs Fig. 12. Imagem de um teste reCAPTCHA A Figura 13 mostra a utilização do OCRopus na tentativa de quebra do reCAPTCHA da Figura 12, gerando o resultado no arquivo teste4.html. Fig. 13. Tentativa de quebra do reCAPTCHA da Figura 12 utilizando OCRopus. A Figura 14 mostra o resultado da execução do OCRopus na tentativa de quebra do reCAPTCHA da Figura 12. Note que neste caso, o OCR também falhou. Fig. 14. Resultado da digitalização do reCAPTCHA da Figura 12 com OCRopus. L. von Ahn, B. Maurer, C. McMillen, D. Abraham e M. Blum afirmam em seu artigo “Human-Based Character Recognition via Web Security Measures” (2008), que como o reCAPTCHA é gerado a partir de palavras escaneadas de livros que softwares de OCR não Marcos de Paula Muniz Página: 13 Protegendo Formulários Web de Robôs conseguem decifrar, os algoritmos de quebra de CAPTCHA atuais falham em 100% das vezes que tentam quebrá-lo. Porém, Jonathan Wilkins (2009), afirma ter obtido uma taxa de sucesso de 5% em um ataque realizado a 200 variações do reCAPTCHA, mesclando técnicas de fragmentação e segmentação de palavras, ataques de OCR e de dicionários. Ainda segundo ele, as duas maiores fraquezas do sistema reCAPTCHA são a não obrigatoriedade da digitação correta das duas palavras do teste CAPTCHA, apenas a palavra de controle deve ser digitada corretamente, e a utilização de textos em inglês, o que viabiliza a validação e classificação dos resultados obtidos pelos softwares de OCR em dicionários da língua inglesa. Certamente podemos esperar melhorais no reCAPTCHA nos próximos anos. Uma melhoria que recomendamos é a obrigatoriedade de se digitar corretamente as duas palavras. A palavra não identificada nas digitalizações de livros antigos deve passar por uma análise humana. O reCAPTCHA deve de alguma forma armazenar o resultado desta análise para posterior comparação com o texto digitado pelo usuário e assim garantir a obrigatoriedade da digitação das duas palavras corretamente reconhecidas por seres humanos e não pelos OCR. Neste momento, ele ainda é uma boa forma de proteger formulários eletrônicos de robôs na Internet. 7. Obtendo e Utilizando o reCAPTCHA Para utilizar o reCAPTCHA é necessário acessar o site do projeto em http://www.google.com/recaptcha clicar no link “GET reCAPTCHA” e efetuar login com um e-mail que seja conta Google. Feito isso, será necessário cadastrar o domínio onde deseja utilizar o reCAPTCHA e clicar no botão “Create Key”. Pronto, agora você receberá um par de chaves pública e privada para utilizar o reCAPTCHA no domínio cadastrado. Se você desejar utilizar o mesmo par de chaves em vários domínios, você deve selecionar a caixa “Enable this key on all domains (global key)” na hora de cadastrar o domínio. Para instalar o reCAPTCHA no Web site, será necessário fazer download da biblioteca do reCAPTCHA, vamos mostrar abaixo como utilizar o reCAPTCHA no PHP. Marcos de Paula Muniz Página: 14 Protegendo Formulários Web de Robôs Faça download da biblioteca recaptchalib.php que se encontra http://code.google.com/p/recaptcha/downloads/list?q=label:phplib-Latest, no endereço depois basta adicionar o seguinte código no formulário: require_once('recaptchalib.php'); $publickey = "sua_chave_pública"; echo recaptcha_get_html($publickey); Para validar se o reCAPTCHA foi digitado corretamente, adicione a seguinte validação no arquivo alvo (target) do formulário: <?php require_once('recaptchalib.php'); $privatekey = "sua_chave_privada"; $resp = recaptcha_check_answer ($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]); if (!$resp->is_valid) { // O que acontece quando o CAPTCHA for digitado incorretamente. die ("O reCAPTCHA foi digitado incorretamente! Tente novamente. Erro: " . $resp->error ); } else { // Código a ser executado quando o CAPTCHA for digitado corretamente. } ?> Feito isto, o reCAPTCHA estará funcionando corretamente em seu Web site. 8. Conclusões Neste artigo vimos que o reCAPTCHA é um bom mecanismo de proteção para formulários Web, que além de barrar os spammers ainda contribui com a digitalização de livros antigos. Mostramos como é fácil para um atacante gerar entradas maliciosas para inputs em formulários Web através do ataque de Spoofing HTTP Resquests. Ficou claro para nós que a utilização de um CAPTCHA como proteção para um formulário fortalece o mesmo contra os ataques do tipo Spoofing HTTP Resquests, já que ao utilizar um Marcos de Paula Muniz Página: 15 Protegendo Formulários Web de Robôs CAPTCHA, os dados enviados pelo formulário só serão considerados válidos caso o CAPTCHA seja respondido corretamente. O artigo mostrou também que apesar das fraquezas identificadas no reCAPTCHA, os ataques atuais não conseguem passar de 5% de sucesso. Assim podemos dizer que a tecnologia utilizada pelo reCAPTCHA para geração de suas imagens CAPTCHAs inviabilizam a maioria dos bots de preenchimento automático de formulário. Ao gerar apenas testes CAPTCHAs que programas de OCR sozinhos não consigam resolver, tornando os formulários mais seguros contra ataques automáticos. Acreditamos que o objetivo principal deste trabalho foi atingido, apresentar o reCAPTCHA como solução de segurança recomendada para proteção de formulários Web contra ataques de preenchimento automático. Marcos de Paula Muniz Página: 16 Protegendo Formulários Web de Robôs 9. Referências 1 Alan M. Turing. Computing Machinery and Intelligence. In: Mind, V59, No236, p. 433-460, 1950. 2 J. Langford, L. von Ahn, M. Blum and N. Hopper. The CAPTCHA Project. http://www.captcha.net 3 J. Langford, L. von Ahn and M. Blum: Telling Humans and Computer Apart Automatically, CACM, V47, No2, 2004. 4 J. Yan and A. S. El Ahmad. A Low-cost Attack on a Microsoft CAPTCHA: School of Computing Science Technical Report, Newcastle University, England, 2008. 5 L. von Ahn, B. Maurer, C. McMillen, D. Abraham and M. Blum: Human-Based Character Recognition via Web Security Measures: Science, V.321, 2008. <Disponível em: http://www.google.com/recaptcha/static/reCAPTCHA_Science.pdf>. 6 LUSTOSA, Bruno: Segurança ao enviar email. <Disponível http://www.revistaphp.com.br/artigo.php?id=66>. Acesso me 12/06/2011. em: 7 Monica Chew, J. D. Tygar: Image Recognition CAPTCHAs: International Information Security Conference, 2004. 8 MOREIRA, Márcio: MINIMIZANDO OS SPAMS COM O USO DE E-MAILS SEGUROS: Faculdade de Ciências Aplicadas de Minas Gerais da União Educacional Minas Gerais, Uniminas, Brasil, 2007. 9 SHIFLETT, Chris: Essential PHP Security: O’Reilly Media, 2005. 10 WILKINS, Jonathan: Strong CAPTCHA Guidelines http://bitland.net/captcha.pdf>. Acesso em 28/06/2011. Marcos de Paula Muniz v1.2. <Disponível Página: 17 em: