Neutron, nuestro motor de IA, obtuvo un 97.1% en el benchmark CyberGym de UC Berkeley. Más información

Análisis a fondo

Análisis a fondo

Chrome XSLT use-after-free explotado en entornos reales (CVE-2026-125350)

Un use-after-free en libxslt incluido en Chrome puede corromper la memoria; CVE-2026-125350 se explota en entornos reales y está corregida en 157.0.8103.50.

Resumen

  • Un use-after-free en el manejo de XML y XSLT de Chrome permite que una página manipulada corrompa la memoria del motor de renderizado. Google clasifica CVE-2026-125350 como High y afirma que existe un exploit en entornos reales.
  • Todas las versiones de Chrome de escritorio anteriores a 157.0.8103.50 están afectadas. Statcounter sitúa a Chrome en el 66.98 % de cuota de navegadores de escritorio en el mundo en octubre de 2026.
  • CVE-2026-125350 no figura en el catálogo Known Exploited Vulnerabilities (KEV) de CISA a 10 de noviembre de 2026.
  • La falla está en la caché de coincidencia directa de patrones de libxslt, que Chrome incluye. La misma corrección cierra CVE-2026-125346, notificada por separado el 12 de octubre de 2026.
  • Actualice Chrome a 157.0.8103.50 o 157.0.8103.51 y reinicie el navegador. Los navegadores basados en Chromium necesitan la actualización de su proveedor. Consulte "¿Cómo lo corrijo?".

¿Estoy afectado?

Está expuesto cuando se cumplen todas estas condiciones:

  • Usa Google Chrome de escritorio anterior a 157.0.8103.50 en Windows, macOS o Linux.
  • Abre una página controlada por el atacante, o una página que carga XML y XSLT controlados por el atacante. No hace falta otra interacción para que se ejecute el analizador vulnerable.
  • La versión no incluye ya la corrección de libxslt. Google la publicó en las versiones de escritorio 157.0.8103.50 y 157.0.8103.51 el 9 de noviembre de 2026.

El aviso cubre Chrome de escritorio. Los navegadores basados en Chromium comparten el motor, pero cada proveedor publica su propia versión y su propio calendario de corrección. Consulte al proveedor antes de dar por corregido un navegador Chromium.

Rama Versiones afectadas Versión corregida
Chrome para Windows y macOS todas las versiones anteriores a 157.0.8103.50/.51 157.0.8103.50 o 157.0.8103.51
Chrome para Linux todas las versiones anteriores a 157.0.8103.50 157.0.8103.50

Compruebe la versión instalada desde el navegador:

# Open this URL in Chrome and read the version line
chrome://version

Desde un terminal, el gestor de paquetes indica la versión instalada:

# Debian and Ubuntu
dpkg-query -W -f='${Version}\n' google-chrome-stable

# Fedora and RHEL
rpm -q google-chrome-stable

# macOS
defaults read "/Applications/Google Chrome.app/Contents/Info.plist" CFBundleShortVersionString

Compare el resultado con 157.0.8103.50. Una versión anterior a ese número está afectada.

¿Cómo lo corrijo?

  1. Actualice Chrome a 157.0.8103.50 o posterior. En Windows y macOS, abra el menú de tres puntos, elija Ayuda y luego Acerca de Google Chrome, y deje que se instale la actualización. En Linux, actualice el paquete: sudo apt update && sudo apt install --only-upgrade google-chrome-stable
  2. Reinicie el navegador. Una actualización descargada pero no aplicada deja el motor de renderizado antiguo en ejecución.
  3. Si gestiona Chrome mediante una política empresarial, confirme que la actualización está permitida y que el informe de versión muestra 157.0.8103.50 o posterior en cada equipo.
  4. Si usa un navegador basado en Chromium, consulte su aviso y su canal de actualización. No suponga que el número de versión de Chrome se aplica.
  5. Si no puede actualizar de inmediato, limite la navegación a sitios de confianza y bloquee el contenido XML y XSLT no fiable en el proxy. Eso reduce la exposición; no es una corrección.

No hay un interruptor de configuración que desactive la caché de patrones vulnerable y mantenga XSLT funcionando. La versión de Google es la corrección.

¿Cuál es la causa raíz?

