{
  "variant_id": "CVE-2026-10536-duphandle",
  "created_at": "2026-07-09T18:12:00Z",
  "variant_summary": "Alternate trigger for CVE-2026-10536 via curl_easy_duphandle(): cloning a parent handle after CURLOPT_STREAM_DEPENDS creates a second handle sharing the same dependency-tree node, which later cleanup dereferences after the original parent has freed it.",
  "relation": "newer_version_sibling",
  "origin_kind": "pruva_variant",
  "repository": "curl/curl",
  "submitted_target": {
    "target_kind": "git_commit",
    "commit_sha": "6e3f8dc1f173b47de9a68516ce4b95bf25598c2f",
    "version": "8.20.0",
    "ref": "curl-8_20_0",
    "display": "curl/curl @ curl-8_20_0 (6e3f8dc1...)"
  },
  "variant_target": {
    "target_kind": "git_commit",
    "commit_sha": "3f00a2f6fa97f7721b65606954aac979dcb6caac",
    "version": "8.21.0",
    "ref": "curl-8_21_0",
    "display": "curl/curl @ curl-8_21_0 (3f00a2f6...)"
  },
  "same_root_cause_confidence": "high",
  "same_surface_confidence": "high",
  "claimed_surface": "library_api",
  "validated_surface": "library_api",
  "required_entrypoint_kind": "function_call",
  "required_entrypoint_detail": "curl_easy_setopt(CURLOPT_STREAM_DEPENDS) followed by curl_easy_duphandle(parent) and an ordered cleanup, or curl_easy_reset(parent) followed by cleanup of child then parent",
  "attacker_controlled_input": "API call sequence and cleanup order on easy handles linked by CURLOPT_STREAM_DEPENDS",
  "trigger_path": "curl_easy_init() -> curl_easy_setopt(CURLOPT_STREAM_DEPENDS) -> curl_easy_duphandle(parent) -> curl_easy_cleanup(child) -> curl_easy_cleanup(parent) -> curl_easy_cleanup(parent_clone)",
  "observed_impact_class": "memory_corruption",
  "exploitability_confidence": "high",
  "evidence_scope": "realistic_harness",
  "runtime_manifest_present": true,
  "end_to_end_target_reached": true,
  "inferred": false,
  "file_path": "lib/url.c",
  "line_start": 3587,
  "line_end": 3587,
  "secondary_anchors": [
    {
      "file_path": "lib/url.c",
      "line_start": 3510,
      "line_end": 3529
    },
    {
      "file_path": "lib/easy.c",
      "line_start": 873,
      "line_end": 893
    },
    {
      "file_path": "lib/setopt.c",
      "line_start": 1517,
      "line_end": 1525
    }
  ],
  "review_scope_paths": [
    "lib/url.c",
    "lib/easy.c",
    "lib/setopt.c"
  ],
  "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/variant_reproduction_steps.log",
    "root_cause_equivalence": "bundle/vuln_variant/root_cause_equivalence.json",
    "reproducer": [
      "bundle/vuln_variant/artifacts/variant_duphandle.c",
      "bundle/vuln_variant/artifacts/variant_reset_parent.c",
      "bundle/vuln_variant/reproduction_steps.sh"
    ]
  }
}
