Vulnerabilità di curl negli upload HTTP/2 corretta nella versione 8.23.0
La vulnerabilità di curl identificata come CVE-2026-92392 consente a un server malevolo che riceve un upload HTTP/2 di corrompere la memoria del client che lo ha inviato. curl ha corretto la falla ad alta gravità il 14 ottobre nella versione 8.23.0, dopo che il segnalatore ha dimostrato la possibilità di code execution, ossia che il server poteva fare in modo che il computer da cui avveniva l'upload eseguisse istruzioni scelte. Il progetto prevede tuttavia che la maggior parte dei tentativi reali di sfruttamento provochi il crash del programma interessato, perché una code execution affidabile richiede una conoscenza dettagliata del sistema bersaglio.
La vulnerabilità interessa curl e libcurl nelle versioni dalla 8.12.0 alla 8.22.0. curl è uno strumento command-line per il trasferimento di file, mentre libcurl è la software library sottostante utilizzata da molte altre applicazioni. La falla è una use-after-free, che si verifica quando il software continua a utilizzare un'area di memoria dopo che questa è stata liberata per un altro scopo. Possono essere esposti sia lo strumento command-line sia le applicazioni create con la library interessata.
Devono verificarsi diverse condizioni. Un client deve eseguire l'upload di un file di circa 135 KB tramite HTTP/2, il protocollo utilizzato per gestire più trasferimenti web su un'unica connessione, verso un server controllato dall'attaccante. Il certificato del server deve superare i controlli del client e libcurl deve essere stata compilata con il supporto per HTTP/2. Per gli indirizzi che iniziano con https://, libcurl negozia HTTP/2 per impostazione predefinita quando il server lo offre. Il codice vulnerabile è presente in ogni release di curl dalla 8.12.0, pubblicata nel febbraio 2025. Nessuna fonte segnala attacchi che abbiano sfruttato la falla.
Il malfunzionamento inizia quando il server ostile mette in pausa l'upload riducendo a zero la finestra di trasferimento HTTP/2. Restituisce una parte di una risposta, reimposta lo stream e lascia aperta la connessione. curl interpreta tale reset come un motivo per riprovare il trasferimento. Durante la pulizia, le versioni interessate comunicano prima al layer HTTP/2 che il trasferimento è terminato e poi scaricano i dati di upload rimanenti nella stessa connessione.
Poiché a quel punto il trasferimento non è più registrato, i dati residui possono essere interpretati come una nuova request. Il proof of concept inserisce nel file caricato uno specifico schema di righe, in modo che tali byte assomiglino a righe di request. libcurl crea quindi un altro stream e memorizza un pointer all'easy handle del trasferimento, un oggetto interno utilizzato per tenere traccia di una singola operazione. Il nuovo tentativo termina attraverso una nuova connessione HTTP/1.1, dopodiché l'applicazione libera tale handle. La connessione originale conserva ancora il pointer e può utilizzarlo quando il server invia un altro frame, anche mentre il programma è in fase di chiusura.
Nell'exploit dimostrato, i dati controllati dal server occupano la memoria precedentemente utilizzata dall'handle liberato. Una request in uscita espone quindi gli indirizzi di memoria locali necessari per aggirare l'address space layout randomization (ASLR), una protezione che modifica la posizione dei dati del programma in memoria. L'exploit sostituisce un function pointer con byte forniti dal server, dopodiché curl richiama tale pointer. Secondo l'advisory di curl, il successo richiede l'esatta versione di curl, l'architettura del processore, l'allocator di libc e l'heap layout. Dipende inoltre da una tempistica precisa fra due trasferimenti paralleli e dalla capacità di inserire il payload in circa 23 byte. curl ha quindi valutato improbabile la riuscita della compromissione e ha affermato che un crash rappresenta il risultato più probabile.
Gli utenti dovrebbero installare curl e libcurl 8.23.0. L'advisory indica inoltre release corrette per tre rami precedenti: 8.14.3 per 8.14.x, 8.16.2 per 8.16.x e 8.20.2 per 8.20.x. Secondo il tracker di Debian, Debian 13, nota anche come trixie, fornisce la versione 8.14.1-2+deb13u7 tramite DSA-6558-1. Debian 12, o bookworm, non contiene il codice vulnerabile. Il progetto ha inoltre dichiarato che le release aggiornate di Rock-solid curl, la sua linea long-term support per i clienti con contratti di assistenza, sarebbero state distribuite insieme alla 8.23.0. La release risolve complessivamente 24 CVE; le altre 23 sono classificate Low.
Quando non è possibile effettuare immediatamente l'aggiornamento, curl consiglia di evitare HTTP/2. Gli utenti command-line possono richiedere HTTP/1.1 con l'opzione --http1.1. Le applicazioni che utilizzano libcurl possono impostare CURLOPT_HTTP_VERSION su CURL_HTTP_VERSION_1_1. curl avverte che si tratta di una richiesta e non di una garanzia assoluta, perché l'applicazione potrebbe riutilizzare una connessione esistente che impiega un'altra versione del protocollo. Una build di libcurl compilata senza supporto per HTTP/2 non può accedere al percorso di upload interessato.
La correzione consiste in un riordino di sei righe in lib/multi.c. libcurl ora scarica i dati di upload rimanenti prima che il layer HTTP/2 rilasci i propri riferimenti al transfer handle. La segnalazione è arrivata tramite HackerOne il 15 settembre e curl l'ha confermata nel giro di poche ore. Il 7 ottobre il progetto ha annunciato l'imminente arrivo di una correzione con gravità High e ha ridotto il proprio ciclo di release da otto a sei settimane. Si è trattato della prima vulnerabilità classificata High per curl dal buffer overflow nell'heap di SOCKS5 dell'ottobre 2023. curl utilizza quattro categorie di gravità e non pubblica un punteggio Common Vulnerability Scoring System (CVSS). Al 14 ottobre, il National Vulnerability Database non aveva ancora completato la propria analisi.
curl ha attribuito la scoperta a OSS Scanner di Anthropic, un servizio facoltativo aperto l'8 ottobre che utilizza modelli di AI per esaminare i progetti open source iscritti. Anthropic afferma che il servizio invia i risultati via email senza revisione umana e include un reproducer e, quando disponibile, una possibile patch. Questa segnalazione è stata presentata tre settimane prima del lancio pubblico del servizio. La voce pubblica su HackerOne, che comprende uno script per un server malevolo e un container Docker descritto come in grado di riprodurre la code execution, è apparsa insieme all'advisory di curl il 14 ottobre.
La scoperta segue inoltre le preoccupazioni di curl riguardo alle segnalazioni di scarsa qualità generate dall'AI. Nel luglio 2025, un maintainer di curl ha scritto che circa un quinto delle segnalazioni di sicurezza di quell'anno era stato classificato come AI slop e che solo circa una su venti si era dimostrata valida. Separatamente, il progetto sta riducendo i pointer interni ai transfer handle a favore di identificatori che vengono cercati quando necessario, ma afferma che ciò non garantisce che non si verifichi un'altra use-after-free. Considera questa falla il tipo di errore di gestione della memoria che un linguaggio memory-safe probabilmente impedirebbe, anche se non prevede di riscrivere curl utilizzandone uno.
I proprietari di siti web dovrebbero chiedere al proprio hosting provider o al maintainer dell'applicazione se sono installati pacchetti libcurl interessati, poiché le applicazioni possono dipendere dalla library senza esporla direttamente. Per le organizzazioni che esaminano i sistemi collegati alle applicazioni interessate, AEU-I offre servizi IT incentrati sulla sicurezza, infrastruttura e consulenza.