
Prova de conceito de exploit para CVE-2026-22014 demonstrando manipulação de IDs de consultas persistidas em APIs GraphQL para contornar listas de permissão e executar consultas arbitrárias.
// 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);
}
}));
Um servidor GraphQL suporta consultas persistidas, mas recorre ao parâmetro query fornecido se o queryId for desconhecido. Um atacante pode fornecer um queryId inexistente juntamente com uma consulta GraphQL arbitrária, contornando a lista de permissões pretendida de consultas persistidas.
query fornecida pelo cliente quando o queryId não é encontrado, em vez de rejeitar a requisição.Inicie o servidor e envie um payload misto:
python exploit_persisted_query.py
O servidor executa a consulta maliciosa.