HSTS amnesia with --parallel
curl's HSTS cache saving behaves wrongly when multiple URLs are requested in parallel. Using its HSTS support, curl can be instructed to use HTTPS instead of using an insecure clear-text HTTP step even when HTTP is provided in the URL. This HSTS mechanism would however surprisingly fail when multiple transfers are done in parallel as the HSTS cache file gets overwritten by the most recently completed transfer. A later HTTP-only transfer to the earlier hostname would then *not* get upgraded properly to HSTS. Reproducible like this: 1. `curl --hsts hsts.txt --parallel https://curl.se https://example.com` 2. `curl --hsts hsts.txt http://curl.se`
- Products
- Not specified
- Affected versions
- Not specified
- Fixed versions
- Not specified
- CVEs
- CVE-2023-23915
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 1 Nov 2026, 16:54 UTC · Revision 1
Source evidence
curl's HSTS cache saving behaves wrongly when multiple URLs are requested in parallel. Using its HSTS support, curl can be instructed to use HTTPS instead of using an insecure clear-text HTTP step even when HTTP is provided in the URL. This HSTS mechanism would however surprisingly fail when multiple transfers are done in parallel as the HSTS cache file gets overwritten by the most recently completed transfer. A later HTTP-only transfer to the earlier hostname would then *not* get upgraded properly to HSTS. Reproducible like this: 1. `curl --hsts hsts.txt --parallel https://curl.se https://example.com` 2. `curl --hsts hsts.txt http://curl.se`
osv:CURL-CVE-2023-23915
Complete source record
{
"id": "1e80b1dc0e71f7ac8742326351f3d10e3cbe584998b6478e3166897f82e86c4f",
"url": "https://osv.dev/vulnerability/CURL-CVE-2023-23915",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "HSTS amnesia with --parallel",
"summary": "curl's HSTS cache saving behaves wrongly when multiple URLs are requested in parallel. Using its HSTS support, curl can be instructed to use HTTPS instead of using an insecure clear-text HTTP step even when HTTP is provided in the URL. This HSTS mechanism would however surprisingly fail when multiple transfers are done in parallel as the HSTS cache file gets overwritten by the most recently completed transfer. A later HTTP-only transfer to the earlier hostname would then *not* get upgraded properly to HSTS. Reproducible like this: 1. `curl --hsts hsts.txt --parallel https://curl.se https://example.com` 2. `curl --hsts hsts.txt http://curl.se`",
"evidence": "osv:CURL-CVE-2023-23915",
"products": [],
"severity": "low",
"structured": {
"id": "CURL-CVE-2023-23915",
"aliases": [
"CURL-CVE-2023-23915",
"CVE-2023-23915"
],
"affected": [
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "7.77.0"
},
{
"fixed": "7.88.0"
}
]
},
{
"repo": "https://github.com/curl/curl.git",
"type": "GIT",
"events": [
{
"introduced": "7385610d0c74c6a254fea5e4cd6e1d559d848c8c"
},
{
"fixed": "076a2f629119222aeeb50f5a03bf9f9052fabb9a"
}
]
}
],
"versions": [
"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",
"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"
],
"database_specific": {
"source": "https://curl.se/docs/CURL-CVE-2023-23915.json",
"vanir_signatures": [
{
"id": "CURL-CVE-2023-23915-0356669c",
"digest": {
"threshold": 0.9,
"line_hashes": [
"82451440526091596190416680049711622192",
"202389981090709065853492774138138418959",
"31140244074829462660931570420898389375",
"250598913800445393542016912767607534971",
"225980906437672378224597453801340005734",
"90678634670407324789922817664574892219",
"122168756509406516429708106687686401106",
"135069773483626961641541264823665265961",
"298035261371194627355538744591329017010",
"16219853417824616242366911435238435270",
"162156050127606652250425047242673753557",
"169898101254020448180401279358881019051",
"175398258928310456522432454049699507402",
"86304266166675628394632614847565793402",
"238109732409054062520654253457137939865",
"340017270325253531196731198952677486443",
"91564265886334082202243613151815865332",
"213281136004135154119939850969425809157",
"45407483833966010252528014466682843549",
"32091259491261548615334281907325171883",
"315746684491214009378483121730886846564",
"264268795465841451357583040883813488553",
"263264310373130654979803015793962816501",
"246262560339677526027375859650567645393",
"9282827196930141182005985157246507407",
"336632632281577345657679019440345116148",
"263143953382413643679218282230011144281",
"334251979122196415400285159510242456133",
"229563070578915145181785639210110350682"
]
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/setopt.c"
},
"deprecated": false,
"signature_type": "Line",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-1c0a7a30",
"digest": {
"threshold": 0.9,
"line_hashes": [
"81298516931518092722032620450036562805",
"131665174262377165205467487057408913532",
"146830524771089566113492699295957603241",
"121733846314682508574846201633963220974"
]
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/url.c"
},
"deprecated": false,
"signature_type": "Line",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-1fe69110",
"digest": {
"threshold": 0.9,
"line_hashes": [
"103372102345878776588641474089368209928",
"152067924783240037202787893167506770350",
"7746138722062160250244778802444877905",
"155009378828254279286090131001640317184"
]
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/urldata.h"
},
"deprecated": false,
"signature_type": "Line",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-27b27162",
"digest": {
"length": 989,
"function_hash": "78503270755360167760487452513681233828"
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/share.c",
"function": "curl_share_cleanup"
},
"deprecated": false,
"signature_type": "Function",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-39096ace",
"digest": {
"threshold": 0.9,
"line_hashes": [
"245712974534621529831993597344352142443",
"122923717408232090499260057437153371134",
"117225080125953929088609938998732711365",
"262710635254875236936328680400952254253"
]
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "include/curl/curl.h"
},
"deprecated": false,
"signature_type": "Line",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-49af2d84",
"digest": {
"threshold": 0.9,
"line_hashes": [
"265974011670274527010009946255328579611",
"231369669490237754826490051281733503338",
"90828035202475992188154012154888219754",
"17801975575738596479978457931667442819",
"83312106701310623811764343735100176467",
"185829385694448784730873035931717149963"
]
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/share.h"
},
"deprecated": false,
"signature_type": "Line",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-55f18285",
"digest": {
"threshold": 0.9,
"line_hashes": [
"317737156888860158888180976184082947388",
"296772438286135597766018391408284568428",
"93863599463335824020144245231455699735",
"187440963696661346408659508771285993647",
"126541588144396179810650934492823781912"
]
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/hsts.c"
},
"deprecated": false,
"signature_type": "Line",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-5d8a9b1b",
"digest": {
"threshold": 0.9,
"line_hashes": [
"323284887027130569251074238736564148118",
"34687696054589859158880763057880021505",
"295830824979080249078878088056385764961",
"318545017166036224884146334275586543147"
]
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/hsts.h"
},
"deprecated": false,
"signature_type": "Line",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-88e21f12",
"digest": {
"length": 3508,
"function_hash": "188099668725394989166685344047949408256"
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/transfer.c",
"function": "Curl_pretransfer"
},
"deprecated": false,
"signature_type": "Function",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-91e6c0ee",
"digest": {
"length": 2321,
"function_hash": "87556514541982823078820041778802007757"
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/share.c",
"function": "curl_share_setopt"
},
"deprecated": false,
"signature_type": "Function",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-97f0bd88",
"digest": {
"threshold": 0.9,
"line_hashes": [
"4820130694093282531383537802642963820",
"330218359836502049093817216140070657199",
"16438427537648136967909612007949394277"
]
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/transfer.c"
},
"deprecated": false,
"signature_type": "Line",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-c50b64f2",
"digest": {
"threshold": 0.9,
"line_hashes": [
"245466321832339527116660896618474575717",
"38226126048150584580867928621410392582",
"242547863109362497744444513058980057783",
"70647329269378109194206434157514346725",
"136673927380771676907849843947125828259",
"145043333416790488336473315238986483130",
"277760925257594173381926824670891351887",
"136673927380771676907849843947125828259",
"145043333416790488336473315238986483130",
"315810932162440782704045016446781039486",
"179464127795319789708067166569152807361",
"320552856034564234648874916627478362387",
"104906062842268595740166511201528157654"
]
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/share.c"
},
"deprecated": false,
"signature_type": "Line",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-d8f84a95",
"digest": {
"length": 2700,
"function_hash": "51837919229063511304895451007570275438"
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/url.c",
"function": "Curl_close"
},
"deprecated": false,
"signature_type": "Function",
"signature_version": "v1"
},
{
"id": "CURL-CVE-2023-23915-ffc11d95",
"digest": {
"length": 58864,
"function_hash": "212147244672599344668514893440215258735"
},
"source": "https://github.com/curl/curl.git/commit/076a2f629119222aeeb50f5a03bf9f9052fabb9a",
"target": {
"file": "lib/setopt.c",
"function": "Curl_vsetopt"
},
"deprecated": false,
"signature_type": "Function",
"signature_version": "v1"
}
],
"vanir_signatures_modified": "2026-10-27T01:28:35Z"
}
}
],
"modified": "2026-10-27T01:28:35.851705900Z",
"provider": "osv",
"references": [],
"provider_metadata": {
"CWE": {
"id": "CWE-319",
"desc": "Cleartext Transmission of Sensitive Information"
},
"URL": "https://curl.se/docs/CVE-2023-23915.json",
"www": "https://curl.se/docs/CVE-2023-23915.html",
"award": {
"amount": "480",
"currency": "USD"
},
"issue": "https://hackerone.com/reports/1814333",
"affects": "both",
"package": "curl",
"severity": "Low",
"last_affected": "7.87.0"
}
},
"related_cves": [
{
"value": "CVE-2023-23915",
"evidence": "/aliases"
}
],
"security_relevant": true,
"severity_evidence": "/database_specific/severity"
},
"source_id": "core-osv",
"document_id": 459157,
"published_at": "2023-02-15T08:00:00+00:00"
}