
Эксплойт класса Proof-of-Concept для CVE-2026-22014, демонстрирующий манипуляцию ID сохранённых запросов (persisted queries) в GraphQL API с целью обхода списков разрешённых запросов (allowlist) и выполнения произвольных запросов.
// 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);
}
}));
GraphQL-сервер поддерживает persisted queries, но в случае неизвестного откатывается к переданному параметру . Злоумышленник может передать несуществующий вместе с произвольным GraphQL-запросом, обойдя таким образом предусмотренный allowlist persisted queries.
queryIdqueryqueryIdquery, когда queryId не найден, вместо того чтобы отклонить запрос.Запустите сервер и отправьте смешанную нагрузку:
python exploit_persisted_query.py
Сервер выполняет вредоносный запрос.