La falla es un defecto de reentrada en xsltTestCompMatchDirect() en el motor de patrones de libxslt. La función almacena en caché el conjunto de nodos producido por una evaluación directa de patrón en los extras de ejecución del contexto de transformación, y lee el puntero almacenado antes de evaluar el patrón.

La caché existe para que las pruebas directas de patrón repetidas sobre el mismo documento reutilicen un solo conjunto de nodos en lugar de reevaluar el XPath para cada nodo. Se indexa por los extras de ejecución del primer paso: un puntero de lista, el documento para el que se construyó la lista y un índice. Ese diseño supone que la evaluación no cambia la caché. XSLT permite la evaluación perezosa, así que una variable global o un parámetro de plantilla puede ejecutar una instrucción de transformación anidada mientras la evaluación externa sigue en la pila. El xsl:number anidado puede preparar o reemplazar el mismo espacio de caché, lo que rompe la suposición.

Este es el código vulnerable en third_party/libxslt/src/libxslt/pattern.c, en el árbol de Chromium antes de la corrección:

list = (xmlXPathObjectPtr)
    XSLT_RUNTIME_EXTRA_LST(ctxt, sel->lenExtra);

if ((list == NULL) || (prevdoc != doc)) {
    ...
    newlist = xmlXPathEval(comp->pattern, ctxt->xpathCtxt);
    ...
    if (nocache == 0) {
        if (list != NULL)
            xmlXPathFreeObject(list);
        list = newlist;

        XSLT_RUNTIME_EXTRA_LST(ctxt, sel->lenExtra) =
            (void *) list;
        ...
    } else
        list = newlist;
}

La función lee list de la caché antes de xmlXPathEval. La evaluación puede reentrar en xsltTestCompMatchDirect() para el mismo espacio de caché, por ejemplo mediante una variable global evaluada de forma perezosa cuyo valor ejecuta xsl:number. La llamada anidada libera o reemplaza el objeto almacenado. La llamada externa libera entonces el puntero list obsoleto, lo que es una doble liberación y deja la caché apuntando a memoria liberada.

El commit de corrección de Chromium describe la misma secuencia. El conjunto de nodos almacenado se lee antes de la evaluación, la llamada anidada puede liberarlo y reemplazarlo, y la llamada externa lo libera de nuevo.

¿Cómo se explota?

El atacante necesita un documento que Chrome analice como XML con una hoja de estilo XSLT. La hoja de estilo lleva al motor de patrones al camino de caché con reentrada.

  1. La víctima abre una página que carga un documento XML controlado por el atacante con una instrucción de procesamiento xml-stylesheet, o una hoja de estilo XSLT controlada por el atacante.
  2. Un patrón de plantilla o xsl:number usa una construcción evaluada de forma perezosa, por ejemplo una variable global cuyo valor ejecuta xsl:number.
  3. La caché de coincidencia directa de patrones se prepara para el patrón, y xmlXPathEval reentra en xsltTestCompMatchDirect() para el mismo espacio de caché.
  4. La llamada anidada libera o reemplaza el conjunto de nodos almacenado. La llamada externa libera el puntero obsoleto y guarda newlist en su lugar.
  5. La transformación continúa con una entrada de caché que apunta a memoria liberada, lo que produce un use-after-free en el motor de renderizado.

Google afirma que existe un exploit de CVE-2026-125350 en entornos reales. No ha publicado el exploit, la cadena de ataque, los sitios afectados ni la identidad de los atacantes. El registro CVE no estaba en la base pública cuando se escribió este artículo, y Google restringe los detalles mientras los usuarios se actualizan.

La misma corrección cierra CVE-2026-125346, un use-after-free en XML notificado por Arni Hardarson de Neonix Security el 12 de octubre de 2026. Google no ha dicho que esa esté explotada. Los dos informes ejercitan la misma falla de caché.

¿Cómo se desarrolla el ataque?

Un documento XML y XSLT manipulado provoca una evaluación reentrante de la caché de patrones; la llamada anidada libera el conjunto de nodos almacenado y la llamada externa lo libera de nuevo, dejando el motor de renderizado con un use-after-free.

flowchart LR A["La víctima abre una página del atacante"] --> B["Chrome analiza XML con una hoja XSLT"] B --> C["Se prepara la caché de coincidencia directa de patrones"] C --> D["xmlXPathEval reentra en el mismo espacio de caché"] D --> E["La llamada anidada libera o reemplaza el conjunto de nodos"] E --> F["La llamada externa libera el puntero obsoleto"] F --> G["Use-after-free en el motor de renderizado"]

