Retour au blog
GraphQLAPItechnique

API GraphQL : 6 vulnérabilités que les scanners ne détectent pas

Publié le 2026-04-068 min de lectureFlorian

GraphQL : flexibilité pour les développeurs, surface d'attaque pour les attaquants

GraphQL a remplacé REST dans de nombreuses applications modernes. Sa flexibilité est son plus grand atout : et sa plus grande faiblesse. Les scanners de vulnérabilités classiques, conçus pour REST, passent à côté de 6 catégories de failles spécifiques à GraphQL.

Vulnérabilité 1 : Introspection activée en production

L'introspection permet à quiconque de découvrir l'intégralité de votre schéma : types, champs, mutations, requêtes. C'est comme donner le plan complet de votre application à un attaquant. Les scanners vérifient rarement si l'introspection est désactivée.

En audit, nous envoyons une simple requête __schema et obtenons la cartographie complète de l'API. Sur 80% des applications GraphQL que nous auditons, l'introspection est active en production.

Vulnérabilité 2 : Attaques par profondeur (depth attacks)

GraphQL permet des requêtes imbriquées : user { posts { comments { author { posts { comments... } } } } }. Sans limite de profondeur, un attaquant peut construire une requête qui consomme toutes les ressources serveur. C'est un vecteur de déni de service que les scanners n'explorent pas.

Vulnérabilité 3 : Batching attacks

GraphQL accepte plusieurs requêtes dans un seul appel HTTP. Un attaquant peut envoyer 1 000 mutations de login dans une seule requête, contournant ainsi le rate limiting qui opère par requête HTTP. Les scanners testent les endpoints un par un et ne détectent pas cette faille.

Vulnérabilité 4 : IDOR via Relay Global IDs

Le pattern Relay utilise des IDs globaux encodés en base64 (ex: VXNlcjoxMjM= pour User:123). Un attaquant peut décoder ces IDs, incrémenter le numéro, et accéder aux objets d'autres utilisateurs. Les scanners ne comprennent pas la sémantique des IDs Relay.

Vulnérabilité 5 : Contournement d'autorisation sur les résolveurs imbriqués

L'autorisation est souvent vérifiée sur le résolveur racine mais pas sur les résolveurs imbriqués. Exemple : la requête user(id: me) vérifie que vous accédez à votre propre profil. Mais user(id: me) { company { employees { salary } } } peut exposer les salaires de tous les employés si le résolveur employees ne re-vérifie pas les permissions.

C'est la faille GraphQL la plus dangereuse et la plus difficile à détecter automatiquement.

Vulnérabilité 6 : Mutations sensibles sans vérification de rôle

Des mutations comme deleteUser, updateRole, ou exportData existent dans le schéma mais ne vérifient pas le rôle de l'appelant. L'introspection révèle ces mutations, et un simple appel les exécute.

Notre approche d'audit GraphQL

Nous analysons manuellement le schéma exposé, testons les limites de profondeur et de batching, vérifions les autorisations sur chaque résolveur imbriqué, et identifions les mutations sensibles non protégées. C'est un travail d'expert que les scanners ne peuvent pas faire.

Articles liés

Trois analyses proches pour continuer la lecture sur la meme surface de risque.

Sources

Rédigé par Florian
Revu le 2026-04-06

Analyse éditoriale fondée sur la documentation officielle des éditeurs, projets et autorités concernées.

Services associés

Si ce sujet reflète un risque concret sur votre stack, voici les audits CleanIssue les plus pertinents.

Besoin d'une revue externe de votre SaaS RH ?

Expliquez votre produit, votre stack et votre contexte client. Nous revenons vers vous avec le bon niveau de revue.

Parler de votre audit