# REPRO-2026-00296: Reported Horilla protected_media Referer authentication bypass ## Summary Status: published Severity: high CVSS: Unknown CWE: Unknown Type: security Confidence: high ## Identifiers REPRO ID: REPRO-2026-00296 GHSA: GHSA-9WJX-4J4R-FF8W ## Package Name: horilla/horilla-hr Ecosystem: github Affected: Unknown Fixed: Unknown ## Root Cause ## Summary Horilla HRMS tag 1.5.0 exposes a protected media authorization bypass in the real Django `/media/` route. The vulnerable `protected_media()` view treats the path portion of the unauthenticated request's `Referer` header as proof that the media request originated from a public page. A remote unauthenticated attacker can therefore request a nonpublic file under `MEDIA_ROOT` and change only `Referer` from absent to `http://attacker.invalid/login`; Horilla 1.5.0 then returns the exact private file body. Horilla 1.6.0 removes this Referer-derived authorization decision and denies the same unauthenticated request. ## Impact - Package/component affected: Horilla HRMS, `base.views.protected_media()` served through the real `/media/` HTTP endpoint. - Affected version reproduced: tag `1.5.0`, commit `61bd5173220d19925ad8220db9152a75c881ea73`. - Fixed version verified: tag `1.6.0`, commit `b3bd29d15819cbece45c58e6268ddd0614e387d6`; source fix commit `b6eaec1386d8b8741a42fe7c78f318f073375791` is an ancestor of the fixed tag. - Risk level and consequences: high severity authorization bypass. An unauthenticated attacker who knows or can guess a private in-root media path can read that file without a cookie, session, bearer token, JWT, or any application credential. This run demonstrated unauthorized read of a randomly generated private canary under `MEDIA_ROOT` and did not demonstrate traversal, account takeover, session forgery, or code execution. ## Impact Parity - Disclosed/claimed maximum impact: `authz_bypass` / unauthorized read of an exact nonpublic in-root media file via attacker-controlled `Referer` on the real Horilla `/media/` route. - Reproduced impact from this run: full production-path `authz_bypass`. Horilla 1.5.0 denied the private canary with no `Referer` but returned HTTP 200 and the exact canary body when only `Referer: http://attacker.invalid/login` was added. Horilla 1.6.0 denied both requests while still serving a generated public liveness asset. - Parity: `full`. - Not demonstrated: path traversal, broader arbitrary file read outside `MEDIA_ROOT`, authenticated privilege changes, account takeover, session forgery, denial of service, or code execution. ## Root Cause In Horilla 1.5.0, `protected_media(request, path)` computes: ```python referer_path = urlparse(request.META.get("HTTP_REFERER", "")).path ``` and then skips the authentication/JWT check when `referer_path` is one of several public pages such as `/login`. Because `Referer` is fully controlled by the HTTP client and is not an authentication boundary, an unauthenticated attacker can set a cross-origin value whose path is `/login`. The view then falls through to: ```python return FileResponse(open(media_path, "rb")) ``` for any existing media path not under the small exempted folder list. The source evidence in `bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/source/protected_media_hunks.log` shows this vulnerable logic in tag 1.5.0 and the fixed 1.6.0 logic. The fixed version removes public-page `Referer` authorization and instead permits only explicit public media path prefixes, uses `safe_join(settings.MEDIA_ROOT, path)`, and requires an authenticated user or valid JWT for all nonpublic media paths. The known fix commit is `b6eaec1386d8b8741a42fe7c78f318f073375791`. ## Reproduction Steps 1. Run `bundle/repro/reproduction_steps.sh` from any directory, optionally with `PRUVA_ROOT=/path/to/bundle`. 2. The script reads `bundle/project_cache_context.json`, reuses or creates `/pruva/project-cache/repo`, verifies the vulnerable and fixed tag commits, installs each tag's own `requirements.txt` into isolated dependency directories, prepares migrated SQLite runtime templates, starts real Horilla Django `manage.py runserver` containers, and sends attacker-process `curl --path-as-is` requests to the real `/media/` route. 3. For each of two clean attempts per role, the script creates a new private canary under a nonpublic `MEDIA_ROOT/private-data//...` path and a public liveness canary under `MEDIA_ROOT/base/icon/...`. It records requests, responses, curl traces, container logs, source identities, and modified-file inventories. 4. Expected evidence: vulnerable attempts show public liveness `200`, baseline private request with no `Referer` `302` denied with no canary in the body, and spoofed `Referer: http://attacker.invalid/login` `200` with response body equal to the private canary. Fixed attempts show public liveness `200` while both baseline and spoofed private requests return `302` and do not contain the canary. ## Evidence - Main reproduction script: `bundle/repro/reproduction_steps.sh`. - Latest successful runtime manifest: `bundle/repro/runtime_manifest.json`. - Latest structured verdict: `bundle/repro/validation_verdict.json`. - Latest complete successful proof directory: `bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/`. - Matrix summary: `bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/matrix_summary.json` with `"all_oracles_passed": true`. - Source comparison: `bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/source/protected_media_hunks.log`. - Per-attempt request/response artifacts include: - Vulnerable attempt 1 request pair: `attempts/vuln_1/baseline_no_referer_request.txt` and `attempts/vuln_1/trigger_spoofed_referer_request.txt`. - Vulnerable attempt 1 body evidence: `attempts/vuln_1/private_canary.txt` and `attempts/vuln_1/trigger_spoofed_referer_response_body.bin` match exactly. - Fixed attempt controls: `attempts/fixed_1/attempt_result.json` and `attempts/fixed_2/attempt_result.json` show both private requests denied and the public liveness route working. - Key latest matrix results: ```json { "all_oracles_passed": true, "attempt_results": [ {"role": "fixed", "attempt": 1, "public_status": "200", "baseline_status": "302", "trigger_status": "302", "oracle_passed": true}, {"role": "fixed", "attempt": 2, "public_status": "200", "baseline_status": "302", "trigger_status": "302", "oracle_passed": true}, {"role": "vuln", "attempt": 1, "public_status": "200", "baseline_status": "302", "trigger_status": "200", "oracle_passed": true}, {"role": "vuln", "attempt": 2, "public_status": "200", "baseline_status": "302", "trigger_status": "200", "oracle_passed": true} ] } ``` - The final script revision was executed successfully twice consecutively. The latest run completed at `2026-07-22T06:00:10Z` and the prior successful run completed at `2026-07-22T05:56:08Z`. ## Recommendations / Next Steps - Upgrade Horilla deployments to version 1.6.0 or later, or apply fix commit `b6eaec1386d8b8741a42fe7c78f318f073375791` if maintaining a downstream branch. - Do not use `Referer`, `Origin`, or other client-controlled metadata as an authorization decision for protected media. - Keep a strict allowlist of genuinely public media prefixes and require a real authenticated user/session or valid token for every other media path. - Retain path containment checks such as Django `safe_join(settings.MEDIA_ROOT, path)` and verify that only regular files under `MEDIA_ROOT` can be opened. - Add regression tests at the real HTTP route level: absent `Referer`, cross-origin `/login` `Referer`, same-origin public pages, authenticated access, JWT access, and public-prefix liveness should all be covered. ## Additional Notes - Idempotency confirmation: `bundle/repro/reproduction_steps.sh` passed two consecutive clean runs. Each run creates fresh random private and public canaries and clean per-attempt SQLite databases. - Runtime accommodations: to start the tagged application in this clean environment, the script installs each tag's dependencies and prepares SQLite migrations using `manage.py makemigrations` for the Horilla project apps before `migrate --run-syncdb`. It records modified-file inventories. It does not modify `base/views.py`, `base/urls.py`, routing, middleware, authentication logic, or file-open behavior. - The attacker requests are made by `curl` from outside the Horilla Django process, do not follow redirects, and explicitly record that no cookie or authorization header is sent. ## Reproduction Details Reproduced: 2026-07-26T17:01:34.254Z Duration: 4629 seconds Tool calls: 276 Turns: Unknown Handoffs: 2 ## Quick Verification Run one of these commands to verify locally: pruva-verify REPRO-2026-00296 pruva-verify GHSA-9WJX-4J4R-FF8W Or open in GitHub Codespaces (zero-friction, auto-runs): https://github.com/codespaces/new?ref=repro/REPRO-2026-00296&repo=N3mes1s/pruva-sandbox Or download and run the script manually: curl -O https://api.pruva.dev/v1/reproductions/REPRO-2026-00296/artifacts/bundle/repro/reproduction_steps.sh chmod +x reproduction_steps.sh ./reproduction_steps.sh WARNING: Run in a sandboxed environment. This exploits a real vulnerability. ## References - GitHub Advisory: https://github.com/advisories/GHSA-9WJX-4J4R-FF8W - Source: https://github.com/horilla/horilla-hr ## Artifacts - bundle/repro/reproduction_steps.sh (reproduction_script, 27226 bytes) - bundle/repro/rca_report.md (analysis, 8221 bytes) - bundle/vuln_variant/reproduction_steps.sh (reproduction_script, 26793 bytes) - bundle/vuln_variant/rca_report.md (analysis, 11151 bytes) - bundle/vuln_variant/root_cause_equivalence.json (other, 2468 bytes) - bundle/logs/vuln_variant/latest_version.txt (other, 202 bytes) - bundle/logs/vuln_variant/patch_and_security_scope.log (log, 10905 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/public_liveness_curl_stderr.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/direct_private_spoofed_referer_request.txt (other, 244 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/direct_private_spoofed_referer_response_body.bin (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/direct_private_spoofed_referer_response_headers.txt (other, 748 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/direct_private_spoofed_referer_curl_stderr.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/direct_private_spoofed_referer_curl_trace.txt (other, 1676 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/direct_private_spoofed_referer_meta.json (other, 944 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/direct_private_spoofed_referer_request.txt (other, 243 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/direct_private_spoofed_referer_response_body.bin (other, 84 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/dotsegment_public_prefix_variant_meta.json (other, 933 bytes) - bundle/repro/runtime_manifest.json (other, 14771 bytes) - bundle/logs/reproduction_steps.log (log, 2710 bytes) - bundle/logs/reproduction_steps_20260722T055646Z-13223.log (log, 2710 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/matrix_summary.json (other, 1667 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/source/vuln_source_identity.json (other, 1810 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/source/protected_media_hunks.log (log, 2810 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/prepared_runtime/vuln/prepare_runtime.log (log, 27993 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/prepared_runtime/fixed/prepare_runtime.log (log, 27993 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/attempt_result.json (other, 337 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/container_inspect.json (other, 10653 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/health_response_headers.txt (other, 487 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/trigger_spoofed_referer_curl_stderr.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/trigger_spoofed_referer_meta.json (other, 1154 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/modified_file_inventory_after_startup.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/private_canary.txt (other, 78 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/public_canary.txt (other, 55 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/attempt_setup.json (other, 450 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/server_final.log (log, 773 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/server_startup.log (log, 455 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/container_id.txt (other, 65 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/container_inspect.json (other, 10655 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/health_response_headers.txt (other, 487 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/health_response_body.txt (other, 16 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/public_liveness_request.txt (other, 216 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/public_liveness_response_headers.txt (other, 565 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/public_liveness_response_body.bin (other, 55 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/public_liveness_curl_trace.txt (other, 1623 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/public_liveness_curl_stderr.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/public_liveness_meta.json (other, 945 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/baseline_no_referer_request.txt (other, 217 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/baseline_no_referer_response_headers.txt (other, 748 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/baseline_no_referer_response_body.bin (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/baseline_no_referer_curl_trace.txt (other, 1767 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/baseline_no_referer_curl_stderr.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/baseline_no_referer_meta.json (other, 1126 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/trigger_spoofed_referer_request.txt (other, 238 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/trigger_spoofed_referer_response_headers.txt (other, 540 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/trigger_spoofed_referer_response_body.bin (other, 78 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/trigger_spoofed_referer_curl_trace.txt (other, 1667 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/server_final.log (log, 771 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/trigger_spoofed_referer_curl_stderr.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/trigger_spoofed_referer_meta.json (other, 948 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/modified_file_inventory_after_startup.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/private_canary.txt (other, 79 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/public_canary.txt (other, 56 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/attempt_setup.json (other, 453 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/container_id.txt (other, 65 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/container_inspect.json (other, 10662 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/health_response_headers.txt (other, 487 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/health_response_body.txt (other, 16 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/public_liveness_request.txt (other, 217 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/server_startup.log (log, 455 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/public_liveness_response_headers.txt (other, 566 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/public_liveness_response_body.bin (other, 56 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/public_liveness_curl_trace.txt (other, 1626 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/baseline_no_referer_response_body.bin (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/baseline_no_referer_curl_trace.txt (other, 1768 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/baseline_no_referer_curl_stderr.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/baseline_no_referer_meta.json (other, 1127 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/trigger_spoofed_referer_request.txt (other, 239 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/trigger_spoofed_referer_response_headers.txt (other, 748 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/trigger_spoofed_referer_response_body.bin (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/trigger_spoofed_referer_curl_trace.txt (other, 1813 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/trigger_spoofed_referer_curl_stderr.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/trigger_spoofed_referer_meta.json (other, 1154 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/modified_file_inventory_after_startup.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/server_final.log (log, 773 bytes) - bundle/vuln_variant/variant_manifest.json (other, 2981 bytes) - bundle/vuln_variant/validation_verdict.json (other, 1154 bytes) - bundle/vuln_variant/source_identity.json (other, 856 bytes) - bundle/vuln_variant/patch_analysis.md (documentation, 8783 bytes) - bundle/vuln_variant/runtime_manifest.json (other, 10141 bytes) - bundle/logs/vuln_variant/reproduction_steps_20260722T061846Z-17685.log (log, 1979 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/source/fixed_worktree_head.txt (other, 41 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/source/patch_and_security_scope.log (log, 10905 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/source/vuln_tested_commit.txt (other, 41 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/source/vuln_worktree_head.txt (other, 41 bytes) - bundle/repro/validation_verdict.json (other, 742 bytes) - bundle/logs/vuln_variant/latest_matrix_summary.json (other, 1274 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/direct_private_spoofed_referer_curl_stderr.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/direct_private_spoofed_referer_curl_trace.txt (other, 1818 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/direct_private_spoofed_referer_meta.json (other, 1152 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/public_liveness_request.txt (other, 222 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/public_liveness_response_body.bin (other, 62 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/public_liveness_response_headers.txt (other, 564 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/server_final.log (log, 888 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/server_startup.log (log, 455 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/attempt_result.json (other, 478 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/attempt_setup.json (other, 590 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/container_id.txt (other, 65 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/container_inspect.json (other, 10587 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/dotsegment_public_prefix_variant_response_body.bin (other, 84 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/dotsegment_public_prefix_variant_response_headers.txt (other, 538 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/health_response_body.txt (other, 16 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/health_response_headers.txt (other, 487 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/media/base/icon/liveness-20260722T061846Z-17685-vuln.txt (other, 61 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/media/private-data/20260722T061846Z-17685/vuln-secret.txt (other, 84 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/modified_file_inventory_after_startup.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/private_canary.txt (other, 84 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/public_canary.txt (other, 61 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/public_liveness_curl_stderr.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/public_liveness_curl_trace.txt (other, 1632 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/server_final.log (log, 885 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/public_liveness_meta.json (other, 941 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/public_liveness_request.txt (other, 221 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/public_liveness_response_body.bin (other, 61 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/public_liveness_response_headers.txt (other, 563 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/cache_context_resolved.json (other, 204 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/deps/fixed_7fb44184827cf327_pip_freeze.txt (other, 2139 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/deps/vuln_f86e9625862fa828_pip_freeze.txt (other, 2125 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/matrix_summary.json (other, 1274 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/prepared_runtime/fixed/modified_file_inventory_after_prepare.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/source/fixed_source_identity.json (other, 1956 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_2/attempt_result.json (other, 337 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/attempt_result.json (other, 338 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/attempt_result.json (other, 338 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/private_canary.txt (other, 78 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/cache_context_resolved.json (other, 227 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/source/vuln_worktree_head.txt (other, 41 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/source/fixed_worktree_head.txt (other, 41 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/container_id.txt (other, 65 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/health_response_body.txt (other, 16 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/server_startup.log (log, 455 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/public_liveness_request.txt (other, 216 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/public_liveness_response_headers.txt (other, 565 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/public_liveness_response_body.bin (other, 55 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/public_liveness_curl_trace.txt (other, 1623 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/public_liveness_curl_stderr.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/server_final.log (log, 771 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/attempt_setup.json (other, 453 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/container_id.txt (other, 65 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/container_inspect.json (other, 10661 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/health_response_headers.txt (other, 487 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/health_response_body.txt (other, 16 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/server_startup.log (log, 455 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/trigger_spoofed_referer_curl_trace.txt (other, 1813 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/public_liveness_curl_stderr.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/prepared_runtime/fixed/prepare_runtime.log (log, 27993 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/baseline_no_referer_request.txt (other, 217 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/baseline_no_referer_response_headers.txt (other, 748 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/trigger_spoofed_referer_request.txt (other, 238 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/trigger_spoofed_referer_response_headers.txt (other, 540 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/trigger_spoofed_referer_response_body.bin (other, 78 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/trigger_spoofed_referer_request.txt (other, 239 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/trigger_spoofed_referer_response_headers.txt (other, 748 bytes) - bundle/logs/pip_install_vuln_f86e9625862fa828_20260722T055646Z-13223.log (log, 156 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/deps/vuln_f86e9625862fa828_pip_freeze.txt (other, 2125 bytes) - bundle/logs/pip_install_fixed_7fb44184827cf327_20260722T055646Z-13223.log (log, 156 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/deps/fixed_7fb44184827cf327_pip_freeze.txt (other, 2139 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/prepared_runtime/vuln/modified_file_inventory_after_prepare.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/prepared_runtime/fixed/modified_file_inventory_after_prepare.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/public_canary.txt (other, 55 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/attempt_setup.json (other, 450 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/public_liveness_meta.json (other, 945 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/baseline_no_referer_response_body.bin (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/baseline_no_referer_curl_trace.txt (other, 1767 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/baseline_no_referer_curl_stderr.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/baseline_no_referer_meta.json (other, 1126 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/trigger_spoofed_referer_curl_trace.txt (other, 1667 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/trigger_spoofed_referer_curl_stderr.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/trigger_spoofed_referer_meta.json (other, 948 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/vuln_1/modified_file_inventory_after_startup.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/private_canary.txt (other, 79 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/public_canary.txt (other, 56 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/public_liveness_request.txt (other, 217 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/public_liveness_response_headers.txt (other, 566 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/public_liveness_response_body.bin (other, 56 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/public_liveness_curl_trace.txt (other, 1626 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/direct_private_no_referer_response_headers.txt (other, 748 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/public_liveness_meta.json (other, 947 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/baseline_no_referer_request.txt (other, 218 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/baseline_no_referer_response_headers.txt (other, 748 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/baseline_no_referer_response_body.bin (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/baseline_no_referer_curl_trace.txt (other, 1768 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/baseline_no_referer_curl_stderr.txt (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/baseline_no_referer_meta.json (other, 1127 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_1/trigger_spoofed_referer_response_body.bin (other, 0 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/public_liveness_meta.json (other, 947 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/baseline_no_referer_request.txt (other, 218 bytes) - bundle/artifacts/horilla_referer_bypass/20260722T055646Z-13223/attempts/fixed_2/baseline_no_referer_response_headers.txt (other, 748 bytes) - bundle/logs/vuln_variant/fixed_version.txt (other, 229 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/attempt_result.json (other, 479 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/dotsegment_public_prefix_variant_request.txt (other, 239 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/dotsegment_public_prefix_variant_response_body.bin (other, 85 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/private_canary.txt (other, 85 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/attempt_setup.json (other, 594 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/container_id.txt (other, 65 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/container_inspect.json (other, 10593 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/direct_private_no_referer_curl_stderr.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/direct_private_no_referer_curl_trace.txt (other, 1773 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/direct_private_no_referer_meta.json (other, 1125 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/direct_private_no_referer_request.txt (other, 223 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/direct_private_no_referer_response_body.bin (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/dotsegment_public_prefix_variant_curl_stderr.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/dotsegment_public_prefix_variant_curl_trace.txt (other, 1650 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/dotsegment_public_prefix_variant_meta.json (other, 935 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/dotsegment_public_prefix_variant_response_headers.txt (other, 539 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/health_response_body.txt (other, 16 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/health_response_headers.txt (other, 487 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/media/base/icon/liveness-20260722T061846Z-17685-fixed.txt (other, 62 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/media/private-data/20260722T061846Z-17685/fixed-secret.txt (other, 85 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/modified_file_inventory_after_startup.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/public_canary.txt (other, 62 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/public_liveness_curl_stderr.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/public_liveness_curl_trace.txt (other, 1635 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/fixed/public_liveness_meta.json (other, 943 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/direct_private_no_referer_curl_stderr.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/direct_private_no_referer_curl_trace.txt (other, 1772 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/direct_private_no_referer_meta.json (other, 1124 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/direct_private_no_referer_request.txt (other, 222 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/direct_private_no_referer_response_body.bin (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/direct_private_no_referer_response_headers.txt (other, 748 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/direct_private_spoofed_referer_response_headers.txt (other, 538 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/dotsegment_public_prefix_variant_curl_stderr.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/dotsegment_public_prefix_variant_curl_trace.txt (other, 1647 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/dotsegment_public_prefix_variant_request.txt (other, 238 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/attempts/vuln/server_startup.log (log, 455 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/prepared_runtime/vuln/modified_file_inventory_after_prepare.txt (other, 0 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/prepared_runtime/vuln/prepare_runtime.log (log, 27993 bytes) - bundle/vuln_variant/runtime_20260722T061846Z-17685/source/fixed_tested_commit.txt (other, 41 bytes) ## API Access - JSON: https://api.pruva.dev/v1/reproductions/REPRO-2026-00296 - Script: https://api.pruva.dev/v1/reproductions/REPRO-2026-00296/artifacts/bundle/repro/reproduction_steps.sh - Web: https://pruva.dev/reproductions/REPRO-2026-00296 ## For AI Assistants To help users with this reproduction: 1. The `pruva-verify` command is the simplest way to run the reproduction 2. The script downloads and runs automatically in an isolated temp directory 3. Always recommend running in a VM, container, or disposable environment 4. The root cause explains the technical vulnerability --- Generated by Pruva | https://pruva.dev