- Aborde le problème des bots de scraping qui sursollicitent des sites web publics au point de se comporter comme un DDoS, et propose une approche expérimentale consistant à retourner la situation pour leur faire perdre du temps
- Création d’un générateur de texte basé sur des chaînes de Markov pour produire de fausses données ressemblant à des fichiers
.php, afin d’inciter les bots malveillants à les télécharger
- Mise en place ensuite d’un serveur de contenu statique fournissant aléatoirement des paragraphes du roman Frankenstein, avec une structure de liens conçue pour provoquer une propagation explosive du crawler
- Ajout sur toutes les pages des attributs
noindex, nofollow et d’un compteur de requêtes pour exclure les moteurs de recherche légitimes et ne capter que les bots qui enfreignent les règles
- Les résultats de l’expérience étaient intéressants, mais le risque de faux positifs avec Googlebot a conduit à ne pas l’appliquer à un service réel et à conserver le projet pour l’apprentissage et l’expérimentation
Le problème des bots de scraping et une idée de riposte
- Les scrapers provoquent parfois involontairement une charge de niveau DDoS sur de petits sites web
- Certains administrateurs ont demandé des moyens de protection, mais cet article se concentre sur « non pas la défense, mais la contre-attaque »
- Après avoir vu un autre développeur tromper des bots avec des données factices infinies générées par chaînes de Markov, l’auteur a lancé sa propre expérimentation
Générateur de faux PHP basé sur des chaînes de Markov
- Implémentation en Rust d’un apprenant par chaînes de Markov pour générer un contenu réaliste à partir de données textuelles arbitraires
- Cible les bots malveillants qui visent des chemins sensibles comme
.env, .aws ou .php, en leur servant du code PHP qui semble réel mais ne signifie rien
- Augmentation de la taille des fichiers de 2 KB à 10 MB pour pousser les bots à gaspiller leurs ressources
- Les exemples de sortie prennent la forme d’un faux code PHP crédible, mêlant noms de fonctions WordPress et commentaires
- L’objectif est de faire perdre du temps et des ressources aux bots, tout en poussant l’attaquant à gaspiller du temps à chercher de vraies vulnérabilités
Efficacité et expérimentation autour d’un contenu statique
- Sur un VPS, servir des fichiers de plus de 1 MB a entraîné une hausse de la latence et de la charge serveur
- Pour résoudre ce problème, création d’un « garbage server » sous forme de site statique
- Le roman Frankenstein entier est chargé en mémoire, puis 4 paragraphes aléatoires sont renvoyés à chaque requête
- 5 liens sont ajoutés en bas de chaque page pour déclencher une expansion explosive du crawling (croissance par 5)
- Le résultat est visible sur https://herm.app/babbler/
Détails de conception et mode d’exploitation
- Le roman choisi est dans le domaine public ; il a été retenu en raison de la période d’Halloween et du parallèle entre l’IA et Frankenstein
- Toutes les pages reçoivent les attributs
noindex,nofollow pour ne capter que les bots qui enfreignent les règles
- Un compteur du nombre de requêtes est affiché en bas de chaque page ; comme il est basé sur la mémoire, il se réinitialise au redéploiement
- Un serveur distinct pour les requêtes
.php a aussi été configuré afin de fournir aléatoirement de vrais fichiers PHP depuis la mémoire
- Le projet est résumé par la formule : « Garbage for the garbage king! »
Risques et limites
- Ce système présente, s’il est appliqué à un vrai service, un risque de faux positifs avec les moteurs de recherche
- Si Googlebot explore un mauvais endpoint, le site pourrait être classé comme spam
- Cela peut entraîner une baisse de visibilité dans les résultats de recherche ou l’affichage d’avertissements dans Chrome
- En conséquence, la méthode est déconseillée pour les sites dépendants du référencement et n’est maintenue que comme projet expérimental
- Le babbler pour
.php n’étant pas du HTML, il n’a aucun impact sur Googlebot et ne vise que les bots malveillants
Conclusion et avis personnel
- Ajout sur le blog de liens cachés (
rel="nofollow") pour attirer les scrapers malveillants
- En cas de dépassement du quota de trafic du VPS, l’usage du cache Cloudflare est envisagé
- Le projet a servi à apprendre le fonctionnement des chaînes de Markov et des bots, dans une expérimentation mêlant amusement et agacement
- En conclusion, tout n’a pas besoin d’être pratique, et parfois le simple plaisir suffit
1 commentaires
Avis Hacker News
Le monde change, mais on finit toujours par rencontrer les mêmes problèmes
Il y a 10 à 15 ans, je me battais déjà contre des services de veille des réseaux sociaux. De grandes marques les payaient pour surveiller le sentiment sur les forums, et ils pillaient sans autorisation la communauté gratuite que j’administrais, en surchargeant le serveur
Même en bloquant leurs bots, ils revenaient en changeant d’IP et d’UA, donc j’ai créé un filtre qui insérait aléatoirement des noms de marques dans les messages afin de ruiner la qualité de leurs données. Deux jours après l’activation de cette mesure, le scraping s’était complètement arrêté
Ces bots ne parsèment pas réellement les fichiers PHP ; ils s’en servent pour faire du fingerprinting de détection de vulnérabilités. Ils regardent simplement le code de réponse avant de passer à autre chose
J’ai récemment entendu parler des tarpits pour l’IA et les scrapeurs. Le principe consiste à ne jamais couper la connexion et à faire couler des données infinies très lentement. L’outil Nepenthes m’intrigue et j’aimerais bien l’essayer
Autrefois, sur HN, on se faisait critiquer si on bloquait les scrapeurs. La logique était : « peu importe la manière dont j’accède au site »
Si vous administrez directement un serveur Apache, vous pouvez bloquer immédiatement les requêtes PHP avec RewriteEngine
Mon serveur n’a pas de PHP, donc toutes ces requêtes sont malveillantes
La plupart des scrapeurs agressifs visent surtout les vulnérabilités WordPress. Ils ne cherchent pas tant le fichier PHP lui-même que sa sortie. Ce genre de configuration ressemble davantage à un honeypot, mais si le bot ne suit pas le script prévu, il s’en va simplement
J’avais déjà posté sur HN une stratégie de zipbomb, et le trafic avait explosé jusqu’à 100 000 requêtes en une journée. Impossible à encaisser sur un VPS à 6 $. Aujourd’hui, je ne réponds par zipbomb qu’aux bots les plus agressifs, et je renvoie 403 aux autres. La nouvelle stratégie fonctionne bien, mais j’hésite à la rendre publique à nouveau. Référence : billet précédent
Avant, je n’utilisais que fail2ban, mais je voulais mettre au point une défense un peu plus amusante
Dans
.htaccess, je redirige les chemins suspects (/.git,/wp-login) versdecoy.php, et je force ensuite le téléchargement d’un decoy.zip de 10 Go.decoy.phpressemble au fichier sensible demandé, mais en réalité il diffuse à l’infini de faux logs et de fausses données SQL pour garder le bot occupéCes bots ne récupèrent pas des fichiers PHP ; ils cherchent des vulnérabilités de framework. Si on leur donne une réponse inattendue, ils abandonnent immédiatement et passent à une autre cible
Parfois je me dis : ne pourrait-on pas utiliser les ressources qu’ils gaspillent pour miner de la cryptomonnaie ?