Pourquoi êtes-vous ici ?
Ne perdons pas de temps. Vous êtes ici parce que vous êtes en train de construire une fonctionnalité webhook dans votre application. Malheureusement, il y a pas mal de choses qui peuvent mal tourner du point de vue de la sécurité. Cet article a pour but de s'assurer que vous ne commettez pas d'erreurs bien connues lors de la création de webhooks.
Comment fonctionnent les webhooks ?
Pour rappel, les webhooks sont des requêtes HTTP(S) adressées à des tiers pour les informer d'un événement survenu dans votre application. Par exemple, si vous proposez une application qui génère des factures, vous pouvez offrir à vos clients la possibilité de configurer une fonctionnalité de webhook qui se déclenche lorsqu'une nouvelle facture est créée. Cela signifie que lorsque la facture est créée, votre application envoie une requête HTTP(S) à un emplacement déterminé par l'utilisateur. L'utilisateur peut l'utiliser pour mettre en place ses propres flux de travail personnalisés qui sont déclenchés par le webhook, comme la programmation d'e-mails de rappel ou l'envoi au client d'un message sur Slack.
Liste de contrôle : sécuriser les implémentations de webhooks
1. Défaite des attaques de type SSRF
Dans ce type d'attaque, le pirate tente d'obtenir des informations (par exemple, les métadonnées d'une instance dans un nuage) en exploitant la fonction webhook. Pour contrer cette attaque, vous devez prendre les mesures suivantes.
✅ Valider les données de l'utilisateur
- Basic : Effectuer une validation simple de l'URL.
- Mieux : S'assurer que l'URL commence par "https://", interdire "file://" et d'autres schémas non HTTP.
✅ Restreindre les adresses locales
- Bloquer les IP locales typiques : 127.0.x, 192.168.x, 172.x.
- Interdire "localhost" et "http://"
✅ Limite d'exposition logarithmique
- Afficher uniquement les codes d'état HTTP dans les journaux destinés aux utilisateurs.
- Évitez d'afficher les en-têtes ou le corps du texte.
✅ Avancé : Validation améliorée des URL
- Exiger un en-tête de réponse spécifique pour les requêtes POST, propre au client.
- Maintenez cette vérification en permanence, même après la configuration initiale, pour contrer les changements de DNS.

2. Permettre aux utilisateurs de vérifier l'authenticité des données
Le consommateur de votre webhook doit avoir un moyen de savoir que les données proviennent réellement de votre application. Vous pouvez utiliser l'une des méthodes suivantes.
✅ Vérification du message de test
Premièrement, permettre aux utilisateurs de déclencher un message de test pour tester les mécanismes de sécurité.
✅ Hash de vérification HMAC
L'un des mécanismes de sécurité les plus efficaces pour les fonctionnalités des webhooks est la mise en œuvre de HMAC pour l'intégrité et l'authenticité des données.
Le processus de base peut être résumé comme suit :
- Générer un hachage de la charge utile à l'aide de SHA-256 et d'une clé secrète.
- Envoyer le HMAC avec la charge utile.
- Les destinataires recréent le hachage pour vérifier l'authenticité et l'intégrité de la charge utile.
✅ Inclusion de l'horodatage
Il s'agit plutôt d'une mesure de sécurité avancée. Ajouter un horodatage à la charge utile pour empêcher les attaques par rejeu. Permet de s'assurer que les messages ne sont pas réutilisés ou modifiés.
Certificats TLS côté client
Authentifier les appels HTTP à l'aide de certificats TLS côté client. Cette solution est particulièrement intéressante pour les entreprises.
3. Limiter le débit et éviter la surexposition des données
En ce qui concerne la sécurité des webhooks, il est plus sûr d'envoyer trop peu de données que d'en joindre trop. Même si les rappels de webhook doivent être cryptés à l'aide de HTTPS, on ne peut jamais savoir qui contrôlera un nom de domaine après quelques années.
✅ Minimiser l'exposition aux données
- Évitez d'envoyer des informations personnelles identifiables (IPI) ou des données sensibles.
- Au lieu d'envoyer plusieurs points de données (comme l'identifiant du contact, l'adresse électronique, le nom), envoyez uniquement l'identifiant du contact. Laissez les utilisateurs récupérer des données supplémentaires via votre API publique si nécessaire.
Communication sur la politique de réessai
- Communiquer clairement aux utilisateurs la politique de relance et les limites de débit.
- Informez-les qu'en raison des nouvelles tentatives, les messages peuvent arriver dans le désordre.
- Définir que toute réponse 2xx est un succès ; les autres réponses doivent déclencher une nouvelle tentative.
✅ Utiliser un système de file d'attente pour la livraison
Mettez en place un système de file d'attente pour gérer la livraison des webhooks et limiter la production. Cette approche permet d'éviter de submerger accidentellement les serveurs de vos utilisateurs dans les cas extrêmes, comme une importation CSV importante qui déclenche un nombre excessif d'appels de webhook et de tentatives.
4. Bonus : alerte en cas d'anomalie
C'est plus une question de commodité pour le développeur que de sécurité, mais c'est une bonne chose à mettre en œuvre.
- Alerter les utilisateurs en cas de réponses 4xx et 5xx
- Envoyer des notifications pour informer les utilisateurs de toute défaillance
Cet ajout améliore la transparence et la réactivité de votre système de webhook.
Conclusion
Et voilà ! Nous avons couvert quelques étapes pour rendre vos webhooks non seulement fonctionnels, mais aussi sécurisés et conviviaux. La mise en œuvre de ces étapes protégera votre application et améliorera également l'expérience globale de l'utilisateur. Bon codage ! 🚀🔒👨💻
Aikido Security est une plateforme de sécurité logicielle centrée sur le développeur. Nous vous aidons à sécuriser votre produit pour que vous puissiez vous concentrer sur l'écriture du code. Vousn'avez pas besoin de parler à une équipe de vente - connectez simplement votre compte GitHub, GitLab, Bitbucket ou Azure DevOps pour commencer à scanner vos dépôts gratuitement.