
Exploit de prueba de concepto para CVE-2026-22014 que demuestra la manipulación de IDs de consultas persistentes en APIs de GraphQL para evadir las listas de permitidos y ejecutar consultas arbitrarias.
// 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 servidor GraphQL admite consultas persistidas, pero recurre al parámetro query proporcionado si no se conoce el queryId. Un atacante puede suministrar un queryId inexistente junto con una consulta GraphQL arbitraria, omitiendo la lista de permitidos prevista para las consultas persistidas.
query proporcionado por el cliente cuando no se encuentra el queryId, en lugar de rechazar la solicitud.Inicie el servidor y envíe una carga útil mixta:
python exploit_persisted_query.py
El servidor ejecuta la consulta maliciosa.