È stata identificata una vulnerabilità critica nel repository dei pacchetti RubyGems.org (CVE-2022-29176), che consente di sostituire alcuni pacchetti di terze parti nel repository senza le dovute autorizzazioni, avviando il ritiro (yank) di un pacchetto legittimo e caricando al suo posto un altro file con lo stesso nome e numero di versione.
Per sfruttare con successo la vulnerabilità, sono necessarie tre condizioni:
- L'attacco può essere effettuato solo su pacchetti il cui nome contiene il carattere trattino.
- L'attaccante deve avere la possibilità di caricare un pacchetto gem con parte del nome prima del carattere trattino. Ad esempio, se l'attacco è mirato al pacchetto 'rails-html-sanitizer', l'attaccante deve caricare nel repository un proprio pacchetto 'rails-html'.
- Il pacchetto sotto attacco deve essere stato creato negli ultimi 30 giorni o non deve essere stato aggiornato negli ultimi 100 giorni.
La vulnerabilità è stata causata da un errore nel gestore dell'azione «yank», che interpretava parte del nome dopo il trattino come nome della piattaforma, permettendo di avviare l'eliminazione di pacchetti altrui che corrispondevano in parte al nome fino al simbolo del trattino. In particolare, nel codice del gestore dell'operazione «yank» veniva utilizzata la chiamata ‘find_by!(full_name: «#{rubygem.name}-#{slug}»)’, mentre il parametro «slug» veniva passato dal proprietario del pacchetto per definire la versione da eliminare. Il proprietario del pacchetto «rails-html» invece di «1.2.3» poteva specificare «sanitizer-1.2.3», il che avrebbe portato all'applicazione dell'operazione a un pacchetto altrui «rails-html-sanitizer-1.2.3».
Il problema è stato identificato da un ricercatore di sicurezza nell'ambito di un programma attivo su HackerOne per il pagamento di ricompense per la scoperta di problemi di sicurezza in noti progetti open source. Il problema è stato risolto in RubyGems.org il 5 maggio e, secondo quanto dichiarato dagli sviluppatori, non hanno finora trovato tracce di sfruttamento della vulnerabilità nei log degli ultimi 18 mesi. Tuttavia, è stata effettuata solo una revisione superficiale, e in futuro è previsto un controllo più approfondito.
Per verificare i propri progetti, si consiglia di analizzare la cronologia delle operazioni nel file Gemfile.lock, l'attività malevola si esprime nella presenza di modifiche con il mantenimento del nome e della versione o cambiando la piattaforma (ad esempio, quando il pacchetto gemname-1.2.3 è stato aggiornato a gemname-1.2.3-java). Come metodo alternativo per proteggersi da sostituzioni nascoste dei pacchetti nei sistemi di integrazione continua o durante la pubblicazione dei progetti, si consiglia agli sviluppatori di utilizzare Bundler con le opzioni "--frozen" o "--deployment" per bloccare le dipendenze.
Fonte: opennet.ru
