Skip to content
Heist/ feed
Back to feed
Low

FTP wildcard write callback mixup

Type: advisorySources: OSV

When an FTP wildcard `LIST` operation fails, libcurl omits the restoration path meant for successful listings, leaving the write callback set to the internal listing parser and the write callback data pointing directly to the easy handle. Subsequent reuse of this handle triggers an immediate crash, and cloning it via `curl_easy_duphandle()` copies this corrupted state into the duplicate. If the original handle is subsequently freed, executing a transfer on the cloned handle causes a heap use-after-free read against the dangling handle reference; alternatively, reusing the original or cloned handle while changing only `CURLOPT_WRITEDATA` (and omitting `CURLOPT_WRITEFUNCTION`) results in type confusion, forcing the internal parser to interpret incoming server response bytes into memory at the application-supplied write data pointer.

Products
Not specified
Affected versions
Not specified
Fixed versions
Not specified
CVEs
CVE-2026-92388
Confirmed fixed CVEs
Not specified
Updated in this feed
1 Nov 2026, 09:39 UTC · Revision 1

Source evidence

FTP wildcard write callback mixup

core-osv · Original source

Published 14 Oct 2026, 08:00 UTC

When an FTP wildcard `LIST` operation fails, libcurl omits the restoration path meant for successful listings, leaving the write callback set to the internal listing parser and the write callback data pointing directly to the easy handle. Subsequent reuse of this handle triggers an immediate crash, and cloning it via `curl_easy_duphandle()` copies this corrupted state into the duplicate. If the original handle is subsequently freed, executing a transfer on the cloned handle causes a heap use-after-free read against the dangling handle reference; alternatively, reusing the original or cloned handle while changing only `CURLOPT_WRITEDATA` (and omitting `CURLOPT_WRITEFUNCTION`) results in type confusion, forcing the internal parser to interpret incoming server response bytes into memory at the application-supplied write data pointer.

