
Доказательство концепции для CVE-2026-21717, уязвимости коллизий хеширования строк в Node.js V8, вызывающей отказ в обслуживании через специально сформированные JSON-нагрузки.
Уязвимость предсказуемых коллизий хеширования строк в V8 Node.js, приводящая к отказу в обслуживании
Критическая уязвимость в механизме хеширования строк V8 позволяет злоумышленникам вызывать серьёзную деградацию производительности в приложениях Node.js. Строки, похожие на целые числа, хешируются до их числового значения, что делает коллизии хешей тривиально предсказуемыми. Создавая вредоносный ввод, вызывающий множество коллизий во внутренней таблице строк V8, злоумышленник может значительно снизить производительность или вызвать отказ в обслуживании.
Уязвимость возникает из-за процесса интернирования строк в V8. При разборе JSON короткие строки автоматически интернируются в хеш-таблицу. Строки, похожие на целые числа, сталкиваются предсказуемым образом, поскольку они хешируются до своих числовых значений, что позволяет злоумышленникам принудительно создавать цепочки квадратичного зондирования, которые серьёзно ухудшают производительность.
Наиболее распространённым триггером является любой конечный пункт, который вызывает для ввода, контролируемого злоумышленником, поскольку разбор JSON автоматически интернирует короткие строки в затронутую хеш-таблицу.
JSON.parse()Этот репозиторий содержит доказательство концепции, демонстрирующее уязвимость:
# Используйте версию Node.js, затронутую CVE-2026-21717
nvm use
npm install
node poc.js
PoC создаёт полезную нагрузку с:
JSON.parse()JSON.parse() для недоверенного ввода// Ограничение размера полезной нагрузки
app.use(express.json({ limit: '100kb' }));
// Добавление тайм-аута для разбора
const parseWithTimeout = (str, timeout = 1000) => {
return Promise.race([
Promise.resolve(JSON.parse(str)),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Parse timeout')), timeout)
)
]);
};
Этот репозиторий предназначен только для образовательных и исследовательских целей. Не используйте этот код в злонамеренных целях или против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.