È stato recentemente annunciato che è stata identificata una vulnerabilità critica nel repository di pacchetti RubyGems.org (la vulnerabilità è già catalogata con il codice CVE-2022-29176), che consente , senza la dovuta autorizzazione, la sostituzione dei pacchetti di altri utenti nel repository avviando il ritiro (yank) di un pacchetto legittimo e caricando al suo posto un altro file con lo stesso nome e numero di versione.
Si afferma che la vulnerabilità sia dovuta a un bug nel gestore delle azioni "yank" , che interpreta la parte del nome successiva al trattino come nome della piattaforma, consentendo così di avviare la rimozione di pacchetti esterni che corrispondono nella parte del nome fino al carattere trattino.
In particolare, nel codice del gestore dell'operazione "yank", la chiamata 'find_by!(full_name: "#{rubygem.name}-#{slug}")' veniva utilizzata per cercare i pacchetti, mentre il parametro "slug" veniva passato al proprietario del pacchetto per determinare la versione da rimuovere.
Il proprietario del pacchetto "rails-html" potrebbe aver specificato "sanitizer-1.2.3" invece della versione "1.2.3", il che farebbe applicare l'operazione a "rails-html-sanitizer-1.2.3" pacchetto ″ da qualcun altro. »
Ieri è stato pubblicato un avviso di sicurezza per Rubygems.org.
L'avviso riguardava un bug che consentiva a un utente malintenzionato di estrarre alcune gemme e caricare file diversi con lo stesso nome, numero di versione e piattaforma diversa.
Diamo uno sguardo più approfondito per vedere cosa è andato storto durante il processo di estrazione. Come pretesto, immaginiamo uno scenario in cui creiamo una gemma chiamata "rails-html" con l'intenzione di ottenere un accesso non autorizzato alla gemma "rails-html-sanitizer" ampiamente utilizzata.
Si precisa che, per sfruttare con successo questa vulnerabilità, è necessario che siano soddisfatte tre condizioni :
- L'attacco può essere eseguito solo su pacchetti che hanno un trattino nel nome.
- Un attaccante dovrebbe essere in grado di piazzare un pacchetto di gemme con parte del nome fino al trattino. Ad esempio, se l'attacco è contro il pacchetto "rails-html-sanitizer", l'attaccante deve inserire il proprio pacchetto "rails-html" nel repository.
- Il pacco attaccato deve essere stato creato negli ultimi 30 giorni o non aggiornato da 100 giorni.
Il problema è stato individuato da un ricercatore di sicurezza nell'ambito del programma di ricompense di HackerOne, volto a trovare vulnerabilità di sicurezza in noti progetti open source.
Il problema è stato risolto su RubyGems.org il 5 maggio e, secondo gli sviluppatori, negli ultimi 18 mesi non sono state rilevate tracce di sfruttamento della vulnerabilità nei log. Tuttavia, finora è stata condotta solo un'analisi superficiale e un'analisi più approfondita è prevista per il futuro.
Al momento, riteniamo che questa vulnerabilità non sia stata sfruttata.
RubyGems.org invia un'e-mail a tutti i proprietari di gemme quando viene rilasciata o rimossa una versione di gemme. Non abbiamo ricevuto e-mail di supporto dai proprietari di gemme che indichino che la loro gemma è stata estratta senza autorizzazione.
Un controllo delle modifiche alle gemme negli ultimi 18 mesi non ha rilevato esempi di uso dannoso di questa vulnerabilità. Ulteriori controlli per qualsiasi possibile utilizzo di questo exploit non hanno rilevato alcun caso di utilizzo di questo exploit per acquisire una gemma senza autorizzazione nella storia di RubyGems. Non possiamo garantire che non sia mai successo, ma non sembra probabile.
Per verificare i tuoi progetti, si consiglia di analizzare la cronologia delle operazioni nel file Gemfile.lock L'attività dannosa è espressa in presenza di modifiche con lo stesso nome e versione, o un cambio di piattaforma (ad esempio, quando un pacchetto xxx-1.2.3 .1.2.3 è aggiornato a xxx-XNUMX-xxx).
Per contrastare l'impersonificazione di pacchetti nascosti nei sistemi di integrazione continua o durante la pubblicazione di progetti, si consiglia agli sviluppatori di utilizzare Bundler con le opzioni "--frozen" o "--deployment" per confermare le dipendenze.
Infine, se siete interessati ad approfondire l'argomento , potete trovare maggiori dettagli al seguente link.