
Prueba de concepto para CVE-2026-21717, una vulnerabilidad de colisión de hash de cadenas en V8 de Node.js que provoca denegación de servicio mediante cargas útiles JSON manipuladas.
Vulnerabilidad de colisión predecible en el hash de cadenas de V8 en Node.js que provoca denegación de servicio
Una vulnerabilidad crítica en el mecanismo de hash de cadenas de V8 permite a los atacantes causar una degradación severa del rendimiento en aplicaciones Node.js. Las cadenas similares a enteros se convierten en hash según su valor numérico, lo que hace que las colisiones de hash sean trivialmente predecibles. Al elaborar una entrada maliciosa que provoque muchas colisiones en la tabla interna de cadenas de V8, un atacante puede degradar significativamente el rendimiento o causar una denegación de servicio.
La vulnerabilidad se origina en el proceso de internalización de cadenas de V8. Cuando se realiza el análisis JSON, las cadenas cortas se internalizan automáticamente en una tabla hash. Las cadenas similares a enteros colisionan de forma predecible porque se convierten en hash según su valor numérico, lo que permite a los atacantes forzar cadenas de sondeo cuadrático que degradan severamente el rendimiento.
El desencadenante más común es cualquier endpoint que llame a JSON.parse() sobre entrada controlada por el atacante, ya que el análisis JSON internaliza automáticamente las cadenas cortas en la tabla hash afectada.
Este repositorio contiene una prueba de concepto que demuestra la vulnerabilidad:
# Use una versión de Node.js afectada por CVE-2026-21717
nvm use
npm install
node poc.js
El PoC crea una carga útil con:
JSON.parse()JSON.parse() sobre la entrada no confiable// Limitar el tamaño de la carga útil
app.use(express.json({ limit: '100kb' }));
// Agregar tiempo de espera para el análisis
const parseWithTimeout = (str, timeout = 1000) => {
return Promise.race([
Promise.resolve(JSON.parse(str)),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Parse timeout')), timeout)
)
]);
};
Este repositorio es solo para fines educativos y de investigación. No utilice este código con fines maliciosos ni contra sistemas que no posea o para los cuales no tenga permiso explícito de prueba.