Attraverso un'analisi completa della sicurezza condotta dal Red Team di OPSWAT, i ricercatori di sicurezza Thai Do e Minh Pham hanno identificato diverse vulnerabilità che hanno un impatto sul framework Rack Ruby, in particolare CVE-2025-25184, CVE-2025-27111 e CVE-2025-27610.
Questo articolo fornisce una panoramica dettagliata di queste vulnerabilità, con particolare attenzione a CVE-2025-27610. Esamina le cause principali, valuta gli impatti potenziali e delinea strategie di mitigazione efficaci per proteggere le applicazioni che si basano sul framework Rack.
Panoramica del rack
Rack è un'interfaccia modulare che collega i server web alle applicazioni web basate su Ruby. Standardizza l'interazione tra questi componenti avvolgendo le richieste e le risposte HTTP in un'unica chiamata di metodo, semplificando il processo di sviluppo e promuovendo la compatibilità tra diversi framework e server.
Rack è utilizzato da molti framework e librerie web Ruby, come Ruby on Rails e Sinatra. È disponibile come gemma Ruby. L'ampia adozione globale di Rack, con oltre un miliardo di download in tutto il mondo, evidenzia il suo ruolo integrale nell'ecosistema di sviluppo Ruby. Componenti middleware come Rack::Static e Rack::Sendfile migliorano l'efficienza gestendo la distribuzione di contenuti statici e ottimizzando la trasmissione dei file. A causa di questa ampia integrazione, le vulnerabilità scoperte all'interno di Rack presentano implicazioni sostanziali per la sicurezza, con potenziali ripercussioni su numerose applicazioni e sistemi in tutto il mondo.
Scoperta delle vulnerabilità di sicurezza in Rack
Nel corso di una recente ricerca sulla sicurezza condotta sul framework middleware Rack, i ricercatori di OPSWAT Thai Do e Minh Pham hanno identificato diverse vulnerabilità che pongono rischi significativi per la sicurezza delle applicazioni web basate su Ruby:
- CVE-2025-25184: Thai Do ha scoperto una vulnerabilità che consente agli aggressori di eseguire un'iniezione di registro tramite i caratteri CRLF (Carriage Return Line Feed), manipolando potenzialmente le voci di registro.
- CVE-2025-27111: Minh Pham ha scoperto una falla di sicurezza che consente agli aggressori di iniettare e manipolare il contenuto del registro attraverso valori di intestazione dannosi.
- CVE-2025-27610: Minh Pham ha inoltre identificato una vulnerabilità Path Traversal, che potrebbe consentire agli aggressori di ottenere l'accesso non autorizzato a file situati al di fuori della directory di file statici designata, costituendo una minaccia significativa per la sicurezza.
Tra queste vulnerabilità, CVE-2025-27610 è particolarmente grave, in quanto potrebbe consentire ad aggressori non autenticati di recuperare informazioni sensibili, tra cui file di configurazione, credenziali e dati riservati, causando così violazioni dei dati. A questa vulnerabilità è stato assegnato un punteggio CVSS di 7,5, che la classifica come rischio ad alta gravità.
Vulnerabilità di Rack::Static e inclusione di file locali
Capire Rack::Static
Rack::Static è un middleware essenziale nelle applicazioni Rack, utilizzato principalmente per servire in modo efficiente file statici come JavaScript, CSS e immagini. Sfruttando Rack::Static, gli sviluppatori possono integrare perfettamente il servizio di contenuti statici nelle applicazioni Ruby senza dover ricorrere a configurazioni aggiuntive del server web.
Quando si configura Rack::Static, spiccano due opzioni essenziali: :urls e :root. La comprensione e l'uso corretto di queste opzioni semplificano e snelliscono notevolmente il processo di distribuzione dei file statici.
1. L'opzione :urls
L'opzione :urls specifica quali percorsi URL l'applicazione Rack deve gestire come risorse statiche. Viene fornita come un array di stringhe, ognuna delle quali rappresenta un prefisso di percorso che attiva la gestione dei file statici.
Ad esempio:
In questa configurazione, le richieste a /images, /css o /js vengono intercettate ed elaborate da Rack::Static. Qualsiasi file che corrisponda a questi percorsi sarà servito direttamente dal file system.
2. L'opzione :root
L'opzione :root definisce la directory di base da cui verranno serviti i file statici. Questa directory è relativa alla directory di lavoro corrente dell'applicazione Rack.
Dato l'esempio precedente:
Quando viene fatta una richiesta a /assets/logo.png, Rack::Static tenta di servire il file situato a public/assets/logo.png.
Esempio pratico
L'implementazione efficace di Rack::Static attraverso le opzioni :urls e :root offre un metodo organizzato e performante per servire contenuti statici all'interno di applicazioni web Ruby:
In questo scenario, le richieste a /assets/* e /favicon.ico saranno gestite automaticamente da Rack::Static. Tutti i file corrispondenti devono esistere rispettivamente nella cartella public/assets e public/favicon.ico.
CVE-2025-27610 Dettaglio tecnico
Durante un'analisi approfondita della sicurezza di Rack::Static, Minh Pham ha scoperto una vulnerabilità significativa legata alla gestione impropria dell'opzione :root. In particolare, quando il parametro :root non è definito esplicitamente, Rack assegna per default il valore alla directory di lavoro corrente assegnandogli il valore di Dir.pwd, designandola implicitamente come directory principale del Web per l'applicazione Rack.
È significativo che Rack::Static concateni direttamente i percorsi degli URL in entrata con la directory :root specificata senza una sufficiente validazione o sanitizzazione. Di conseguenza, se l'opzione :root non è definita o è configurata in modo errato rispetto all'opzione :urls, un utente non autenticato potrebbe sfruttare questa vulnerabilità attraverso tecniche di attraversamento dei percorsi per accedere a file sensibili al di fuori della directory web prevista.
La sezione seguente fornisce un'analisi dettagliata del processo di gestione delle richieste di Rack::Static, illustrando chiaramente come questa vulnerabilità possa essere sfruttata.
Vulnerabilità di attraversamento di percorsi e inclusione di file locali in Rack::Static
Per capire meglio come il middleware Rack::Static elabora le richieste, Minh Pham ha condotto un'analisi approfondita del codice sorgente di Rack. Durante l'inizializzazione della classe Rack::Static, ha osservato che se l'opzione :root non è definita in modo esplicito, Rack::Static si imposta di servire i file dalla directory di lavoro corrente (Dir.pwd). Di conseguenza, omettendo questa opzione, il middleware utilizza implicitamente la directory da cui viene eseguita l'applicazione.
Dopo l'inizializzazione, è stato determinato che quando Rack::Static riceve una richiesta HTTP in entrata, viene invocato il metodo call.
Successivamente, Rack::Static delega l'operazione di servizio del file a Rack::Files, che tenta di individuare e servire il file in base al percorso del file costruito, derivato dalla directory :root configurata e dal PATH_INFO fornito dall'utente.
Innanzitutto, invocando i metodi can_serve(path) e overwrite_file_path(path), il middleware esamina env["PATH_INFO"] per determinare se la richiesta in arrivo corrisponde a uno dei prefissi URL configurati (ad esempio, /static, /public).
Se la condizione è soddisfatta, Rack::Static costruisce il percorso dei file combinando la directory principale configurata (:root) con il PATH_INFO fornito dall'utente. Questa costruzione avviene senza un'adeguata normalizzazione o sanitizzazione del percorso di input. In particolare, il middleware concatena direttamente il PATH_INFO della richiesta in entrata con la directory specificata dall'opzione :root, introducendo una vulnerabilità dovuta a un'insufficiente validazione del percorso fornito.
Minh Pham ha scoperto che, a causa dell'assenza di un'adeguata sanitizzazione o validazione in questo flusso di lavoro, se il PATH_INFO fornito dall'utente contiene sequenze di attraversamento di directory e l'opzione :root non è definita esplicitamente, il percorso dei file costruito potrebbe risolversi in una posizione al di fuori della directory principale prevista, esponendo potenzialmente file sensibili.
CVE-2025-27610 Prova di concetto
Per dimostrare questa vulnerabilità in Rack::Static, abbiamo sviluppato un'applicazione web basata su Ruby che utilizza la versione 3.1.10 di Rack. Negli scenari in cui l'applicazione non definisce esplicitamente l'opzione :root, un aggressore non autenticato può sfruttare questa vulnerabilità per accedere a dati sensibili, come credenziali, file di configurazione o file di database, portando potenzialmente a una violazione significativa dei dati.
Per una dimostrazione dettagliata dell'impatto significativo associato a questa vulnerabilità, consultare il seguente video:
Mitigazione e guida
Per ridurre le vulnerabilità discusse sopra, assicuratevi che il vostro sistema sia aggiornato all'ultima versione di Rack.
MetaDefender Core , utilizzando il motore SBOM, è in grado di rilevare questa vulnerabilità.
OPSWAT MetaDefender Core, dotato di funzionalità avanzate di SBOMSoftware Bill of Materials), consente alle organizzazioni di adottare un approccio proattivo nell'affrontare i rischi per la sicurezza. Esaminando le applicazioni software e le loro dipendenze, MetaDefender Core identifica le vulnerabilità note, come CVE-2025-27610, CVE-2025-27111 e CVE-2025-25184, all'interno dei componenti elencati. In questo modo i team di sviluppo e di sicurezza sono in grado di dare priorità alle attività di patch, mitigando i potenziali rischi per la sicurezza prima che possano essere sfruttati da attori malintenzionati.
Di seguito è riportata una schermata di CVE-2025-27610, CVE-2025-27111 e CVE-2025-25184, rilevate da MetaDefender Core con SBOM: