Overflow del buffer in curl e libcurl, manifestato quando si accede tramite un proxy SOCKS5

Nell'utilità per la ricezione e l'invio di dati sulla rete curl e nella libreria libcurl, sviluppata in parallelo, è stata identificata una vulnerabilità (CVE-2023-38545) che può portare a un buffer overflow e potenzialmente all'esecuzione di codice di un utente malintenzionato su dal lato client quando si accede utilizzando l'utilità curl o un'applicazione che utilizza libcurl, a un server HTTPS controllato dall'aggressore. Il problema si presenta solo se in curl è abilitato l'accesso tramite proxy SOCKS5. Quando si accede direttamente senza proxy, la vulnerabilità non viene visualizzata. La vulnerabilità è stata risolta nella versione curl 8.4.0. Il ricercatore di sicurezza che ha scoperto il bug ha ricevuto una ricompensa di 4660 dollari come parte dell'iniziativa Internet Bug Bounty di Hackerone.

La vulnerabilità è causata da un errore nel codice di risoluzione del nome host prima dell'accesso al proxy SOCKS5. Se il nome host è lungo fino a 256 caratteri, curl passa immediatamente il nome al proxy SOCKS5 per la risoluzione e se il nome supera i 255 caratteri, passa al risolutore locale e passa l'indirizzo già definito a SOCKS5 . A causa di un errore nel codice, il flag che indica la necessità di risoluzione locale potrebbe essere impostato su un valore errato durante la lenta negoziazione di una connessione tramite SOCKS5, che ha portato alla registrazione di un nome host lungo in un buffer allocato con l'aspettativa di memorizzare l'indirizzo IP o il nome, non superiore a 255 caratteri.

Il proprietario di un sito a cui si accede da curl tramite un proxy SOCKS5 può attivare un overflow del buffer lato client restituendo un codice di reindirizzamento della richiesta (HTTP 30x) e impostando l'intestazione "Posizione:" su un URL con un nome host compreso tra 16 e su a 64 KB (16 KB è la dimensione minima richiesta per superare il buffer allocato e 65 KB è la lunghezza massima consentita del nome host in un URL). Se il reindirizzamento della richiesta è abilitato nelle impostazioni di libcurl e il proxy SOCKS5 utilizzato è abbastanza lento, il nome host lungo verrà scritto in un buffer piccolo, ovviamente di dimensioni inferiori.

La vulnerabilità colpisce principalmente le applicazioni basate su libcurl e appare nell'utilità curl solo quando si utilizza l'opzione "--limit-rate" con un valore inferiore a 65541 - libcurl per impostazione predefinita alloca un buffer di 16 KB di dimensione e nell'utilità curl è 100 KB, ma la dimensione cambia a seconda del valore del parametro “-limit-rate”.

Daniel Stenberg, l'autore del progetto, ha affermato che la vulnerabilità non è stata rilevata per 1315 giorni. Dice inoltre che il 41% delle vulnerabilità precedentemente identificate in curl avrebbero potuto probabilmente essere evitate se curl fosse stato scritto in un linguaggio sicuro per la memoria, ma non ci sono piani per riscrivere curl in un altro linguaggio nel prossimo futuro. Come misura per migliorare la sicurezza del codice base, si propone di espandere gli strumenti per testare il codice e utilizzare più attivamente le dipendenze scritte in linguaggi di programmazione che garantiscono un funzionamento sicuro con la memoria. Si sta inoltre valutando la possibilità di sostituire gradualmente parti di curl con varianti scritte in linguaggi sicuri, come il backend sperimentale Hyper HTTP implementato in Rust.

Fonte: opennet.ru

Aggiungi un commento