Nell'utilità per il trasferimento di dati su rete curl e nella parallela libreria libcurl è stata scoperta una vulnerabilità (CVE-2023-38545) che potrebbe portare a un overflow del buffer e potenzialmente all'esecuzione di codice malevolo sul lato client quando si utilizza l'utilità curl o un'applicazione che impiega libcurl per accedere a un server HTTPS controllato da un attaccante. Il problema si manifesta solo quando l'accesso tramite proxy SOCKS5 è attivato in curl. Con un accesso diretto senza proxy, la vulnerabilità non si presenta. La vulnerabilità è stata corretta nella versione curl 8.4.0. Il ricercatore di sicurezza che ha segnalato il problema ha ricevuto una ricompensa di $4660 nell'ambito dell'iniziativa Internet Bug Bounty su Hackerone.
La vulnerabilità è causata da un errore nel codice di risoluzione dei nomi host prima della connessione al proxy SOCKS5. Quando il nome host ha una lunghezza fino a 256 caratteri, curl lo invia immediatamente al proxy SOCKS5 per la risoluzione. Se il nome è più lungo di 255 caratteri, ritorna a un risolutore locale e invia un indirizzo già determinato al SOCKS5. A causa di un errore nel codice, il flag che indica la necessità di risoluzione locale durante la lenta negoziazione della connessione tramite SOCKS5 poteva essere impostato su un valore errato, il che portava alla scrittura di nomi host lunghi in un buffer riservato. Indirizzi IP o di un nome che non supera i 255 caratteri.
Il proprietario del sito a cui curl si connette tramite il proxy SOCKS5 può innescare un overflow del buffer sul lato client restituendo in risposta un codice di reindirizzamento della richiesta (HTTP 30x) e impostando nell'intestazione «Location:» un URL il cui nome host ha una lunghezza compresa tra 16 e 64 KB (il valore di 16 KB è giustificato dalla dimensione minima necessaria per innescare l'overflow del buffer, mentre 65 KB è collegato alla lunghezza massima consentita per il nome host in un URL). Se nelle impostazioni di libcurl il reindirizzamento delle richieste è abilitato e il proxy SOCKS5 utilizzato è sufficientemente lento, il lungo nome host verrà scritto in un buffer piccolo, di dimensioni notevolmente inferiori.
La vulnerabilità colpisce principalmente le applicazioni basate su libcurl e si manifesta nell'utilità curl solo quando si utilizza l'opzione «—limit-rate» con un valore inferiore a 65541 — in libcurl viene per impostazione predefinita allocato un buffer di 16 KB, mentre nell'utilità curl di 100 KB, ma questa dimensione cambia a seconda del valore del parametro «—limit-rate».
Daniel Stenberg, autore del progetto, ha menzionato che la vulnerabilità è rimasta inosservata per 1315 giorni. È stato anche detto che il 41% delle vulnerabilità precedentemente riscontrate in curl sarebbe probabilmente potuto essere evitato se curl fosse stato scritto in un linguaggio che garantisce una gestione sicura della memoria, ma non è in programma nel prossimo futuro riscrivere curl in un altro linguaggio. Come misure per aumentare la sicurezza della base di codice, si propone di ampliare gli strumenti per il test del codice e di utilizzare più attivamente le dipendenze scritte in linguaggi di programmazione che garantiscono una gestione sicura della memoria. Si sta anche considerando la possibilità di sostituire gradualmente parti di curl con varianti scritte in linguaggi sicuri, come l'esperimentale backend HTTP Hyper, implementato in Rust.
Fonte: opennet.ru