osv:CURL-CVE-2026-92388
Complete source record
{
  "id": "d48fda307d4cdab5ca5891c29cb05b5adf5c805e75f5a19481485171644b8896",
  "url": "https://osv.dev/vulnerability/CURL-CVE-2026-92388",
  "method": "structured",
  "payload": {
    "kind": "advisory",
    "title": "FTP wildcard write callback mixup",
    "summary": "When an FTP wildcard `LIST` operation fails, libcurl omits the restoration path meant for successful listings, leaving the write callback set to the internal listing parser and the write callback data pointing directly to the easy handle. Subsequent reuse of this handle triggers an immediate crash, and cloning it via `curl_easy_duphandle()` copies this corrupted state into the duplicate. If the original handle is subsequently freed, executing a transfer on the cloned handle causes a heap use-after-free read against the dangling handle reference; alternatively, reusing the original or cloned handle while changing only `CURLOPT_WRITEDATA` (and omitting `CURLOPT_WRITEFUNCTION`) results in type confusion, forcing the internal parser to interpret incoming server response bytes into memory at the application-supplied write data pointer.",
    "evidence": "osv:CURL-CVE-2026-92388",
    "products": [],
    "severity": "low",
    "structured": {
      "id": "CURL-CVE-2026-92388",
      "aliases": [
        "CURL-CVE-2026-92388",
        "CVE-2026-92388"
      ],
      "affected": [
        {
          "ranges": [
            {
              "type": "SEMVER",
              "events": [
                {
                  "introduced": "7.21.0"
                },
                {
                  "fixed": "8.14.3"
                },
                {
                  "introduced": "8.15.0"
                },
                {
                  "fixed": "8.16.2"
                },
                {
                  "introduced": "8.17.0"
                },
                {
                  "fixed": "8.20.2"
                },
                {
                  "introduced": "8.21.0"
                },
                {
                  "fixed": "8.23.0"
                }
              ]
            },
            {
              "repo": "https://github.com/curl/curl.git",
              "type": "GIT",
              "events": [
                {
                  "introduced": "0825cd80a62c21725fb3615f1fdd3aa6cc5f0f34"
                },
                {
                  "fixed": "ba8f8a7f27a5c5e19e4ef212b90b35a93559163e"
                }
              ]
            }
          ],
          "versions": [
            "8.22.0",
            "8.21.0",
            "8.20.0",
            "8.19.0",
            "8.18.0",
            "8.17.0",
            "8.16.0",
            "8.15.0",
            "8.14.1",
            "8.14.0",
            "8.13.0",
            "8.12.1",
            "8.12.0",
            "8.11.1",
            "8.11.0",
            "8.10.1",
            "8.10.0",
            "8.9.1",
            "8.9.0",
            "8.8.0",
            "8.7.1",
            "8.7.0",
            "8.6.0",
            "8.5.0",
            "8.4.0",
            "8.3.0",
            "8.2.1",
            "8.2.0",
            "8.1.2",
            "8.1.1",
            "8.1.0",
            "8.0.1",
            "8.0.0",
            "7.88.1",
            "7.88.0",
            "7.87.0",
            "7.86.0",
            "7.85.0",
            "7.84.0",
            "7.83.1",
            "7.83.0",
            "7.82.0",
            "7.81.0",
            "7.80.0",
            "7.79.1",
            "7.79.0",
            "7.78.0",
            "7.77.0",
            "7.76.1",
            "7.76.0",
            "7.75.0",
            "7.74.0",
            "7.73.0",
            "7.72.0",
            "7.71.1",
            "7.71.0",
            "7.70.0",
            "7.69.1",
            "7.69.0",
            "7.68.0",
            "7.67.0",
            "7.66.0",
            "7.65.3",
            "7.65.2",
            "7.65.1",
            "7.65.0",
            "7.64.1",
            "7.64.0",
            "7.63.0",
            "7.62.0",
            "7.61.1",
            "7.61.0",
            "7.60.0",
            "7.59.0",
            "7.58.0",
            "7.57.0",
            "7.56.1",
            "7.56.0",
            "7.55.1",
            "7.55.0",
            "7.54.1",
            "7.54.0",
            "7.53.1",
            "7.53.0",
            "7.52.1",
            "7.52.0",
            "7.51.0",
            "7.50.3",
            "7.50.2",
            "7.50.1",
            "7.50.0",
            "7.49.1",
            "7.49.0",
            "7.48.0",
            "7.47.1",
            "7.47.0",
            "7.46.0",
            "7.45.0",
            "7.44.0",
            "7.43.0",
            "7.42.1",
            "7.42.0",
            "7.41.0",
            "7.40.0",
            "7.39.0",
            "7.38.0",
            "7.37.1",
            "7.37.0",
            "7.36.0",
            "7.35.0",
            "7.34.0",
            "7.33.0",
            "7.32.0",
            "7.31.0",
            "7.30.0",
            "7.29.0",
            "7.28.1",
            "7.28.0",
            "7.27.0",
            "7.26.0",
            "7.25.0",
            "7.24.0",
            "7.23.1",
            "7.23.0",
            "7.22.0",
            "7.21.7",
            "7.21.6",
            "7.21.5",
            "7.21.4",
            "7.21.3",
            "7.21.2",
            "7.21.1",
            "7.21.0",
            "curl-8_22_0",
            "rc-8_22_0-3",
            "rc-8_22_0-2",
            "rc-8_22_0-1",
            "curl-8_21_0",
            "rc-8_21_0-3",
            "rc-8_21_0-2",
            "rc-8_21_0-1",
            "curl-8_20_0",
            "rc-8_20_0-3",
            "rc-8_20_0-2",
            "rc-8_20_0-1",
            "curl-8_19_0",
            "rc-8_19_0-3",
            "rc-8_19_0-2",
            "rc-8_19_0-1",
            "curl-8_18_0",
            "rc-8_18_0-3",
            "rc-8_18_0-2",
            "rc-8_18_0-1",
            "curl-8_17_0",
            "curl-8_16_0",
            "curl-8_15_0",
            "curl-8_14_1",
            "curl-8_14_0",
            "curl-8_13_0",
            "curl-8_12_1",
            "curl-8_12_0",
            "curl-8_11_1",
            "curl-8_11_0",
            "curl-8_10_1",
            "curl-8_10_0",
            "curl-8_9_1",
            "curl-8_9_0",
            "curl-8_8_0",
            "curl-8_7_1",
            "curl-8_7_0",
            "curl-8_6_0",
            "curl-8_5_0",
            "tiny-curl-8_4_0",
            "curl-8_4_0",
            "curl-8_3_0",
            "curl-8_2_1",
            "curl-8_2_0",
            "curl-8_1_2",
            "curl-8_1_1",
            "curl-8_1_0",
            "curl-8_0_1",
            "curl-8_0_0",
            "curl-7_88_1",
            "curl-7_88_0",
            "curl-7_87_0",
            "curl-7_86_0",
            "curl-7_85_0",
            "curl-7_84_0",
            "curl-7_83_1",
            "curl-7_83_0",
            "curl-7_82_0",
            "curl-7_81_0",
            "curl-7_80_0",
            "curl-7_79_1",
            "curl-7_79_0",
            "curl-7_78_0",
            "curl-7_77_0",
            "curl-7_76_1",
            "curl-7_76_0",
            "curl-7_75_0",
            "curl-7_74_0",
            "curl-7_73_0",
            "tiny-curl-7_72_0",
            "curl-7_72_0",
            "curl-7_71_1",
            "curl-7_71_0",
            "curl-7_70_0",
            "curl-7_69_1",
            "curl-7_69_0",
            "curl-7_68_0",
            "curl-7_67_0",
            "curl-7_66_0",
            "curl-7_65_3",
            "curl-7_65_2",
            "curl-7_65_1",
            "curl-7_65_0",
            "curl-7_64_1",
            "curl-7_64_0",
            "curl-7_63_0",
            "curl-7_62_0",
            "curl-7_61_1",
            "curl-7_61_0",
            "curl-7_60_0",
            "curl-7_59_0",
            "curl-7_58_0",
            "curl-7_57_0",
            "curl-7_56_1",
            "curl-7_56_0",
            "curl-7_55_1",
            "curl-7_55_0",
            "curl-7_54_1",
            "curl-7_54_0",
            "curl-7_53_1",
            "curl-7_53_0",
            "curl-7_52_1",
            "curl-7_52_0",
            "curl-7_51_0",
            "curl-7_50_3",
            "curl-7_50_2",
            "curl-7_50_1",
            "curl-7_50_0",
            "curl-7_49_1",
            "curl-7_49_0",
            "curl-7_48_0",
            "curl-7_47_1",
            "curl-7_47_0",
            "curl-7_46_0",
            "curl-7_45_0",
            "curl-7_44_0",
            "curl-7_43_0",
            "curl-7_42_1",
            "curl-7_42_0",
            "curl-7_41_0",
            "curl-7_40_0",
            "curl-7_39_0",
            "curl-7_38_0",
            "curl-7_37_1",
            "curl-7_37_0",
            "curl-7_36_0",
            "curl-7_35_0",
            "curl-7_34_0",
            "curl-7_33_0",
            "curl-7_32_0",
            "curl-7_31_0",
            "curl-7_30_0",
            "curl-7_29_0",
            "curl-7_28_1",
            "curl-7_28_0",
            "curl-7_27_0",
            "curl-7_26_0",
            "curl-7_25_0",
            "curl-7_24_0",
            "curl-7_23_1",
            "curl-7_23_0",
            "curl-7_22_0",
            "curl-7_21_7",
            "curl-7_21_6",
            "curl-7_21_5",
            "curl-7_21_4",
            "curl-7_21_3",
            "curl-7_21_2",
            "curl-7_21_1",
            "curl-7_21_0"
          ],
          "database_specific": {
            "source": "https://curl.se/docs/CURL-CVE-2026-92388.json",
            "vanir_signatures": [
              {
                "id": "CURL-CVE-2026-92388-37eddad8",
                "digest": {
                  "length": 635,
                  "function_hash": "143061753882336494767680983486733687706"
                },
                "source": "https://github.com/curl/curl.git/commit/ba8f8a7f27a5c5e19e4ef212b90b35a93559163e",
                "target": {
                  "file": "lib/cw-out.c",
                  "function": "cw_get_writefunc"
                },
                "deprecated": false,
                "signature_type": "Function",
                "signature_version": "v1"
              },
              {
                "id": "CURL-CVE-2026-92388-3b791e24",
                "digest": {
                  "threshold": 0.9,
                  "line_hashes": [
                    "77727340163860766620554115872749740762",
                    "215965894333253655639099792401512670376",
                    "338709366524257140505242780017015014304",
                    "23029853775342374852775865103147536005",
                    "311180633746911954006935032641693793537",
                    "80350778472714746253146260024223957333",
                    "222609923567134588938204587869455767597",
                    "169197121860397991234228114410720690241",
                    "317286478409241654378978163462513032399",
                    "35700631642782495486784183851604008463",
                    "120880201332487352896192931346932531400",
                    "82385839063148637403254157976501332086",
                    "136748861001560477059610996662755042352",
                    "196289514771246689056811597931181018401"
                  ]
                },
                "source": "https://github.com/curl/curl.git/commit/ba8f8a7f27a5c5e19e4ef212b90b35a93559163e",
                "target": {
                  "file": "lib/ftp.c"
                },
                "deprecated": false,
                "signature_type": "Line",
                "signature_version": "v1"
              },
              {
                "id": "CURL-CVE-2026-92388-4a4e8297",
                "digest": {
                  "threshold": 0.9,
                  "line_hashes": [
                    "114755344196661425492569263542981357873",
                    "216946763721863210338275750488593142941",
                    "162416506894139747275011875526134287056",
                    "183527793812269515122717277074107565725",
                    "28961063934339295747761129566909650945"
                  ]
                },
                "source": "https://github.com/curl/curl.git/commit/ba8f8a7f27a5c5e19e4ef212b90b35a93559163e",
                "target": {
                  "file": "lib/cw-out.c"
                },
                "deprecated": false,
                "signature_type": "Line",
                "signature_version": "v1"
              },
              {
                "id": "CURL-CVE-2026-92388-638f98b3",
                "digest": {
                  "threshold": 0.9,
                  "line_hashes": [
                    "130817863030890983118293296577638000062",
                    "274140575119242962993643831035280188434",
                    "5841000899797701248683675423466086736",
                    "258286239204315396966363537849735098229",
                    "103146799315916396288288599903965856533",
                    "111949090213710644811275320467051447277",
                    "300345411605006602316296185193936705877"
                  ]
                },
                "source": "https://github.com/curl/curl.git/commit/ba8f8a7f27a5c5e19e4ef212b90b35a93559163e",
                "target": {
                  "file": "lib/ftp-int.h"
                },
                "deprecated": false,
                "signature_type": "Line",
                "signature_version": "v1"
              },
              {
                "id": "CURL-CVE-2026-92388-94de10bd",
                "digest": {
                  "threshold": 0.9,
                  "line_hashes": [
                    "79512658832897824693821628832367898633",
                    "157747559540249585786259191057782044418",
                    "272747727497140786403123478759168137600"
                  ]
                },
                "source": "https://github.com/curl/curl.git/commit/ba8f8a7f27a5c5e19e4ef212b90b35a93559163e",
                "target": {
                  "file": "lib/ftplistparser.c"
                },
                "deprecated": false,
                "signature_type": "Line",
                "signature_version": "v1"
              },
              {
                "id": "CURL-CVE-2026-92388-c1b74874",
                "digest": {
                  "length": 1639,
                  "function_hash": "267106453770063182066636679835557640"
                },
                "source": "https://github.com/curl/curl.git/commit/ba8f8a7f27a5c5e19e4ef212b90b35a93559163e",
                "target": {
                  "file": "lib/ftp.c",
                  "function": "init_wc_data"
                },
                "deprecated": false,
                "signature_type": "Function",
                "signature_version": "v1"
              },
              {
                "id": "CURL-CVE-2026-92388-c2a28f8a",
                "digest": {
                  "threshold": 0.9,
                  "line_hashes": [
                    "329684666632550105705617958310312955708",
                    "256551381214279993971512015697635146721",
                    "19211126177995515624582079239923789260",
                    "291283242837785715977183739621750759514",
                    "26612390542160893402792408707125809158",
                    "4050957483259296026291694455142709245"
                  ]
                },
                "source": "https://github.com/curl/curl.git/commit/ba8f8a7f27a5c5e19e4ef212b90b35a93559163e",
                "target": {
                  "file": "lib/ftplistparser.h"
                },
                "deprecated": false,
                "signature_type": "Line",
                "signature_version": "v1"
              },
              {
                "id": "CURL-CVE-2026-92388-d137e3bd",
                "digest": {
                  "length": 3010,
                  "function_hash": "41863799115737491445661384955522584312"
                },
                "source": "https://github.com/curl/curl.git/commit/ba8f8a7f27a5c5e19e4ef212b90b35a93559163e",
                "target": {
                  "file": "lib/ftp.c",
                  "function": "wc_statemach"
                },
                "deprecated": false,
                "signature_type": "Function",
                "signature_version": "v1"
              }
            ],
            "vanir_signatures_modified": "2026-10-25T01:05:46Z"
          }
        }
      ],
      "modified": "2026-10-25T01:05:46.610226241Z",
      "provider": "osv",
      "references": [],
      "provider_metadata": {
        "CWE": {
          "id": "CWE-416",
          "desc": "Use After Free"
        },
        "URL": "https://curl.se/docs/CVE-2026-92388.json",
        "www": "https://curl.se/docs/CVE-2026-92388.html",
        "issue": "https://hackerone.com/reports/4022070",
        "affects": "lib",
        "package": "curl",
        "severity": "Low",
        "last_affected": "8.22.0"
      }
    },
    "related_cves": [
      {
        "value": "CVE-2026-92388",
        "evidence": "/aliases"
      }
    ],
    "security_relevant": true,
    "severity_evidence": "/database_specific/severity"
  },
  "source_id": "core-osv",
  "document_id": 444426,
  "published_at": "2026-10-14T08:00:00+00:00"
}