Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Vulnerabilidad en Keystone (CVE-2025-46720)

Gravedad CVSS v3.1:
BAJA
Tipo:
CWE-200 Revelación de información
Fecha de publicación:
05/05/2025
Última modificación:
05/05/2025

Descripción

Keystone es un sistema de gestión de contenido para Node.js. Antes de la versión 6.5.0, el control de acceso `{field}.isFilterable` se podía omitir en las mutaciones `update` y `delete` añadiendo filtros únicos adicionales. Estos filtros se pueden usar como un oráculo para sondear la existencia o el valor de campos que de otro modo serían ilegibles. Específicamente, cuando una mutación incluye una cláusula `where` con múltiples filtros únicos (p. ej., `id` y `email`), Keystone intentará encontrar coincidencias en los registros incluso si el filtrado por estos últimos campos normalmente sería rechazado por `field.isFilterable` o `list.defaultIsFilterable`. Esto puede permitir que actores maliciosos infieran la presencia de un valor de campo específico cuando un filtro devuelve un resultado correctamente. Esto afecta a cualquier proyecto que dependa del comportamiento predeterminado o dinámico de `isFilterable` (a nivel de lista o campo) para evitar que usuarios externos utilicen el filtrado de campos como mecanismo de descubrimiento. Aunque este control de acceso se respeta durante las operaciones `findMany`, no se aplicó completamente durante las mutaciones `update` y `delete` al aceptar más de un valor `where` único en los filtros. Esto no tiene impacto en los proyectos que usan `isFilterable: false` o `defaultIsFilterable: false` para campos sensibles, o para aquellos que de otra manera han omitido el filtrado por estos campos de su esquema GraphQL. Este problema se ha corregido en `@keystone-6/core` versión 6.5.0. Para mitigar este problema en versiones anteriores donde la aplicación de parches no es una ruta viable, configure `isFilterable: false` estáticamente para los campos relevantes para evitar el filtrado por ellos anteriormente en el flujo de trabajo de control de acceso (es decir, no use funciones); configure `{field}.graphql.omit.read: true` para los campos relevantes, lo que implícitamente elimina el filtrado por estos campos del esquema GraphQL; y/o deniegue las operaciones `update` y `delete` para las listas relevantes por completo.

Referencias a soluciones, herramientas e información