{
  "schema_version": 1,
  "variant_id": "CVE-2026-84645-fingerprint-action-alternate-carrier",
  "created_at": "2026-09-03T16:44:55Z",
  "variant_summary": "A distinct Fingerprinter.FingerprintAction#build carrier reaches the same nested PersistenceRoot-to-Stapler Script Console sink and achieves controller RCE on Jenkins 2.579, but the identical alternate trigger is neutralized on Jenkins 2.580; no fix bypass was found.",
  "relation": "newer_version_sibling",
  "origin_kind": "pruva_variant",
  "repository": "https://github.com/jenkinsci/jenkins",
  "submitted_target": {
    "target_kind": "commit",
    "commit_sha": "9095ea3a5c5e7dcd392695a5dd880af1c9910ddf",
    "version": "2.579",
    "ref": "jenkins-2.579",
    "display": "Jenkins 2.579 vulnerable submitted target"
  },
  "variant_target": {
    "target_kind": "commit",
    "commit_sha": "497de4961ad80d97e26bfdeb0d2e40442a84ecb0",
    "version": "2.580",
    "ref": "jenkins-2.580",
    "display": "Jenkins 2.580 fixed newer-version sibling (alternate trigger blocked)"
  },
  "same_root_cause_confidence": 1.0,
  "same_surface_confidence": 0.82,
  "claimed_surface": "Authenticated job configuration XML can persist a forged nested PersistenceRoot graph and expose an improperly protected Script Console through Stapler.",
  "validated_surface": "On Jenkins 2.579, authenticated POST /job/carrier/config.xml carrying Fingerprinter.FingerprintAction#build persists a nested FreeStyleBuild -> FreeStyleProject -> Hudson graph; POST /job/carrier/fingerprints/run/project/parent/scriptText executes Groovy and id. The same payload on Jenkins 2.580 leaves an empty action, returns route HTTP 404, and creates no marker.",
  "required_entrypoint_kind": "endpoint",
  "required_entrypoint_detail": "Authenticated POST /job/carrier/config.xml followed by POST /job/carrier/fingerprints/run/project/parent/scriptText",
  "attacker_controlled_input": "Job config.xml containing hudson.tasks.Fingerprinter$FingerprintAction with a forged build/project/Hudson object graph, followed by a Groovy script form parameter",
  "trigger_path": "AbstractItem#doConfigDotXml -> AbstractItem#updateByXml -> Items.XSTREAM2 -> RobustReflectionConverter -> FingerprintAction#build -> FingerprintAction#getRun -> Run#getProject -> AbstractItem#getParent -> Hudson#doScriptText",
  "observed_impact_class": "remote_code_execution_on_submitted_target_only",
  "exploitability_confidence": "high",
  "evidence_scope": "current_runtime_side_by_side_vulnerable_and_fixed",
  "runtime_manifest_present": true,
  "end_to_end_target_reached": false,
  "inferred": false,
  "claim_block_reason": "The distinct alternate trigger does not reproduce on the newer fixed variant target and therefore is not a patch bypass.",
  "blocking_mitigation": "Jenkins 2.580 globally refuses unsafe nested PersistenceRoot field values in RobustReflectionConverter and marks FingerprintAction#build XStreamNotDeserializable; the forbidden graph is removed before Stapler routing.",
  "file_path": "core/src/main/java/hudson/util/RobustReflectionConverter.java",
  "line_start": 372,
  "line_end": 387,
  "secondary_anchors": [
    {
      "file_path": "core/src/main/java/hudson/tasks/Fingerprinter.java",
      "line_start": 367,
      "line_end": 415
    },
    {
      "file_path": "core/src/main/java/jenkins/model/Jenkins.java",
      "line_start": 1057,
      "line_end": 1095
    },
    {
      "file_path": "core/src/main/java/hudson/model/Actionable.java",
      "line_start": 405,
      "line_end": 418
    }
  ],
  "review_scope_paths": [
    "core/src/main/java/hudson/util/RobustReflectionConverter.java",
    "core/src/main/java/hudson/util/XStream2.java",
    "core/src/main/java/hudson/tasks/Fingerprinter.java",
    "core/src/main/java/hudson/model/ParametersAction.java",
    "core/src/main/java/hudson/triggers/SCMTrigger.java",
    "core/src/main/java/jenkins/model/Jenkins.java"
  ],
  "artifact_refs": {
    "variant_manifest": "vuln_variant/variant_manifest.json",
    "validation_verdict": "vuln_variant/validation_verdict.json",
    "runtime_manifest": "vuln_variant/runtime_manifest.json",
    "repro_log": "logs/vuln_variant/reproduction_second.log",
    "root_cause_equivalence": "vuln_variant/root_cause_equivalence.json",
    "reproducer": [
      "vuln_variant/reproduction_steps.sh"
    ]
  }
}
