- Aborda o problema de bots de scraping que fazem solicitações excessivas a sites públicos e acabam agindo como um DDoS, e apresenta uma abordagem experimental para virar o jogo e fazê-los perder tempo
- Foi criado um gerador de texto baseado em cadeias de Markov para gerar dados falsos que parecem arquivos
.php, induzindo bots maliciosos a baixá-los
- Depois, foi montado um servidor de conteúdo estático que fornece aleatoriamente parágrafos do romance Frankenstein, com uma estrutura de links projetada para fazer os crawlers se espalharem de forma explosiva
- Todas as páginas receberam os atributos
noindex, nofollow e um contador de requisições, excluindo mecanismos de busca legítimos e capturando apenas bots que ignoram as regras
- Os resultados do experimento foram interessantes, mas, por conta do risco de falso positivo com o Googlebot, ele não foi aplicado em serviço real e segue apenas como projeto de estudo e experimentação
O problema dos bots de scraping e uma ideia de resposta
- Scrapers acabam causando, sem querer, carga em nível de DDoS em sites pequenos
- Alguns administradores perguntaram sobre formas de proteção, mas este texto foca em “contra-atacar em vez de defender”
- Depois de ver outro desenvolvedor enganando bots com dados falsos infinitos gerados por cadeias de Markov, o autor resolveu fazer seu próprio experimento
Gerador falso de PHP baseado em cadeias de Markov
- Foi implementado em Rust um treinador de cadeias de Markov para gerar conteúdo realista a partir de dados de texto arbitrários
- Mirando bots maliciosos que procuram caminhos vulneráveis como
.env, .aws e .php, o sistema entrega código PHP falso que parece real, mas não significa nada
- O tamanho dos arquivos foi ampliado de 2 KB até 10 MB para forçar desperdício de recursos dos bots
- A saída de exemplo assume a forma de código PHP falso convincente, misturando nomes de funções do WordPress e comentários
- O objetivo é desperdiçar tempo e recursos dos bots, além de fazer atacantes perderem tempo procurando vulnerabilidades reais
Eficiência e experimento com entrega de dados estáticos
- Ao servir arquivos acima de 1 MB em uma VPS, surgiram aumento de latência e maior carga no servidor
- Para resolver isso, foi criado um “garbage server” em formato de site estático
- O romance completo Frankenstein é carregado em memória, e a cada requisição são retornados 4 parágrafos aleatórios
- No rodapé de cada página são adicionados 5 links para induzir uma expansão explosiva do crawling (crescimento de 5x)
- O resultado pode ser visto em https://herm.app/babbler/
Detalhes de projeto e modo de operação
- O romance escolhido está em domínio público e foi usado tanto por ter sido um trabalho feito na época do Halloween quanto pela semelhança entre IA e Frankenstein
- Todas as páginas recebem a diretiva
noindex,nofollow para capturar apenas bots que ignoram as regras
- No rodapé de cada página há um contador de número de requisições, que é reiniciado a cada nova implantação por ser mantido em memória
- Também foi configurado um servidor separado para requisições
.php, que fornece aleatoriamente arquivos PHP reais a partir da memória
- O projeto é resumido pela frase: “Garbage for the garbage king!”
Riscos e limitações
- Esse sistema traz risco de falso positivo com mecanismos de busca se for aplicado em um serviço real
- Se o Googlebot rastrear endpoints errados, o site pode ser classificado como spam
- Isso pode levar à queda de visibilidade em buscas ou até avisos no Chrome
- Por isso, não é recomendado para sites que dependem de busca, sendo mantido apenas como projeto experimental
- O babbler para
.php não é HTML, então não há impacto sobre o Googlebot, atingindo apenas bots maliciosos
Encerramento e conclusão pessoal
- Para atrair scrapers maliciosos, foram adicionados ao blog links ocultos (
rel="nofollow")
- Se a franquia de tráfego da VPS estourar, o uso do cache da Cloudflare será considerado
- O projeto serviu para aprender sobre cadeias de Markov e o funcionamento dos bots, em um experimento movido por diversão e frustração ao mesmo tempo
- Em resumo, nem toda tentativa precisa ser prática; às vezes, se for divertido, já basta
1 comentários
Opiniões do Hacker News
O mundo muda, mas no fim acabamos enfrentando problemas parecidos
Há 10~15 anos eu estava brigando com serviços de monitoramento de redes sociais. Grandes marcas pagavam esses serviços para monitorar o sentimento em fóruns, e eles raspavam sem permissão a comunidade gratuita que eu mantinha, causando carga no servidor
Mesmo bloqueando os bots, eles voltavam trocando IP e UA, então criei um filtro que inseria nomes de marcas aleatórios nas postagens para arruinar a qualidade dos dados deles. Dois dias depois de ativar isso, o scraping parou completamente
Accept-Language. Configurei o nginx para retornar 403, e o tráfego começou a cairEsses bots não estão realmente fazendo parse de arquivos PHP; eles criam uma impressão digital (fingerprinting) para detectar vulnerabilidades com base na existência deles. Olham o código de resposta e descartam logo em seguida
Recentemente ouvi falar de tarpits para AI e scrapers. A ideia é não encerrar a conexão e ficar enviando dados infinitos bem devagar. A ferramenta Nepenthes parece interessante e queria testar
Antigamente, no HN, se você bloqueasse scrapers era criticado. A lógica era: “não importa como eu acesso”
Se você administra diretamente um servidor Apache, pode bloquear requisições PHP na hora com RewriteEngine
No meu servidor não existe PHP, então esse tipo de requisição é totalmente malicioso
A maioria dos scrapers agressivos mira em vulnerabilidades do WordPress. Eles querem o resultado de saída mais do que o arquivo PHP em si. Esse tipo de configuração fica mais para um honeypot, mas se o bot não se comportar como o script espera, ele simplesmente vai embora
Uma vez publiquei no HN a estratégia do zipbomb, e o tráfego explodiu para 100 mil acessos por dia. Um VPS de US$ 6 não aguentava. Hoje respondo com zipbomb só aos bots mais agressivos, e para o resto devolvo 403. A nova estratégia funciona bem, mas ainda penso se devo torná-la pública de novo. Referência: post anterior
Antes eu usava só fail2ban, mas queria montar uma defesa mais divertida
No
.htaccess, redirecionei caminhos suspeitos (/.git,/wp-login) paradecoy.phpe forcei o download de um decoy.zip de 10 GB.O
decoy.phpparece o arquivo sensível solicitado, mas na prática faz streaming infinito de logs falsos e dados SQL falsos para manter o bot ocupadoEsses bots não estão raspando arquivos PHP; estão procurando vulnerabilidades de framework. Se você devolver uma resposta inesperada, eles desistem na hora e passam para outro alvo
Às vezes penso nisso — será que não daria para fazer os bots minerarem criptomoedas com os recursos que desperdiçam?