{"repro_id":"REPRO-2026-00343","version":7,"title":"Jenkins XStream deserialization of nested PersistenceRoot objects leads to RCE via Stapler (SECURITY-3972)","repro_type":"security","status":"published","severity":"high","description":"Jenkins weekly <= 2.579 / LTS <= 2.568.2: the XStream deserialization layer (JEP-200 class filter) validates class identity but not structural position in the object graph. An authenticated attacker with low privileges (e.g. Item/Configure) can submit a crafted config.xml to any config-accepting endpoint (POST /job/<name>/config.xml or configure form submissions) containing classes implementing hudson.model.PersistenceRoot (Jenkins singleton, jobs, nodes, builds, users) as nested field values. Stapler then reflectively routes HTTP requests over the forged object graph, reaching an improperly protected Script Console (hudson.model.Hudson#doScript / scriptText) resulting in arbitrary Groovy code execution on the Jenkins controller JVM. CVSS 8.8 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H). Fixed in weekly 2.580 and LTS 2.568.3. Advisory published 2026-09-02 (SECURITY-3972), discovered via EU-sponsored Jenkins Bug Bounty Program by Samy Medjahed & Eliott Laurie. REPRODUCTION GOAL: must demonstrate REAL remote code execution on a vulnerable Jenkins controller (e.g. Docker jenkinsci/jenkins:2.579), e.g. execute a Groovy script via the Script Console route that runs a system command (id / uname -a / file write) and capture output. Reproduction is NOT valid on 2.580+ or 2.568.3+.","root_cause":"## Summary\n\nCVE-2026-84645 (Jenkins SECURITY-3972) is an authenticated remote code execution vulnerability caused by Jenkins XStream deserialization accepting implementations of `hudson.model.PersistenceRoot` in nested positions of attacker-submitted configuration object graphs. The accepted nested objects remain reflectively traversable by Stapler. In this run, a user limited to Overall/Read, Item/Read, and Item/Configure submitted a job `config.xml` containing `SCMTrigger.BuildAction -> FreeStyleBuild -> FreeStyleProject -> hudson.model.Hudson`, where the forged `Hudson` carried the core `AuthorizationStrategy$Unsecured`; the attacker then reached that object's `doScriptText` method through the forged Stapler route and executed Groovy plus the controller-local `id` command.\n\n## Impact\n\n- **Affected package/component:** Jenkins core XStream handling in `hudson.util.RobustReflectionConverter`, combined with Stapler routing over Jenkins model objects.\n- **Affected versions:** Jenkins weekly 2.579 and earlier, and Jenkins LTS 2.568.2 and earlier, per the official advisory.\n- **Fixed versions:** Jenkins weekly 2.580 and LTS 2.568.3.\n- **Risk level:** High (official CVSS 3.1 vector `AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H`, score 8.8).\n- **Consequences:** An authenticated user with job configuration rights can execute arbitrary Groovy and operating-system commands in the Jenkins controller JVM/container security context, enabling full compromise of controller data and behavior.\n\nThe runtime used the real Jenkins HTTP/API boundary. Matrix Authorization Strategy Plugin 3.3 was installed only to express the claim's low-privilege account precisely. Before exploitation, the same `attacker` account received HTTP 403 from the legitimate root `/scriptText` endpoint in every vulnerable and fixed attempt.\n\n## Impact Parity\n\n- **Disclosed/claimed maximum impact:** Authenticated remote code execution on the Jenkins controller.\n- **Reproduced impact from this run:** Authenticated remote code execution on two independent Jenkins 2.579 controller processes. Each attacker-supplied Groovy script created a unique controller-local marker and executed `id`, returning `uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)`.\n- **Parity:** `full`.\n- **Not demonstrated:** No claimed impact remains unproven. The proof intentionally stops after a harmless unique file write and `id`; it does not perform persistence, secret extraction, or destructive actions.\n\n## Root Cause\n\n`PersistenceRoot` identifies Jenkins model objects whose state belongs in an independent top-level persistence document, such as a Jenkins/Hudson singleton, item/job, node, or build. Before the fix, `RobustReflectionConverter` applied the JEP-200 class allowlist but did not enforce the structural invariant that newly deserialized `PersistenceRoot` instances must not occur as ordinary nested field values. Consequently, a class could be allowed by identity yet unsafe in its graph position.\n\nThe exploit uses only Jenkins core types:\n\n1. `hudson.triggers.SCMTrigger$BuildAction` is inserted into the carrier job's persistent `actions` list. It exposes the Stapler URL name `pollingLog` and a public `getRun()` accessor.\n2. Its private `run` field is deserialized as a nested `hudson.model.FreeStyleBuild` (a `PersistenceRoot`).\n3. The build's `project` field is deserialized as a nested `hudson.model.FreeStyleProject` (also a `PersistenceRoot`).\n4. The nested project's `parent` field is deserialized as a second `hudson.model.Hudson`/`jenkins.model.Jenkins` singleton object (also a `PersistenceRoot`).\n5. That forged root object carries `hudson.security.AuthorizationStrategy$Unsecured`, so `Hudson#doScriptText` calls `Jenkins._doScript(..., getACL())` with an ACL that allows `ADMINISTER`.\n6. Stapler reflectively traverses `/job/carrier/pollingLog/run/project/parent/scriptText` and invokes the forged object's Script Console endpoint, despite the authenticated principal lacking real Jenkins `ADMINISTER` permission.\n\nThe primary fixing commit is [`0d731367e08656f8cd1e8275f0e820f97af07fc6`](https://github.com/jenkinsci/jenkins/commit/0d731367e08656f8cd1e8275f0e820f97af07fc6) (`[SECURITY-3972]`), which is present in tag `jenkins-2.580` and absent from `jenkins-2.579`. It adds a `PersistenceRoot` check in `RobustReflectionConverter` and throws `CriticalXStreamException` for unsafe nested instances, with narrow exceptions for references, replacement placeholders, and registered single-value converters. It also adds a second-Jenkins-instance guard and safe replacer logic in `Jenkins`. Related hardening annotations in the 2.580 release prevent unsafe transient-field reconstruction.\n\nIn the fixed runtime, the same `config.xml` POST completes but serializing the job back shows only `<hudson.triggers.SCMTrigger_-BuildAction/>`; the forbidden nested Run/Job/Hudson graph is absent. The forged route returns HTTP 404 and no marker is created.\n\n## Reproduction Steps\n\n1. Run `bundle/repro/reproduction_steps.sh` from any directory. `PRUVA_ROOT` may optionally identify the bundle root.\n2. The script reads `bundle/project_cache_context.json`, reuses the prepared cache when available, and otherwise uses bundle-owned fallback paths.\n3. It downloads three pinned plugin dependencies only when absent and verifies their SHA-256 values: Matrix Authorization Strategy 3.3, Ionicons API `94.vcc3065403257`, and commons-lang3 API `3.18.0-98.v3a_674c06072d`.\n4. It pulls Jenkins by immutable image digest: vulnerable 2.579 (`sha256:a7342867…d7412be`) and fixed 2.580 (`sha256:0e50a5b1…0839b1`).\n5. For each of two vulnerable and two fixed clean controller processes, it provisions `admin` and a low-privilege `attacker`, creates the `carrier` freestyle job, verifies that direct Script Console access returns 403, submits the crafted XML over authenticated HTTP, and posts unique Groovy to the forged route.\n6. Vulnerable success requires HTTP 200, the unique marker in both the HTTP response and controller-local marker file, and `uid=1000(jenkins)` output. Fixed success requires a non-success forged-route status, marker absence, and absence of the nested graph from the resulting job XML.\n7. The script finalizes controller logs, writes `bundle/repro/runtime_manifest.json` with SHA-256 bindings for all immutable proof artifacts, prints `CONFIRMED`, and exits 0 only if every assertion passes.\n\nExpected terminal output:\n\n```text\nCONFIRMED: SECURITY-3972 achieved authenticated remote command execution on two Jenkins 2.579 controllers; two Jenkins 2.580 controls failed closed.\n```\n\n## Evidence\n\nPrimary current-run evidence is under `bundle/repro/proof/`, and every file is bound in `bundle/repro/runtime_manifest.json`:\n\n- `vulnerable_1.route.response.body` and `vulnerable_2.route.response.body` contain unique markers and controller command output. Latest run excerpts:\n\n  ```text\n  Result: {marker=CVE_2026_84645_vulnerable_1_12521_12184, id=uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)}\n  Result: {marker=CVE_2026_84645_vulnerable_2_12521_18651, id=uid=1000(jenkins) gid=1000(jenkins) groups=1000(jenkins)}\n  ```\n\n- `vulnerable_1.marker.txt` and `vulnerable_2.marker.txt` are controller-local command markers whose bytes match the per-process values in `vulnerable_1.capability_observation.json` and `vulnerable_2.capability_observation.json`.\n- `vulnerable_{1,2}.direct_console.headers` begin with `HTTP/1.1 403 Forbidden`, proving the attacker did not already have Script Console access.\n- `vulnerable_{1,2}.config.request.txt` record the redacted authenticated API request and exact nested graph.\n- `vulnerable_{1,2}.route.request.txt` record the forged Stapler route and bounded Groovy effect.\n- `fixed_{1,2}.route.response.headers` begin with `HTTP/1.1 404 Not Found`.\n- `fixed_{1,2}.marker_absent.txt` and `fixed_{1,2}.negative_control.json` record that the corresponding unique marker was not created after the same procedure reached the fixed target.\n- `fixed_{1,2}.config.after.xml` contain the empty `SCMTrigger_-BuildAction` and no nested `FreeStyleBuild`.\n- `target_identity.txt` records the immutable image digests/image IDs, source tag commits, platform, and architecture.\n- `vulnerable_{1,2}.service.log` and `fixed_{1,2}.service.log` show real Jenkins 2.579/2.580 startup and production service initialization.\n- `bundle/logs/reproduction_steps.log` and `bundle/logs/reproduction_steps_second.log` show two consecutive successful executions of the final script.\n\nEnvironment identity:\n\n- Vulnerable source tag commit: `9095ea3a5c5e7dcd392695a5dd880af1c9910ddf` (`jenkins-2.579`).\n- Fixed source tag commit: `497de4961ad80d97e26bfdeb0d2e40442a84ecb0` (`jenkins-2.580`).\n- Vulnerable image digest: `sha256:a7342867ea33efaacf825229d50b7fc77c144ecada9719ab4e32419f5d7412be`.\n- Fixed image digest: `sha256:0e50a5b11ac14f3b84e529d725ed3a1c4b17ba16188dfa8d9a0189428b0839b1`.\n- Runtime platform: Linux x86-64/amd64, Docker, Jenkins bundled JVM 21.\n- Sanitizers: None.\n\n## Recommendations / Next Steps\n\n- Upgrade Jenkins weekly to 2.580 or later, or Jenkins LTS to 2.568.3 or later.\n- Preserve the fixed `PersistenceRoot` structural check and its safe-reference exceptions; do not rely on class allowlisting alone for objects with graph-position invariants.\n- Retain the second-singleton guard in `Jenkins#readResolve` as defense in depth.\n- Review plugin-defined `PersistenceRoot` implementations and plugin actions that expose routable accessors to root objects.\n- Add regression tests for all configuration-accepting endpoints, including jobs, nodes, builds, users, views, and plugin-defined XML documents. Tests should verify both deserialization rejection/neutralization and that Stapler cannot traverse any partially retained graph.\n- Independently test safe back-references, `writeReplace`/`readResolve` placeholders, and single-value converters to avoid compatibility regressions without weakening the structural policy.\n\n## Additional Notes\n\n- **Idempotency:** Confirmed. The final `bundle/repro/reproduction_steps.sh` passed twice consecutively. Each execution created two new vulnerable and two new fixed Jenkins controller processes with unique container IDs and markers.\n- **Privileges:** The `attacker` account has only Overall/Read, Item/Read, and Item/Configure. A direct `/scriptText` request is a mandatory 403 negative precondition in all four attempts.\n- **Safety:** The only command effects are a uniquely named file under the ephemeral controller's `/tmp` and `id`; all test containers are removed on completion or interruption.\n- **Fixed behavior nuance:** The 2.580 endpoint returned HTTP 200 for the configuration update while omitting the prohibited nested values. Security parity is established by the non-routable graph, HTTP 404 forged route, and marker absence rather than by requiring the initial XML POST itself to return an error.\n- **Network dependency:** A cold run needs access to the pinned Jenkins images and plugin URLs. A warm prepared cache reuses exact plugin bytes, and Docker reuses digest-addressed images.\n","cve_id":"CVE-2026-84645","cwe_id":"CWE-94","source_url":"https://www.jenkins.io/security/advisory/2026-09-02/","package":{"name":"jenkinsci/jenkins","ecosystem":"github","affected_versions":"Jenkins weekly 2.579 and earlier; Jenkins LTS 2.568.2 and earlier."},"reproduced_at":"2026-09-03T17:02:18.865351+00:00","duration_secs":2644.959138,"tool_calls":502,"handoffs":2,"total_cost_usd":23.715383,"agent_costs":{"claim_matcher":0.036731,"judge":0.741126,"learning_policy":0.010754,"repro":15.361564,"support":0.38528,"vuln_variant":7.179928},"cost_breakdown":{"claim_matcher":{"gpt-5.4-mini-2026-03-17":0.036731},"judge":{"gpt-5.6-sol":0.741126},"learning_policy":{"gpt-5.4-mini-2026-03-17":0.010754},"repro":{"gpt-5.6-sol":15.361564},"support":{"gpt-5.6-sol":0.38528},"vuln_variant":{"gpt-5.6-sol":7.179928}},"vulnerable_version_variant_outcome":"found","fix_bypass_outcome":"not_found","variant_disclosure_state":"published","quality":{"confidence":"high","idempotent_verified":false,"community_verifications":0},"evidence":{"workflow":{"profile":"known_vulnerability","schema_version":2,"stages":["support","claim_contract","repro","judge","vuln_variant"]}},"environment":{"sandbox_image":"ghcr.io/n3mes1s/pruva-sandbox@sha256:8096b2518d6022e13d68f885c3b8ded6b4fe607098b1a1ccbfb99abc004d1dc1"},"published_at":"2026-09-03T17:02:21.374535+00:00","retracted":false,"artifacts":[{"path":"bundle/repro/rca_report.md","filename":"rca_report.md","size":11081,"category":"analysis"},{"path":"bundle/repro/reproduction_steps.sh","filename":"reproduction_steps.sh","size":15151,"category":"reproduction_script"},{"path":"bundle/vuln_variant/rca_report.md","filename":"rca_report.md","size":12752,"category":"analysis"},{"path":"bundle/vuln_variant/reproduction_steps.sh","filename":"reproduction_steps.sh","size":18797,"category":"reproduction_script"},{"path":"bundle/logs/reproduction_steps.log","filename":"reproduction_steps.log","size":446,"category":"log"},{"path":"bundle/logs/reproduction_steps_second.log","filename":"reproduction_steps_second.log","size":446,"category":"log"},{"path":"bundle/logs/vuln_variant/fixed_version.txt","filename":"fixed_version.txt","size":910,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.container_id.txt","filename":"fixed.container_id.txt","size":65,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.direct_console.body","filename":"fixed.direct_console.body","size":19972,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.direct_console.headers","filename":"fixed.direct_console.headers","size":1504,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.exceptions.config.after.xml","filename":"fixed.exceptions.config.after.xml","size":757,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.exceptions.config.response.body","filename":"fixed.exceptions.config.response.body","size":0,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.exceptions.config.response.headers","filename":"fixed.exceptions.config.response.headers","size":398,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.exceptions.fingerprints.body","filename":"fixed.exceptions.fingerprints.body","size":19328,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.exceptions.fingerprints.headers","filename":"fixed.exceptions.fingerprints.headers","size":1200,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.exceptions.fingerprints.marker_absent.txt","filename":"fixed.exceptions.fingerprints.marker_absent.txt","size":57,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.exceptions.parameters.body","filename":"fixed.exceptions.parameters.body","size":19328,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.exceptions.parameters.headers","filename":"fixed.exceptions.parameters.headers","size":1202,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.exceptions.parameters.marker_absent.txt","filename":"fixed.exceptions.parameters.marker_absent.txt","size":55,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.fingerprint.config.after.xml","filename":"fixed.fingerprint.config.after.xml","size":624,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.fingerprint.config.request.txt","filename":"fixed.fingerprint.config.request.txt","size":1385,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.fingerprint.config.response.body","filename":"fixed.fingerprint.config.response.body","size":0,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.fingerprint.config.response.headers","filename":"fixed.fingerprint.config.response.headers","size":398,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.fingerprint.marker_absent.txt","filename":"fixed.fingerprint.marker_absent.txt","size":54,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.fingerprint.observation.json","filename":"fixed.fingerprint.observation.json","size":191,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.fingerprint.route.request.txt","filename":"fixed.fingerprint.route.request.txt","size":257,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.fingerprint.route.response.body","filename":"fixed.fingerprint.route.response.body","size":19328,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.fingerprint.route.response.headers","filename":"fixed.fingerprint.route.response.headers","size":1200,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.health.json","filename":"fixed.health.json","size":732,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.parameters.config.after.xml","filename":"fixed.parameters.config.after.xml","size":705,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.parameters.config.request.txt","filename":"fixed.parameters.config.request.txt","size":1367,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.parameters.config.response.body","filename":"fixed.parameters.config.response.body","size":0,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.parameters.config.response.headers","filename":"fixed.parameters.config.response.headers","size":398,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.parameters.marker_absent.txt","filename":"fixed.parameters.marker_absent.txt","size":53,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.parameters.observation.json","filename":"fixed.parameters.observation.json","size":189,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.parameters.route.request.txt","filename":"fixed.parameters.route.request.txt","size":254,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.parameters.route.response.body","filename":"fixed.parameters.route.response.body","size":19328,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.parameters.route.response.headers","filename":"fixed.parameters.route.response.headers","size":1202,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/fixed.service.log","filename":"fixed.service.log","size":4847,"category":"log"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.container_id.txt","filename":"vulnerable.container_id.txt","size":65,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.direct_console.body","filename":"vulnerable.direct_console.body","size":19972,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.direct_console.headers","filename":"vulnerable.direct_console.headers","size":1504,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.exceptions.config.after.xml","filename":"vulnerable.exceptions.config.after.xml","size":757,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.exceptions.config.response.body","filename":"vulnerable.exceptions.config.response.body","size":0,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.exceptions.config.response.headers","filename":"vulnerable.exceptions.config.response.headers","size":398,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.exceptions.fingerprints.body","filename":"vulnerable.exceptions.fingerprints.body","size":19328,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.exceptions.fingerprints.headers","filename":"vulnerable.exceptions.fingerprints.headers","size":1200,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.exceptions.fingerprints.marker_absent.txt","filename":"vulnerable.exceptions.fingerprints.marker_absent.txt","size":62,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.exceptions.parameters.body","filename":"vulnerable.exceptions.parameters.body","size":19328,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.exceptions.parameters.headers","filename":"vulnerable.exceptions.parameters.headers","size":1201,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.exceptions.parameters.marker_absent.txt","filename":"vulnerable.exceptions.parameters.marker_absent.txt","size":60,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.fingerprint.config.after.xml","filename":"vulnerable.fingerprint.config.after.xml","size":624,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.fingerprint.config.request.txt","filename":"vulnerable.fingerprint.config.request.txt","size":1385,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.fingerprint.config.response.body","filename":"vulnerable.fingerprint.config.response.body","size":0,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.fingerprint.config.response.headers","filename":"vulnerable.fingerprint.config.response.headers","size":398,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.fingerprint.marker.txt","filename":"vulnerable.fingerprint.marker.txt","size":64,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.fingerprint.observation.json","filename":"vulnerable.fingerprint.observation.json","size":200,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.fingerprint.route.request.txt","filename":"vulnerable.fingerprint.route.request.txt","size":262,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.fingerprint.route.response.body","filename":"vulnerable.fingerprint.route.response.body","size":143,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.fingerprint.route.response.headers","filename":"vulnerable.fingerprint.route.response.headers","size":447,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.health.json","filename":"vulnerable.health.json","size":732,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.parameters.config.after.xml","filename":"vulnerable.parameters.config.after.xml","size":705,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.parameters.config.request.txt","filename":"vulnerable.parameters.config.request.txt","size":1367,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.parameters.config.response.body","filename":"vulnerable.parameters.config.response.body","size":0,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.parameters.config.response.headers","filename":"vulnerable.parameters.config.response.headers","size":398,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.parameters.marker_absent.txt","filename":"vulnerable.parameters.marker_absent.txt","size":58,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.parameters.observation.json","filename":"vulnerable.parameters.observation.json","size":199,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.parameters.route.request.txt","filename":"vulnerable.parameters.route.request.txt","size":259,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.parameters.route.response.body","filename":"vulnerable.parameters.route.response.body","size":19328,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.parameters.route.response.headers","filename":"vulnerable.parameters.route.response.headers","size":1201,"category":"other"},{"path":"bundle/logs/vuln_variant/proof/vulnerable.service.log","filename":"vulnerable.service.log","size":6402,"category":"log"},{"path":"bundle/logs/vuln_variant/reproduction_first.log","filename":"reproduction_first.log","size":244,"category":"log"},{"path":"bundle/logs/vuln_variant/reproduction_second.log","filename":"reproduction_second.log","size":244,"category":"log"},{"path":"bundle/repro/proof/fixed_1.config.after.xml","filename":"fixed_1.config.after.xml","size":613,"category":"other"},{"path":"bundle/repro/proof/fixed_1.config.response.body","filename":"fixed_1.config.response.body","size":0,"category":"other"},{"path":"bundle/repro/proof/fixed_1.config.response.headers","filename":"fixed_1.config.response.headers","size":398,"category":"other"},{"path":"bundle/repro/proof/fixed_1.container_id.txt","filename":"fixed_1.container_id.txt","size":65,"category":"other"},{"path":"bundle/repro/proof/fixed_1.direct_console.body","filename":"fixed_1.direct_console.body","size":19972,"category":"other"},{"path":"bundle/repro/proof/fixed_1.direct_console.headers","filename":"fixed_1.direct_console.headers","size":1503,"category":"other"},{"path":"bundle/repro/proof/fixed_1.health.json","filename":"fixed_1.health.json","size":732,"category":"other"},{"path":"bundle/repro/proof/fixed_1.marker_absent.txt","filename":"fixed_1.marker_absent.txt","size":59,"category":"other"},{"path":"bundle/repro/proof/fixed_1.route.request.txt","filename":"fixed_1.route.request.txt","size":263,"category":"other"},{"path":"bundle/repro/proof/fixed_1.route.response.body","filename":"fixed_1.route.response.body","size":19328,"category":"other"},{"path":"bundle/repro/proof/fixed_1.service.log","filename":"fixed_1.service.log","size":4366,"category":"log"},{"path":"bundle/repro/proof/fixed_2.config.after.xml","filename":"fixed_2.config.after.xml","size":613,"category":"other"},{"path":"bundle/repro/proof/fixed_2.config.request.txt","filename":"fixed_2.config.request.txt","size":1352,"category":"other"},{"path":"bundle/repro/proof/fixed_2.config.response.body","filename":"fixed_2.config.response.body","size":0,"category":"other"},{"path":"bundle/repro/proof/fixed_2.config.response.headers","filename":"fixed_2.config.response.headers","size":398,"category":"other"},{"path":"bundle/repro/proof/fixed_2.container_id.txt","filename":"fixed_2.container_id.txt","size":65,"category":"other"},{"path":"bundle/repro/proof/fixed_2.direct_console.body","filename":"fixed_2.direct_console.body","size":19972,"category":"other"},{"path":"bundle/repro/proof/fixed_2.direct_console.headers","filename":"fixed_2.direct_console.headers","size":1504,"category":"other"},{"path":"bundle/repro/proof/fixed_2.health.json","filename":"fixed_2.health.json","size":732,"category":"other"},{"path":"bundle/repro/proof/fixed_2.marker_absent.txt","filename":"fixed_2.marker_absent.txt","size":59,"category":"other"},{"path":"bundle/repro/proof/fixed_2.negative_control.json","filename":"fixed_2.negative_control.json","size":212,"category":"other"},{"path":"bundle/repro/proof/fixed_2.route.request.txt","filename":"fixed_2.route.request.txt","size":263,"category":"other"},{"path":"bundle/repro/proof/fixed_2.route.response.body","filename":"fixed_2.route.response.body","size":19328,"category":"other"},{"path":"bundle/repro/proof/fixed_2.route.response.headers","filename":"fixed_2.route.response.headers","size":1200,"category":"other"},{"path":"bundle/repro/proof/fixed_2.service.log","filename":"fixed_2.service.log","size":4366,"category":"log"},{"path":"bundle/repro/proof/target_identity.txt","filename":"target_identity.txt","size":598,"category":"other"},{"path":"bundle/repro/proof/vulnerable_1.config.after.xml","filename":"vulnerable_1.config.after.xml","size":613,"category":"other"},{"path":"bundle/repro/proof/vulnerable_1.config.response.body","filename":"vulnerable_1.config.response.body","size":0,"category":"other"},{"path":"bundle/repro/proof/vulnerable_1.config.response.headers","filename":"vulnerable_1.config.response.headers","size":398,"category":"other"},{"path":"bundle/repro/proof/vulnerable_1.container_id.txt","filename":"vulnerable_1.container_id.txt","size":65,"category":"other"},{"path":"bundle/repro/proof/vulnerable_1.direct_console.body","filename":"vulnerable_1.direct_console.body","size":19972,"category":"other"},{"path":"bundle/repro/proof/vulnerable_1.direct_console.headers","filename":"vulnerable_1.direct_console.headers","size":1503,"category":"other"},{"path":"bundle/repro/proof/vulnerable_1.health.json","filename":"vulnerable_1.health.json","size":732,"category":"other"},{"path":"bundle/repro/proof/vulnerable_1.route.response.headers","filename":"vulnerable_1.route.response.headers","size":447,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.capability_observation.json","filename":"vulnerable_2.capability_observation.json","size":216,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.config.after.xml","filename":"vulnerable_2.config.after.xml","size":613,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.config.request.txt","filename":"vulnerable_2.config.request.txt","size":1352,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.config.response.body","filename":"vulnerable_2.config.response.body","size":0,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.config.response.headers","filename":"vulnerable_2.config.response.headers","size":398,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.container_id.txt","filename":"vulnerable_2.container_id.txt","size":65,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.direct_console.body","filename":"vulnerable_2.direct_console.body","size":19972,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.direct_console.headers","filename":"vulnerable_2.direct_console.headers","size":1503,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.health.json","filename":"vulnerable_2.health.json","size":732,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.route.request.txt","filename":"vulnerable_2.route.request.txt","size":268,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.route.response.body","filename":"vulnerable_2.route.response.body","size":118,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.route.response.headers","filename":"vulnerable_2.route.response.headers","size":447,"category":"other"},{"path":"bundle/repro/proof/vulnerable_2.service.log","filename":"vulnerable_2.service.log","size":4364,"category":"log"},{"path":"bundle/repro/runtime_manifest.json","filename":"runtime_manifest.json","size":10433,"category":"other"},{"path":"bundle/repro/validation_verdict.json","filename":"validation_verdict.json","size":1401,"category":"other"},{"path":"bundle/vuln_variant/patch_analysis.md","filename":"patch_analysis.md","size":11188,"category":"documentation"},{"path":"bundle/vuln_variant/root_cause_equivalence.json","filename":"root_cause_equivalence.json","size":2013,"category":"other"},{"path":"bundle/vuln_variant/runtime_manifest.json","filename":"runtime_manifest.json","size":14260,"category":"other"},{"path":"bundle/vuln_variant/source_identity.json","filename":"source_identity.json","size":1150,"category":"other"},{"path":"bundle/vuln_variant/validation_verdict.json","filename":"validation_verdict.json","size":3749,"category":"other"},{"path":"bundle/vuln_variant/variant_manifest.json","filename":"variant_manifest.json","size":4347,"category":"other"}]}