
Exploit proof-of-concept per CVE-2026-22014 che dimostra la manipolazione dell'ID delle query persistenti nelle API GraphQL per aggirare le allowlist ed eseguire query arbitrarie.
// 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 server GraphQL supporta le query persistite ma ripiega sul parametro query fornito se queryId è sconosciuto. Un attaccante può fornire un queryId inesistente insieme a una query GraphQL arbitraria, aggirando l'allowlist prevista delle query persistite.
query fornita dal client quando queryId non viene trovato, invece di rifiutare la richiesta.Avvia il server e invia un payload misto:
python exploit_persisted_query.py
Il server esegue la query dannosa.