Attaques de robots: vous n’êtes pas seul…
Fabian Piau | mardi 20 avril 2021 - 16:42J’ai publié cet article pour la première fois sur le blog tech d’Expedia Group sur Medium (en anglais): Bot Attacks: You are not alone…
Dans un article récent, Security Magazine a déclaré que 1,3 milliard attaques de robots ont été détectées au troisième trimestre 2020. Ce n’est pas une surprise. Nous ne sommes pas seuls. Vous n’êtes pas seul.
L’année dernière, l’équipe Opex Excellence d’Expedia Group a passé en revue tous les incidents survenus en production ayant impacté le site Hotels.com. Nous avons couvert une période de 12 mois et nous avons identifié les attaques de robots comme étant l’une des menaces les plus importantes.
Anything that can go wrong will go wrong — Murphy’s law
Dans cet article, je vais définir et expliquer ce que sont les robots et les attaques de robots. J’espère que cela vous permettra d’acquérir des connaissances pour mieux comprendre cette menace qui plane sur votre site web, afin que vous puissiez mettre en place un ensemble de stratégies et solutions pour prévenir et atténuer l’impact d’une attaque si vous y êtes confronté.
Know the enemy and know yourself, in a hundred battles you will never be in peril — Sun Tzu, The Art of War
Qu’est ce qu’une attaque de robots?
Le premier type d’attaque de robots qui vient généralement à l’esprit est l’attaque de type déni de service (Denial of Service – DoS) ou DDoS (lorsqu’elle est distribuée). Une attaque DDoS affecte généralement l’ensemble du site, les erreurs se produisant en cascade, rendant le site indisponible. L’attaquant envoie un grand nombre de requêtes (par exemple, en effectuant simultanément une énorme quantité de requêtes GET / POST sur des URLs aléatoires) afin de surcharger les services sous-jacents à tel point qu’ils ne peuvent plus gérer le trafic. Les services commencent à répondre aux requêtes avec des réponses en timeout ou en erreur. Evidemment, cela affecte également les requêtes venant de clients légitimes – dans notre cas, des clients qui tentent de réserver leur séjour à l’hôtel.
Un autre type d’attaque, légèrement plus ciblé, est une attaque de type scraping. Un robot d’exploration (crawler) peut scanner différentes pages afin d’extraire des informations spécifiques. Ceci est également connu sous le nom de data scraping. Ces robots ciblent généralement vos données d’inventaire, par exemple tous les détails des hôtels avec les informations de contact, ou les différents prix pour des dates spécifiques. Parfois, il peut même s’agir de l’intégralité du contenu de certaines pages de votre site web, afin de les reproduire à l’identique pour préparer une attaque de phishing.
ℹ️ Dans l’idéal, l’attaquant ne veut pas être vu quand il scanne et récupère des informations. Bien souvent, il essaiera de dissimuler ses traces en attaquant sur une plus longue durée, par exemple sur plusieurs jours pour éviter une augmentation du trafic soudaine qui pourrait déclencher une alerte et une investigation du côté de la victime. A moins que l’attaque ne soit sophistiquée et ne provienne de différentes machines, elle est en général assez facile à identifier lorsqu’il y a un nombre anormalement élevé de requêtes provenant de la même adresse IP (ou plage d’adresses IP) au niveau Edge. Je donnerai plus de détails sur le niveau Edge dans la partie suivante.
Si les attaques de type DoS et scraping ont une portée étendue, dans le sens où elles s’attaquent à des pans entiers du site, nous constatons également des attaques chirurgicales ciblant des pages et fonctionnalités spécifiques.
Les attaques spécialisées sont bien plus précises et ciblent généralement une page ou une fonctionnalité spécifique de votre site. Voici quelques cas réels auxquels nous avons été confrontés:
- Une attaque sur la page de réservation, lorsque l’attaquant tente de trouver des coupons en générant et en essayant plusieurs codes, en espérant pouvoir trouver et exploiter un pattern. Cette attaque utilise la force brute.
- Une attaque sur la page de connexion, lorsque l’attaquant tente plusieurs combinaisons de login et de mot de passe. L’idée est d’avoir accès aux comptes utilisateurs et aux données confidentielles, ou ce que nous appelons Account Take Over (ATO). Cela utilise également la force brute.
- Une attaque sur la page de l’application mobile, lorsque l’attaquant tente d’envoyer un grand nombre de SMS à des numéros de téléphone aléatoires ou faux. Il est assez courant de nos jours d’inviter les utilisateurs à télécharger une application sur leur appareil mobile en envoyant un SMS contenant le lien vers l’application sur l’App Store. Le site web ciblé finira par payer de l’argent, car le service de messagerie est généralement géré par un fournisseur tiers et chaque SMS envoyé a un coût.
Générale ou spécifique, une attaque peut être basique ou sophistiquée. Un exemple d’attaque basique est une personne qui essaie désespérément de trouver un code de réduction en envoyant des dizaines de requêtes à un service de coupons. Les attaques de base sont difficiles à repérer, mais faciles à bloquer: vous pouvez bloquer l’adresse IP avec une règle WAF (Web Application Firewall). Le risque reste faible.
Et il y a les attaques sophistiquées, elles peuvent être distribuées et étendues sur des milliers de machines situées dans différents pays et utilisant des technologies de script avancées, comme un navigateur headless. Le niveau d’impact et de risque est beaucoup plus élevé, mais ils sont évidemment plus faciles à repérer comme elles sont associées à une montée en charge soudaine du trafic.
Doit-on bloquer tous les robots?
Evidemment non! Tous les robots ne sont pas mauvais, certains sont même bienveillants.
- Il existe les robots d’exploration (spider et crawler bots) des moteurs de recherche populaires tels que Google Search ou Microsoft Bing. Si vous les bloquez, l’indexation du site sera fortement impactée, le trafic légitime se dégradera avec le temps et la popularité du site diminuera.
- Il existe également les robots commerciaux (ad bots, par exemple, le robot Google AdSense), pour proposer des publicités personnalisées aux utilisateurs, y compris les publicités pour votre propre site.
- Il y a les robots de données (data bots) comme les agrégateurs de contenu et de flux, et il y a aussi le robot archiveur qui construit la plus grande archive Internet.
- Il existe aussi les robots de copyright, qui traquent plagiat et vol de propriété intellectuelle. Vous avez peut-être rencontré l’un d’entre eux si vous avez essayé d’uploader une vidéo sur YouTube avec votre musique préférée en arrière-plan. Vous réalisez alors rapidement que Google l’a supprimée, en vous rappelant poliment que vous ne pouvez utiliser aucun contenu protégé.
- Il existe également des robots de surveillance pour vous assurer que votre site est en bonne santé et vous signaler quand ce n’est pas le cas. Par exemple, Akamai, Datadog, etc. utilisent des robots pour s’assurer que votre site répond correctement.
ℹ️ Vous ne devez bloquer aucun de ces robots, car ils ne sont pas mauvais, et généralement ils ne sont pas agressifs, et en plus ils contribuent à Internet. Néanmoins, si vous pensez que votre trafic légitime en souffre, au lieu de les bloquer, il est préférable de mettre en place une stratégie de limitation de débit pour atténuer leur impact. Plus de détails à ce sujet dans la partie suivante à propos du niveau Edge.
Si tous ces robots sont des tiers, vous pouvez parfois avoir votre propre robot. Dans notre cas, un robot interne vérifie régulièrement les pages de destination pour s’assurer qu’il n’y a pas de liens morts ou de redirections inutiles. Nous ne voulons donc certainement pas le bloquer!
Que faire contre les attaques?
Nous pouvons empêcher les attaques au niveau Edge et les atténuer au niveau Applicatif.
Utilisation du fichier robots.txt
La première chose qui peut vous venir à l’esprit lorsque vous souhaitez manipuler des robots est le fichier robots.txt. Il est présent sur chaque site web et il existe depuis des lustres. Il s’agit d’un fichier texte accessible publiquement à la racine de votre site. Il spécifie les règles pour tous les robots accédant à votre site. Ces règles définissent les pages que les robots peuvent et ne peuvent pas explorer, et quels liens ils doivent et ne doivent pas suivre.
Les robots bienveillants suivront ces règles. Par exemple, si un propriétaire de site web ne souhaite pas qu’une certaine page de son site apparaisse dans les résultats de recherche Google, il peut écrire une règle pour celle-ci, et le robot d’exploration de Google n’indexera pas cette page. Bien que le fichier robots.txt ne puisse pas appliquer ces règles lui-même, les robots bienveillants sont programmés pour rechercher ce fichier et suivre les règles avant de faire quoi que ce soit d’autre. Cela se base sur un code d’honneur en quelque sorte.
Les mauvais robots malveillants ne suivront évidemment aucune de vos règles. Au contraire, ils le liront souvent pour savoir quel contenu un site tente de leur interdire, puis accéderont à ce contenu. Ainsi, la gestion des robots nécessite une approche plus active que la simple définition des règles de comportement des robots dans le fichier robots.txt. C’est ce que nous allons voir dans la partie suivante.
ℹ️ Le fichier robots.txt peut également être utilisé comme un piège, en exposant un leurre qui permet d’exposer les robots malveillants. Le leurre peut être une page du site interdite aux robots par le fichier robots.txt. Les robots bienveillants liront le fichier robots.txt et éviteront cette page, alors que les mauvais robots exploreront cette page. En suivant les informations des robots qui accèdent à cette page piégée, les robots malveillants peuvent être identifiés et bloqués. Source: Cloudflare
Gestion avancée des robots
Le principal rempart contre les mauvais robots est la gestion des robots au niveau Edge. Cette défense est beaucoup plus avancée que le fichier robots.txt. J’ai pris cette liste sur Cloudflare mais les fonctionnalités seront similaires pour tout autre outil Edge:
- Différencie les robots par rapport aux visiteurs humains (à l’aide de l’analyse comportementale et potentiellement de l’apprentissage automatique)
- Calcule la réputation des robots
- Identifie les adresses IP d’origine des robots et les bloque en fonction de la réputation IP
- Analyse le comportement des robots
- Ajoute les robots bienveillants aux listes d’autorisation
- Ajoute les robots malveillants aux listes de blocage
- Challenge les robots potentiels via un test CAPTCHA, une injection JavaScript ou d’autres méthodes
- Limite le taux de requêtes d’un robot potentiel sur-utilisant un service
- Ralentit les requêtes de robot, également connu sous le nom de ‘Tarpitting’ (voir la définition ci-dessous)
- Refuse l’accès à certains contenus ou ressource pour les robots malveillants
- Diffuse du contenu alternatif ou mis en cache aux robots
ℹ️ ‘Tarpitting’ est une fonctionnalité intéressante. Cela signifie ajouter un délai artificiel à la requête. C’est généralement bien plus efficace que le blocage, car le robot ne saura pas qu’il a été découvert, mais l’attaque ralentira considérablement car moins de requêtes atteindront le niveau Applicatif, car elles pourraient expirer au niveau Edge. La limitation de débit peut également être une autre bonne stratégie que vous voudriez peut-être envisager.
Lorsque vous choisissez un gestionnaire de robot avancé, vous pouvez utiliser un fournisseur tiers populaire tel que Akamai ou Cloudflare.
Pros
- Aucun impact sur le code de l’application.
- Une règle de robot est relativement rapide à déployer avec un effet immédiat.
Cons
- La plupart des inconvénients résident dans le fait que ce sont des outils tiers.
- Il y a un coût de licence.
- Les règles de robot ne peuvent être définies que par rapport à des paramètres génériques tels que le user-agent, l’adresse IP, l’URL, etc.
- Ils impliquent parfois un processus d’approbation lourd, par ex. l’ajout d’une nouvelle règle nécessitera des personnes extérieures à l’entreprise ainsi que des personnes internes disposant d’une autorisation spéciale.
- Une nouvelle règle peut avoir des effets secondaires. A moins de bloquer une adresse IP unique, il est très difficile d’être sûr que cela ne bloquera aucun trafic légitime.
- La gestion des règles peut être fastidieuse au fil du temps.
- Accès et visibilité partiels pour les équipes applicatives.
La plupart des inconvénients peuvent être contournés si vous utilisez votre propre outil Edge interne. C’est particulièrement intéressant lorsqu’il est utilisé en supplément d’un outil Edge tiers. C’est un investissement lourd et toutes les entreprises ne pourront pas se le permettre, mais cela donnera beaucoup plus de flexibilité et ouvrira des possibilités.
- Possibilité de définir des règles fonctionnelles liées à votre business.
- Possibilité d’ajouter une règle temporaire ponctuelle pour atténuer une attaque que vous pouvez supprimer peu de temps après la fin de l’attaque.
- Possibilité de centraliser la surveillance Edge et de mettre les informations à la disposition de chaque équipe.
Hiérarchisation du trafic
L’idée ici n’est pas de remplacer votre outil Edge principal, mais d’ajouter une logique de priorisation des robots après ce premier rempart. Un tel outil agira comme une file d’attente de hiérarchisation afin que les requêtes de robot à faible valeur soient dépriorisées en faveur des requêtes d’utilisateurs réels qui ont une valeur commerciale plus élevée, avec une réservation potentielle dans notre cas.
Requêtes des utilisateurs > Requêtes des robots internes > Requêtes des robots bienveillants externes
ℹ️ Netflix applique des concepts similaires que vous pouvez lire dans Keeping Netflix Reliable Using Prioritized Load Shedding (en anglais).
Mise en cache
Nous avons parlé de gestion de robot, mais il y a autre chose que la couche Edge peut vous fournir, à savoir la possibilité de mettre en cache le contenu. Nous référons généralement cela à un Content Delivery Network (CDN). L’idée est de proposer des pages mises en cache aux robots bienveillants plutôt que de générer de nouvelles pages.
Nous avons fait des expérimentations l’année dernière et cela a considérablement réduit le trafic vers certains de nos services Backend sans affecter le référencement du site. Cette année, nous cherchons à généraliser cette approche.
Atténuation au niveau applicatif
La gestion des robots au niveau de l’application signifie qu’une attaque de robots a pu passer entre les mailles du filet au-delà du niveau de protection supérieur fourni par l’Edge.
Les solutions dont nous disposons à ce niveau ne sont que des solutions d’atténuation afin d’être proactif et de réduire au maximum les conséquences d’une attaque.
Malheureusement nous savons que cela va arriver tôt ou tard, et même plusieurs fois, nous devons donc nous y préparer. Heureusement, ce que nous savons, c’est que les attaques de robots ne durent pas éternellement. Une attaque sophistiquée coûte une quantité importante de ressources à l’attaquant, et comme les ressources coûtent de l’argent. Tant que nous faisons en sorte que l’attaquant dépense plus de valeur qu’il n’en obtient, nous sommes certains que l’attaque se stoppera d’elle-même.
Il y a différentes actions que nous pouvons entreprendre, pour la plupart il s’agit de bonnes pratiques…
- Tout d’abord, lors du coding de l’application, il faut éviter d’avoir un code de grande complexité, de bloquer des threads, etc. Une bonne idée est de séparer les ports d’application et de gestion. Si vous utilisez le même port, en cas d’attaque de robots, le service sera tellement surchargé qu’il ne pourra pas répondre aux healthchecks et votre plate-forme d’infrastructure pensera que le service est défectueux. Même si cela ne résout pas tous vos problèmes, le fait d’avoir un port distinct peut atténuer ce problème.
- Avoir un état d’esprit chaotique (chaos engineering) est important. Pour les services critiques, assurez-vous d’avoir des tests de charge et de stress en place dans votre pipeline. Cela permet de garantir que vos services sont suffisamment résilients et que vous avez identifié des fuites de mémoire potentielles dans votre code, des goulots d’étranglement atteignant les services en aval ou les sources de données. En cas de problème, vous souhaitez toujours fournir une réponse dégradée pour atténuer l’impact sur le client. Vous pouvez également mettre en place un mécanisme de mise en cache.
- Assurez-vous de tirer parti de votre infrastructure. Si vous utilisez Kubernetes, vous pouvez jeter un oeil à l’autoscaling. Soyez vigilant lorsque vous l’activez. Assurez-vous que la configuration du service est bien pensée et conforme à ses dépendances. En effet, configurer un nombre élevé de pods et considérer le travail terminé sera une erreur, car vous partagerez également la charge avec vos dépendances en aval et, si elles ne sont pas préparées pour cela, vous déplacerez fondamentalement le goulot d’étranglement plus profondément dans la pile sans le résoudre. Cela peut également vous coûter plus cher si votre infrastructure est hébergée sur un fournisseur de cloud comme AWS. Assurez-vous également que vos pods sont prêts à recevoir du trafic une fois qu’ils sont exposés à l’attaque. Une warm up routine comme Mittens pourra être utile, en particulier pour les applications qui mettent du temps à démarrer.
Il existe également d’autres stratégies au niveau applicatif qui ne sont pas liées à la configuration et à l’infrastructure. Certaines reproduisent ce que l’on trouve avec une solution de gestion de robot au niveau Edge:
- Mécanisme Captcha. Une méthode courante consiste à afficher un captcha à l’utilisateur s’il y a trop de tentatives, ou à cibler les attaques liées aux comptes utilisateurs.
- Mécanisme d’authentification. Si vos API sont publiques, vous pouvez ajouter une authentification, simple comme ‘Basic Auth’ ou plus complexe comme ‘CSRF Token’. Mais vous devez être conscient que cela ajoutera de la complexité à votre système et que vous devez donc trouver un équilibre, par exemple, demandez-vous si les informations exposées par votre API sont suffisamment sensibles pour être protégées.
- Mécanisme de mise en cache, de blocage et de limitation du débit. Cela peut être assez complexe à réaliser et à maintenir, en particulier dans une architecture micro-service, mais je préfère le mentionner, car cela pourrait être une solution potentielle si vous n’avez pas d’outil Edge ou si vous travaillez sur une application monolithique.
Observabilité, Surveillance et Alerte
Enfin, il est très important que vous ayez une observabilité appropriée en place sur votre site. Toutes les attaques de robots qui deviennent suffisamment sérieuses et commencent à exercer une forte pression sur votre système devraient déclencher automatiquement un ensemble d’alertes.
Au niveau Edge:
- Alerte sur les règles de robots lorsqu’une règle créée récemment bloque trop de trafic ou, au contraire, lorsqu’une règle n’a bloqué aucun trafic au cours des ‘n’ derniers mois et peut être réexaminée pour une éventuelle suppression.
- Alerte lorsque le trafic du robot (bon ou mauvais) est beaucoup plus élevé que d’habitude.
Au niveau des applications et de l’infrastructure:
- Alerte sur l’auto-scaling et le nombre d’instances. Par exemple, quand Kubernetes ajoute 5 nouveaux pods au cours des 5 dernières minutes et que ce n’est pas Black Friday, il y a probablement quelque chose de louche…
- Alerte sur le temps et le statut des réponses lorsque le service commence à répondre lentement et/ou avec des erreurs. Je vous recommande de lire Creating Monitoring Dashboards (en anglais), qui couvre tout ce que vous devez savoir sur le monitoring.
- Vous pouvez également configurer certaines alertes au niveau des logs. Cela peut être utile si vous n’exposez pas certaines métriques dans votre application et si vous utilisez un outil avancé de gestion de logs comme Splunk.
Le mot de la fin
J’espère que cet article vous a été utile et que vous avez maintenant une meilleure connaissance des robots et des attaques qu’ils peuvent impliquer.
Je n’ai discuté d’aucune solution miracle ici, car il n’existe pas un outil anti-robot parfait pour tout le monde. Mais il y a toujours place à l’amélioration pour prévenir et atténuer les attaques de robots.
Ah… Et bonne chance pour la prochaine attaque! 👋 🤖
Commentaires récents