
Preuve de concept d'exploitation pour CVE-2026-22014 démontrant la manipulation d'identifiants de requêtes persistées dans les API GraphQL afin de contourner les listes blanches et d'exécuter des requêtes arbitraires.
// graphql_persisted.js - Accepts persisted query IDs
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const queries = {
"abc": "query { user { name } }"
};
app.post('/graphql', graphqlHTTP({
schema: schema,
customExecuteFn: (args) => {
const doc = parse(queries[args.queryId] || args.query);
return execute(args);
}
}));
Un serveur GraphQL prend en charge les requêtes persistées mais revient au paramètre fourni si le est inconnu. Un attaquant peut fournir un inexistant accompagné d'une requête GraphQL arbitraire, contournant ainsi la liste d'autorisation prévue des requêtes persistées.
queryqueryIdqueryIdquery fournie par le client lorsque le queryId n'est pas trouvé, au lieu de rejeter la requête.Démarrez le serveur et envoyez une charge utile mixte :
python exploit_persisted_query.py
Le serveur exécute la requête malveillante.