{
  "artifact_refs": {
    "repro_log": "logs/vuln_variant/reproduction_steps.log",
    "reproducer": [
      "vuln_variant/reproduction_steps.sh",
      "vuln_variant/local_http_runtime.py",
      "vuln_variant/artifacts/http_variant_attacker.py",
      "vuln_variant/compat/distutils/__init__.py",
      "vuln_variant/compat/distutils/version.py",
      "vuln_variant/compat/distutils/util.py",
      "vuln_variant/django_compat/django/__init__.py",
      "vuln_variant/django_compat/django/utils/__init__.py",
      "vuln_variant/django_compat/django/utils/_os.py"
    ],
    "root_cause_equivalence": "vuln_variant/root_cause_equivalence.json",
    "runtime_manifest": "vuln_variant/runtime_manifest.json",
    "validation_verdict": "vuln_variant/validation_verdict.json",
    "variant_manifest": "vuln_variant/variant_manifest.json"
  },
  "attacker_controlled_input": "Unauthenticated raw media route path containing an allowlisted public prefix followed by dot segments; no cookie, bearer token, JWT, or Referer is required for the confirmed C3 bypass.",
  "claimed_surface": "api_remote",
  "created_at": "2026-07-21T20:50:00Z",
  "end_to_end_target_reached": true,
  "evidence_scope": "production_path_with_runtime_accommodations",
  "exploitability_confidence": 0.95,
  "file_path": "base/views.py",
  "inferred": false,
  "line_end": 7540,
  "line_start": 7508,
  "observed_impact_class": "info_leak",
  "origin_kind": "pruva_variant",
  "relation": "newer_version_sibling",
  "repository": "https://github.com/horilla/horilla-hr.git",
  "required_entrypoint_detail": "real Horilla GET /media/<path> route dispatched by base.urls to base.views.protected_media",
  "required_entrypoint_kind": "endpoint",
  "review_scope_paths": [
    "base/views.py",
    "base/urls.py",
    "horilla/urls.py",
    "SECURITY.md"
  ],
  "runtime_manifest_present": true,
  "same_root_cause_confidence": 0.9,
  "same_surface_confidence": 1.0,
  "schema_version": 1,
  "secondary_anchors": [
    {
      "file_path": "base/urls.py",
      "line_end": 1076,
      "line_start": 1076
    },
    {
      "file_path": "base/views.py",
      "line_end": 7529,
      "line_start": 7521
    }
  ],
  "submitted_target": {
    "commit_sha": "61bd5173220d19925ad8220db9152a75c881ea73",
    "display": "Horilla 1.5.0",
    "ref": "refs/tags/1.5.0",
    "target_kind": "release_tag",
    "version": "1.5.0"
  },
  "trigger_path": "TCP HTTP GET /media/base/icon/../../private_<random>.txt -> base.urls protected_media route -> safe_join(MEDIA_ROOT, raw path) -> raw path.startswith(public prefix) -> FileResponse(open(normalized target, rb))",
  "validated_surface": "api_remote",
  "variant_id": "GHSA-x52c-5hrq-76pq-public-prefix-normalization",
  "variant_summary": "Unauthenticated /media/base/icon/../../<private-file> is classified by the raw public prefix but opened at the normalized private MEDIA_ROOT target, bypassing protected-media authentication on fixed and current Horilla revisions.",
  "variant_target": {
    "commit_sha": "b3bd29d15819cbece45c58e6268ddd0614e387d6",
    "display": "Horilla fixed release 1.6.0",
    "ref": "refs/tags/1.6.0",
    "target_kind": "fixed_release_tag",
    "version": "1.6.0"
  }
}