¿Qué puede hacer un atacante?

Un atacante que activa la falla corrompe la memoria del motor de renderizado de Chrome. Google clasifica la falla como High y afirma que existe un exploit en entornos reales. La empresa no ha dicho si el exploit escapa del sandbox del motor de renderizado, qué proceso ataca ni qué hace después de ejecutar código.

Las condiciones forman parte del impacto:

  • El atacante necesita que la víctima cargue XML o XSLT que él controla. Una visita normal a una página es suficiente.
  • El código vulnerable se ejecuta en el motor de renderizado. La ejecución de código allí está limitada por el sandbox de Chrome hasta que se encadene una segunda falla o una evasión del sandbox. Chrome aísla el motor de renderizado en cada plataforma de escritorio. El exploit que Google comunica puede detenerse en el motor de renderizado o formar parte de una cadena mayor, y el registro público no dice cuál. Una primitiva de corrupción de memoria en el motor de renderizado es la primera etapa de la mayoría de las cadenas de explotación de navegadores, así que la actualización es urgente en ambos casos.
  • No hay código de exploit público. El exploit en entornos reales se conoce por la declaración de Google, no por una muestra publicada.

No lea "explotado en entornos reales" como "compromiso total del dispositivo". Google no ha publicado esa cadena, y el sandbox del motor de renderizado es una frontera distinta.

¿Por qué funciona la corrección?

La corrección vuelve a leer el espacio de caché después de xmlXPathEval, así que la llamada externa libera el objeto que está ahora en la caché, no el puntero leído antes de la llamada anidada. Este es el código añadido por el commit de Chromium 61cab3f77203:

