{
  "variant_id": "horilla-protected-media-dotsegment-public-prefix-bypass",
  "created_at": "2026-07-22T06:22:03Z",
  "variant_summary": "Bypass of Horilla 1.6.0 protected_media fix: an unauthenticated /media/ request whose raw path starts with an allowlisted public prefix such as base/icon/ but then uses ../../ dot-segments is classified as public while safe_join resolves it to a private in-root media file, which is returned without cookie, token, or Referer.",
  "relation": "newer_version_sibling",
  "origin_kind": "pruva_variant",
  "repository": "https://github.com/horilla/horilla-hr.git",
  "submitted_target": {
    "target_kind": "git_tag",
    "commit_sha": "61bd5173220d19925ad8220db9152a75c881ea73",
    "version": "1.5.0",
    "ref": "1.5.0",
    "display": "Horilla HRMS 1.5.0 submitted vulnerable target"
  },
  "variant_target": {
    "target_kind": "git_tag",
    "commit_sha": "b3bd29d15819cbece45c58e6268ddd0614e387d6",
    "version": "1.6.0",
    "ref": "1.6.0",
    "display": "Horilla HRMS 1.6.0 fixed release bypass target"
  },
  "same_root_cause_confidence": "high",
  "same_surface_confidence": "high",
  "claimed_surface": "api_remote",
  "validated_surface": "api_remote",
  "required_entrypoint_kind": "endpoint",
  "required_entrypoint_detail": "real Horilla /media/<path> HTTP route served by base.urls re_path to base.views.protected_media",
  "attacker_controlled_input": "Unauthenticated request path /media/base/icon/../../private-data/<run>/fixed-secret.txt; no cookie, authorization header, JWT, session, or Referer required for the variant.",
  "trigger_path": "/media/base/icon/../../private-data/20260722T061846Z-17685/fixed-secret.txt",
  "observed_impact_class": "authz_bypass",
  "exploitability_confidence": "high",
  "evidence_scope": "production_path",
  "runtime_manifest_present": true,
  "end_to_end_target_reached": true,
  "inferred": false,
  "file_path": "base/views.py",
  "line_start": 7529,
  "line_end": 7540,
  "secondary_anchors": [
    {
      "file_path": "base/views.py",
      "line_start": 7513,
      "line_end": 7517
    },
    {
      "file_path": "base/views.py",
      "line_start": 7521,
      "line_end": 7527
    },
    {
      "file_path": "base/urls.py",
      "line_start": 1075,
      "line_end": 1077
    }
  ],
  "review_scope_paths": [
    "SECURITY.md",
    "base/views.py",
    "base/urls.py",
    "bundle/vuln_variant/reproduction_steps.sh",
    "bundle/logs/vuln_variant/patch_and_security_scope.log"
  ],
  "artifact_refs": {
    "variant_manifest": "bundle/vuln_variant/variant_manifest.json",
    "validation_verdict": "bundle/vuln_variant/validation_verdict.json",
    "runtime_manifest": "bundle/vuln_variant/runtime_manifest.json",
    "repro_log": "bundle/logs/vuln_variant/reproduction_steps_20260722T061846Z-17685.log",
    "root_cause_equivalence": "bundle/vuln_variant/root_cause_equivalence.json",
    "reproducer": [
      "bundle/vuln_variant/reproduction_steps.sh"
    ]
  }
}
