{"repro_id":"REPRO-2026-00332","version":7,"title":"Fledge backup upload shell command injection","repro_type":"security","status":"published","severity":"high","description":"# CVE-2026-71284 - Fledge backup upload command injection","root_cause":"## Summary\n\nFledge 3.1.0 is vulnerable to authenticated OS command injection in the production backup-upload REST handler. An administrator can upload a syntactically valid `.tar.gz` archive whose first member starts with `fledge_backup_`, ends with `.db`, and contains shell metacharacters between those accepted strings. `upload_backup()` extracts that member, concatenates its path into `cp {source} {backup_path}`, and executes the result with `os.system()`. A real Fledge service consequently runs the embedded shell command as its `fledge` service user.\n\n## Impact\n\n- **Product/component:** `fledge-iot/fledge`, specifically `python/fledge/services/core/api/backup_restore.py::upload_backup()` and `POST /fledge/backup/upload`.\n- **Affected release tested:** Fledge **3.1.0**, tag and commit `f90ffc2047ee49a380ada98a59fcc2985bd6a943` (database schema 75). The ticket reports versions through 3.1.0 as affected.\n- **Required attacker position:** An authenticated Fledge administrator with access to the backup-upload endpoint.\n- **Risk:** High. The administrator can execute arbitrary local shell commands with the identity and filesystem access of the Fledge service account. In the reproduced deployment that identity was UID 10001, user/group `fledge`.\n- **Consequence demonstrated:** Deterministic command execution through the network API, including attacker-selected file creation and content.\n\n## Impact Parity\n\n- **Disclosed/claimed maximum impact:** Authenticated remote OS command execution as the Fledge service user.\n- **Reproduced impact:** Two fresh vulnerable Fledge 3.1.0 service instances accepted authenticated crafted uploads. Each spawned `/bin/sh -c` with the attacker-controlled member filename and created a distinct attacker-selected marker as `fledge`.\n- **Parity:** `full`.\n- **Not demonstrated:** No privilege escalation beyond the Fledge service account, lateral movement, persistence, or outbound network behavior was attempted or required. These are not part of the claimed maximum impact.\n\n## Root Cause\n\nThe handler applies validation to two different filename layers:\n\n1. The outer multipart filename must start with `fledge_backup_` and end in `.tar.gz`.\n2. At least one archive member must start with `fledge_backup_` and end in `.db` or `.dump`.\n\nFor archives compatible with older Fledge versions, the handler calls `tar_file.extractall(temp_path)`, assigns `backup_file_name = tar_file_names[0]`, and builds `source = temp_path + \"/\" + backup_file_name`. The prefix/suffix checks do not reject shell syntax inside the accepted member name. The vulnerable code then performs:\n\n```python\ncmd = \"cp {} {}\".format(source, backup_path)\nret_code = os.system(cmd)\n```\n\n`os.system()` invokes a command shell. Consequently, characters such as `;`, redirections, and `#` in `source` become shell syntax instead of literal filename bytes. The proof member retains the accepted prefix and `.db` suffix while placing `;printf ...;sleep 2;#` between them. The generated shell command runs `printf`, and the comment suppresses the remainder of the `cp` command.\n\nNo upstream fixed release or fix commit was identified in the ticket or the tested repository state. The reproduction therefore labels its negative control as a **same-version patched control**, not as an upstream fixed version. That control changes only the unsafe copy block to `shutil.copy2(source, backup_path)`. It accepts the same request and copies the literal filename without interpreting its metacharacters, proving that the shell sink is causal.\n\n## Reproduction Steps\n\n1. Run `bundle/repro/reproduction_steps.sh` from any directory. The script resolves `PRUVA_ROOT`, uses `/pruva/project-cache/repo` when the prepared cache contract permits it, and otherwise falls back to `bundle/artifacts/fledge`.\n2. The script checks out exact commit `f90ffc2047ee49a380ada98a59fcc2985bd6a943`, verifies the vulnerable source statements, and builds the real Fledge product in a pinned Ubuntu 22.04 base image. Compilation is bounded to two jobs. The runtime includes the normal rsyslog socket and starts Fledge through its shipped `bin/fledge start` flow.\n3. It generates deterministic minimal archives at runtime and exercises:\n   - one normal valid backup upload (marker must remain absent);\n   - two fresh vulnerable service instances with distinct crafted archives and markers;\n   - two fresh same-version patched-control instances with the exact corresponding archive bytes (requests succeed, literal files are copied, and markers remain absent).\n4. Each service must become healthy at `/fledge/ping`, report version 3.1.0 with mandatory authentication, and accept a normal `admin` login before the upload.\n5. The vulnerable requests must return HTTP 200, produce service debug logs showing the generated `cp` command, produce `strace` evidence of `/bin/sh -c`, show the shell as a child of the Fledge core process, and create markers owned by `fledge`.\n6. Expected final output includes:\n\n```text\n[+] CONFIRMED: authenticated remote OS command execution through Fledge 3.1.0 backup upload API\n[+] Vulnerable markers: PRUVA_CVE_2026_71284_ATTEMPT_1, PRUVA_CVE_2026_71284_ATTEMPT_2\n[+] Benign and same-version patched controls reached the endpoint without marker execution\n```\n\nThe final script was executed twice consecutively and returned exit status 0 on both runs.\n\n## Evidence\n\nCurrent-run evidence is under `bundle/logs/repro/cve-2026-71284/`; `bundle/repro/runtime_manifest.json` binds every finalized artifact to its SHA-256.\n\nKey artifacts include:\n\n- `proof_summary.json` — concise result, exact commit and image identities, four fresh process/container identities, two successful vulnerable markers, and negative-control outcomes.\n- `source_identity.json` — repository, v3.1.0 commit, vulnerable file digest, and canonical source target digest.\n- `runtime_image_identity.txt` — pinned base, vulnerable image ID, patched-control image ID, and Docker inspection output.\n- `vulnerable_1_health_response.json` and `vulnerable_2_health_response.json` — real service health, version 3.1.0, and mandatory authentication.\n- `vulnerable_{1,2}_login_request.json` / `login_response.json` — normal administrator authentication with current tokens redacted from retained proof.\n- `vulnerable_{1,2}_upload_request.json` / `upload_response.json` — authenticated production endpoint transactions.\n- `vulnerable_{1,2}_service.log` — handler debug output containing attacker-controlled `source` and the constructed shell command.\n- `vulnerable_{1,2}_execve_trace.log` and `shell_lineage.log` — syscall/process evidence. A representative excerpt is:\n\n```text\nexecve(\"/bin/sh\", [\"sh\", \"-c\", \"cp /var/lib/fledge/upload/fledge_backup_...db;printf PRUVA_CVE_2026_71284_ATTEMPT_1 >/tmp/pruva_cve_2026_71284_attempt_1;sleep 2;#.db /var/lib/fledge/backup\"], ...)\n```\n\n- `vulnerable_1_process_tree_during_attack.txt` — live lineage showing PID 155 `python3 -m fledge.services.core` (user `fledge`) parenting PID 579 `sh -c ...`, which parents `sleep 2`.\n- `vulnerable_{1,2}_marker.txt` — exact attacker-selected marker bytes.\n- `vulnerable_{1,2}_marker_stat.txt` — marker ownership and mode. Both record `uid=10001 user=fledge ... group=fledge`.\n- `benign_control_*` — a conventional valid backup succeeds without a marker and appears in the backup directory.\n- `patched_{1,2}_negative_control.json`, `patched_{1,2}_execve_trace.log`, `patched_{1,2}_service.log`, and `patched_{1,2}_backup_listing.txt` — the same crafted archive reaches the same endpoint in the same release, but no attacker command is passed to `execve`; the source is copied as a literal filename and no marker appears.\n- `patched_control_source.txt` — exact behavior-preserving control statement using `shutil.copy2`.\n- `bundle/logs/reproduction_steps.log` and `bundle/logs/fledge-image-build.log` — diagnostics for the final run; these are not hashed as immutable proof while active.\n\nThe final runtime manifest records `entrypoint_kind=\"endpoint\"`, `service_started=true`, `healthcheck_passed=true`, `target_path_reached=true`, exact source commit, source target digest, vulnerable runtime image digest, Linux/x86-64 platform, and 101 finalized proof artifacts.\n\n## Recommendations / Next Steps\n\n1. Remove the shell from the copy operation. Prefer `shutil.copy2(source, backup_path)` or another API that treats source and destination as literal path arguments. If an external utility is unavoidable, invoke it with an argument vector and `shell=False`; do not build a shell command string.\n2. Validate and normalize every archive member before extraction. Reject absolute paths, `..` traversal, links, device entries, control characters, and filenames outside a narrowly defined grammar. Extract only explicitly accepted members rather than calling unrestricted `extractall()`.\n3. Do not rely solely on `startswith()`/`endswith()` for a security boundary. A suitable allowlist should constrain the entire backup basename, for example a known timestamp pattern and the exact `.db`/`.dump` extension.\n4. Add production-path tests that upload names containing `;`, `$()`, backticks, quotes, whitespace, redirection operators, glob characters, newlines, and traversal sequences. Assert no child shell is created and that literal-safe backups still work.\n5. Add a regression test using the same crafted archive against the real authenticated API and monitor process ancestry (`Fledge core -> shell`) to ensure the unsafe behavior is gone.\n6. Until an upstream release containing a verified fix exists, restrict the endpoint to trusted administrators, isolate the service account, minimize writable paths and privileges, and alert on shell processes spawned by the Fledge core service.\n\n## Additional Notes\n\n- **Idempotency:** Confirmed. The script removes prior evidence/work directories and uniquely names containers; it completed successfully twice in succession. Each individual final run itself used two clean vulnerable and two clean patched-control service instances.\n- **Real boundary:** The proof uses the compiled Fledge 3.1.0 core and storage service, normal product initialization, `/fledge/login`, and `POST /fledge/backup/upload` over localhost TCP. It does not invoke `upload_backup()` directly and uses no mock handler.\n- **Sanitizers:** None used. The success oracle is real command execution, not a sanitizer or crash.\n- **Authentication:** Fledge's normal first-install administrator credential was used only inside the isolated containers. Retained request evidence redacts the credential and retained responses redact JWTs.\n- **Container capabilities:** `SYS_PTRACE` and an unconfined seccomp profile are used only so `strace` can capture child process execution. They do not enable the injection, change product parsing, or create the marker; vulnerable execution was independently observed before adding tracing.\n- **Upstream status:** No released fixed version is asserted. The negative control is explicitly source-modified Fledge 3.1.0 for causal verification.\n- **Limitations:** The proof requires a working Docker daemon and network access on an uncached first build to obtain the pinned base and package dependencies. It performs no outbound access from the exploit payload.\n","cve_id":"CVE-2026-71284","source_url":"https://github.com/fledge-iot/fledge","package":{"name":"fledge-iot/fledge","ecosystem":"github","affected_versions":"CVE.org lists versions 0 through 3.1.0 as affected; the ticket requires proof on 3.1.0."},"reproduced_at":"2026-08-23T15:39:05.410339+00:00","duration_secs":5463.0,"tool_calls":502,"handoffs":2,"total_cost_usd":75.200715,"agent_costs":{"claim_matcher":0.142541,"judge":0.833424,"learning_policy":0.014072,"repro":70.413455,"support":0.669379,"vuln_variant":3.127844},"cost_breakdown":{"claim_matcher":{"gpt-5.6-sol":0.142541},"judge":{"gpt-5.6-sol":0.833424},"learning_policy":{"gpt-5.4-mini-2026-03-17":0.014072},"repro":{"gpt-5.6-sol":70.413455},"support":{"gpt-5.6-sol":0.669379},"vuln_variant":{"gpt-5.6-sol":3.127844}},"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-08-23T15:39:06.941260+00:00","retracted":false,"artifacts":[{"path":"bundle/repro/rca_report.md","filename":"rca_report.md","size":11281,"category":"analysis"},{"path":"bundle/repro/reproduction_steps.sh","filename":"reproduction_steps.sh","size":30149,"category":"reproduction_script"},{"path":"bundle/logs/repro/cve-2026-71284/benign_control_backup_listing.txt","filename":"benign_control_backup_listing.txt","size":37,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/benign_control_observation.json","filename":"benign_control_observation.json","size":220,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/benign_control_upload_request.json","filename":"benign_control_upload_request.json","size":353,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/benign_control_upload_response.headers","filename":"benign_control_upload_response.headers","size":158,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/benign_control_upload_response.json","filename":"benign_control_upload_response.json","size":72,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/inputs/archive_sha256.txt","filename":"archive_sha256.txt","size":439,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/inputs/attack_1_member_name.txt","filename":"attack_1_member_name.txt","size":125,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/inputs/attack_2_member_name.txt","filename":"attack_2_member_name.txt","size":125,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/inputs/fledge_backup_attack_1.tar.gz","filename":"fledge_backup_attack_1.tar.gz","size":273,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/inputs/fledge_backup_attack_2.tar.gz","filename":"fledge_backup_attack_2.tar.gz","size":273,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/inputs/fledge_backup_benign.tar.gz","filename":"fledge_backup_benign.tar.gz","size":163,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_backup_listing.txt","filename":"patched_1_backup_listing.txt","size":44,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_container_console.log","filename":"patched_1_container_console.log","size":30389,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_container_final.json","filename":"patched_1_container_final.json","size":9887,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_container_running.json","filename":"patched_1_container_running.json","size":10383,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_execve_trace.log","filename":"patched_1_execve_trace.log","size":2596,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_final_process_tree.txt","filename":"patched_1_final_process_tree.txt","size":687,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_health_request.txt","filename":"patched_1_health_request.txt","size":34,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_health_response.json","filename":"patched_1_health_response.json","size":248,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_logging_request.json","filename":"patched_1_logging_request.json","size":92,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_logging_response.json","filename":"patched_1_logging_response.json","size":242,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_login_request.json","filename":"patched_1_login_request.json","size":164,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_login_response.headers","filename":"patched_1_login_response.headers","size":159,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_login_response.json","filename":"patched_1_login_response.json","size":115,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_negative_control.json","filename":"patched_1_negative_control.json","size":220,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_runtime_identity.txt","filename":"patched_1_runtime_identity.txt","size":30531,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_service.log","filename":"patched_1_service.log","size":17667,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_strace_attach.log","filename":"patched_1_strace_attach.log","size":451,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_upload_request.json","filename":"patched_1_upload_request.json","size":355,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_upload_response.headers","filename":"patched_1_upload_response.headers","size":158,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_1_upload_response.json","filename":"patched_1_upload_response.json","size":74,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_backup_listing.txt","filename":"patched_2_backup_listing.txt","size":44,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_container_console.log","filename":"patched_2_container_console.log","size":30966,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_container_final.json","filename":"patched_2_container_final.json","size":9886,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_container_running.json","filename":"patched_2_container_running.json","size":10383,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_execve_trace.log","filename":"patched_2_execve_trace.log","size":2631,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_final_process_tree.txt","filename":"patched_2_final_process_tree.txt","size":687,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_health_request.txt","filename":"patched_2_health_request.txt","size":34,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_health_response.json","filename":"patched_2_health_response.json","size":248,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_logging_request.json","filename":"patched_2_logging_request.json","size":92,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_logging_response.json","filename":"patched_2_logging_response.json","size":242,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_login_request.json","filename":"patched_2_login_request.json","size":164,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_login_response.headers","filename":"patched_2_login_response.headers","size":159,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_login_response.json","filename":"patched_2_login_response.json","size":115,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_negative_control.json","filename":"patched_2_negative_control.json","size":220,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_runtime_identity.txt","filename":"patched_2_runtime_identity.txt","size":30874,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_service.log","filename":"patched_2_service.log","size":17667,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_strace_attach.log","filename":"patched_2_strace_attach.log","size":509,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_upload_request.json","filename":"patched_2_upload_request.json","size":355,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_upload_response.headers","filename":"patched_2_upload_response.headers","size":158,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_2_upload_response.json","filename":"patched_2_upload_response.json","size":74,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/patched_control_source.txt","filename":"patched_control_source.txt","size":514,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/proof_summary.json","filename":"proof_summary.json","size":1254,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/runtime_image_identity.txt","filename":"runtime_image_identity.txt","size":9246,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/source_identity.json","filename":"source_identity.json","size":334,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_capability_observation.json","filename":"vulnerable_1_capability_observation.json","size":219,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_container_console.log","filename":"vulnerable_1_container_console.log","size":6062,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_container_final.json","filename":"vulnerable_1_container_final.json","size":9657,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_container_running.json","filename":"vulnerable_1_container_running.json","size":10153,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_final_process_tree.txt","filename":"vulnerable_1_final_process_tree.txt","size":620,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_health_request.txt","filename":"vulnerable_1_health_request.txt","size":34,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_health_response.json","filename":"vulnerable_1_health_response.json","size":248,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_logging_request.json","filename":"vulnerable_1_logging_request.json","size":92,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_logging_response.json","filename":"vulnerable_1_logging_response.json","size":242,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_login_request.json","filename":"vulnerable_1_login_request.json","size":164,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_login_response.headers","filename":"vulnerable_1_login_response.headers","size":159,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_login_response.json","filename":"vulnerable_1_login_response.json","size":115,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_marker.txt","filename":"vulnerable_1_marker.txt","size":30,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_marker_stat.txt","filename":"vulnerable_1_marker_stat.txt","size":101,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_runtime_identity.txt","filename":"vulnerable_1_runtime_identity.txt","size":30581,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_service.log","filename":"vulnerable_1_service.log","size":18590,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_shell_lineage.log","filename":"vulnerable_1_shell_lineage.log","size":261,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_strace_attach.log","filename":"vulnerable_1_strace_attach.log","size":596,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_upload_response.headers","filename":"vulnerable_1_upload_response.headers","size":158,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_1_upload_response.json","filename":"vulnerable_1_upload_response.json","size":74,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_capability_observation.json","filename":"vulnerable_2_capability_observation.json","size":219,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_container_console.log","filename":"vulnerable_2_container_console.log","size":31932,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_container_final.json","filename":"vulnerable_2_container_final.json","size":9657,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_container_running.json","filename":"vulnerable_2_container_running.json","size":10153,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_final_process_tree.txt","filename":"vulnerable_2_final_process_tree.txt","size":687,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_health_request.txt","filename":"vulnerable_2_health_request.txt","size":34,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_health_response.json","filename":"vulnerable_2_health_response.json","size":248,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_logging_request.json","filename":"vulnerable_2_logging_request.json","size":92,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_logging_response.json","filename":"vulnerable_2_logging_response.json","size":242,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_login_request.json","filename":"vulnerable_2_login_request.json","size":164,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_login_response.headers","filename":"vulnerable_2_login_response.headers","size":159,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_login_response.json","filename":"vulnerable_2_login_response.json","size":115,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_marker.txt","filename":"vulnerable_2_marker.txt","size":30,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_marker_stat.txt","filename":"vulnerable_2_marker_stat.txt","size":101,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_process_tree_during_attack.txt","filename":"vulnerable_2_process_tree_during_attack.txt","size":2372,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_runtime_identity.txt","filename":"vulnerable_2_runtime_identity.txt","size":30776,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_service.log","filename":"vulnerable_2_service.log","size":18876,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_shell_lineage.log","filename":"vulnerable_2_shell_lineage.log","size":261,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_strace_attach.log","filename":"vulnerable_2_strace_attach.log","size":596,"category":"log"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_upload_request.json","filename":"vulnerable_2_upload_request.json","size":355,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_upload_response.headers","filename":"vulnerable_2_upload_response.headers","size":158,"category":"other"},{"path":"bundle/logs/repro/cve-2026-71284/vulnerable_2_upload_response.json","filename":"vulnerable_2_upload_response.json","size":74,"category":"other"},{"path":"bundle/repro/runtime_manifest.json","filename":"runtime_manifest.json","size":20924,"category":"other"},{"path":"bundle/repro/validation_verdict.json","filename":"validation_verdict.json","size":869,"category":"other"}]}