@@ -581,6 +581,15 @@ xsltTestCompMatchDirect(xsltTransformContextPtr ctxt, xsltCompMatchPtr comp,
        nocache = 1;

    if (nocache == 0) {
+       /*
+        * xmlXPathEval can re-enter this function for the same cache
+        * slot, e.g. through a lazily evaluated global variable whose
+        * value runs xsl:number. The nested call may free or replace
+        * the cached object, so re-read it instead of using the value
+        * read before the evaluation.
+        */
+       list = (xmlXPathObjectPtr)
+       XSLT_RUNTIME_EXTRA_LST(ctxt, sel->lenExtra);
        if (list != NULL)
        xmlXPathFreeObject(list);
        list = newlist;

La corrección es completa para la copia de Chromium. Cierra CVE-2026-125350 y CVE-2026-125346, y el commit añade una prueba de regresión que carga la hoja XSLT manipulada en un iframe.

El proyecto libxslt upstream no ha adoptado el cambio. El archivo libxslt/pattern.c de la rama master upstream sigue leyendo list antes de xmlXPathEval y lo libera después de la llamada. Chromium lleva la corrección como un parche en third_party/libxslt/chromium. El software que incluye libxslt, incluidos los procesos XML del lado del servidor y otros navegadores, debe preguntar a su proveedor si esa copia está corregida.

¿Cómo compruebo si estuve comprometido?

Google no ha publicado indicadores de compromiso para CVE-2026-125350. Un exploit de navegador deja poco en disco, así que la comprobación fiable es confirmar la versión del navegador y tratar cualquier período en una versión afectada como exposición.

  • Confirme que cada instalación de Chrome de escritorio ejecuta 157.0.8103.50 o posterior. Use chrome://version en local y su inventario de gestión de equipos para el resto.
  • Revise los informes de fallos del navegador del período afectado por fallos del motor de renderizado en páginas que cargan XML o XSLT. Un fallo es una pista, no una prueba de explotación.
  • Revise los registros del proxy y del DNS por contenido XML o XSLT de hosts que sus usuarios no visitan normalmente. Google no ha publicado dominios ni hashes.
  • Si sospecha una explotación, conserve el perfil del navegador, los volcados de fallos y los registros del proxy antes de borrar la máquina, y luego reconstrúyala.

Un exploit que tiene éxito puede no dejar fallo ni archivo. La ausencia de un fallo no prueba que un equipo no estuviera expuesto.

Cronología

  • 2026-10-12: Arni Hardarson de Neonix Security notifica CVE-2026-125346, un use-after-free en XML.
  • 2026-11-06: un investigador anónimo notifica CVE-2026-125350, un use-after-free en XML que Google dirá después que se explota en entornos reales.
  • 2026-11-07: Chromium integra el commit 61cab3f77203, que corrige las dos fallas en la caché de coincidencia directa de patrones de libxslt.
  • 2026-11-09: Google publica Chrome 157.0.8103.50/.51 para Windows y macOS y 157.0.8103.50 para Linux.

De dos informes a la versión estable de Chrome en 28 días
Figura 1: el primer informe, el segundo y la corrección llegaron en 28 días. Fuente: entrada del canal estable de Chrome Releases y commit de Chromium 61cab3f77203, comprobados el 10 de noviembre de 2026

Preguntas frecuentes

¿Se explota CVE-2026-125350 en entornos reales?

Sí. La entrada del canal estable de Google dice que existe un exploit de CVE-2026-125350 en entornos reales. Google no ha dicho quién lo usa, qué sitios lo sirven ni si escapa del sandbox del motor de renderizado.

¿Existe un exploit público?

No. Google no ha publicado código de exploit, y el registro CVE no era público cuando se escribió este artículo. El exploit en entornos reales se conoce por la declaración de Google, no por una muestra.

¿Afecta a Chrome en Android?

El aviso de Google cubre el canal estable de escritorio. No incluye Chrome para Android. Trate Android como no confirmado en lugar de seguro, y manténgalo actualizado mediante Play Store.

Probablemente, hasta que sus proveedores publiquen la misma corrección de libxslt. El número de versión de Chrome no se aplica a Edge, Brave, Opera o Vivaldi. Consulte el aviso y el canal de actualización de cada proveedor.

¿Qué es la caché de coincidencia directa de patrones?

Es una caché por transformación en libxslt que almacena el conjunto de nodos producido por una evaluación directa de patrón XPath. Evita reevaluar el mismo patrón para cada nodo. Como la caché vive en el contexto de transformación, una evaluación anidada puede alcanzar el mismo espacio y reemplazar el objeto almacenado.

¿Está corregido libxslt?

No. La rama master upstream de libxslt todavía contiene la lectura vulnerable, y Chromium lleva la corrección como un parche local. Las aplicaciones que incluyen libxslt deben seguir el proyecto upstream y a su proveedor.

¿Qué urgencia tiene la actualización?

Actualice ahora. La falla es alcanzable con una visita normal a una página, Chrome es el navegador de escritorio mayoritario y Google afirma que existe un exploit. La actualización requiere reiniciar.

Referencias

  • Chrome Releases, "Stable Channel Update for Desktop", 9 de noviembre de 2026, las versiones corregidas, las nueve correcciones de seguridad, CVE-2026-125350, CVE-2026-125346 y la declaración de explotación en entornos reales: https://chromereleases.googleblog.com/2026/11/stable-channel-update-for-desktop_018223192.html (comprobado el 10 de noviembre de 2026)
  • Commit de Chromium 61cab3f77203671e09402e68738aa217632aed8d, "Fix use-after-free in libxslt direct pattern match cache", la corrección y la prueba de regresión: https://github.com/chromium/chromium/commit/61cab3f77203671e09402e68738aa217632aed8d (comprobado el 10 de noviembre de 2026)
  • La función vulnerable xsltTestCompMatchDirect() en third_party/libxslt/src/libxslt/pattern.c antes de la corrección: https://github.com/chromium/chromium/blob/6eade082d6e5/third_party/libxslt/src/libxslt/pattern.c (comprobado el 10 de noviembre de 2026)
  • El archivo libxslt/pattern.c de la rama master upstream de libxslt, que todavía contiene la secuencia anterior a la corrección: https://github.com/GNOME/libxslt/blob/master/libxslt/pattern.c (comprobado el 10 de noviembre de 2026)
  • Statcounter Global Stats, cuota de navegadores de escritorio en el mundo, octubre de 2026: https://gs.statcounter.com/browser-market-share/desktop/worldwide (comprobado el 10 de noviembre de 2026)
  • Flujo JSON del catálogo Known Exploited Vulnerabilities de CISA, comprobado para CVE-2026-125350 el 10 de noviembre de 2026 (no incluida): https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json (comprobado el 10 de noviembre de 2026)