Una vulnerabilità di elevata gravità nel processo di deserializzazione del linguaggio di programmazione R potrebbe mettere a rischio le organizzazioni che utilizzano questo popolare progetto open source, aprendo la porta ad attacchi attraverso la catena di approvvigionamento del software.
Qualora venisse sfruttata, la vulnerabilità potrebbe consentire a un attaccante di eseguire codice arbitrario sui sistemi target inducendo la vittima ad aprire file in formato “.rds” o “.rdx” opportunamente predisposti.
Identificata con il codice CVE-2024-27322, questa vulnerabilità ha ricevuto un punteggio di gravità CVSS di 8.8 su 10.
Il rischio di un attacco alla supply chain è particolarmente elevato per le aziende che si affidano a R per applicazioni di calcolo statistico e grafico diffuse in settori come i servizi finanziari, la sanità, la ricerca, gli enti governativi e nei contesti che gestiscono grandi dataset, ad esempio nell’intelligenza artificiale e nel machine learning.
Indice degli argomenti
Dettagli della vulnerabilità in R
Il problema di sicurezza, segnalato dai ricercatori Kasimir Schulz e Kieran Evans di HiddenLayer, risiede nel processo di deserializzazione dei dati di R, ovvero la conversione di oggetti codificati in formati come JSON, XML e binario, al loro stato originale per l’utilizzo in un’applicazione o programma.
L’esecuzione di codice arbitrario da parte di un attaccante all’interno dell’ambiente target avviene tramite un file R Data Serialization (RDS) appositamente creato. Ricordiamo che i programmatori usano comunemente i file RDS per memorizzare o salvare oggetti in R per usi futuri o per condividerli con altri. Una pratica, questa, che potrebbe consentire di espandere notevolmente la superficie di attacco alla supply chain qualora la vulnerabilità in R venisse sfruttata con successo.
In particolare, sottolineano i ricercatori nella loro rapporto, “un aggressore può creare file RDS o pacchetti R dannosi contenenti codice R arbitrario incorporato che viene eseguito sul dispositivo di destinazione della vittima al momento dell’interazione” con l’utente.
Più nel dettaglio, la vulnerabilità di R riguarda due concetti fondamentali del linguaggio di programmazione chiamati lazy evaluation e promise objects. Il primo indica una tecnica di programmazione in cui un programma R non valuta un’espressione o una variabile fino a quando non è effettivamente necessario, o quando vi si accede direttamente.
L’obiettivo è quello di migliorare le prestazioni di elaborazione evitando calcoli per espressioni che potrebbero non essere necessarie.
Un promise objects, invece, è strettamente legato alla “valutazione pigra” e rappresenta l’oggetto che è stato rimandato, appunto, per la valutazione.
I ricercatori di HiddenLayer hanno quindi scoperto un modo per creare un promise objects con un payload che avrebbe eseguito del codice a loro scelta quando si accedeva all’oggetto durante la deserializzazione del file RDS.
Il procedimento di deserializzazione funziona nel seguente modo. Intanto, come anticipavamo, i pacchetti R sfruttano il formato RDS per salvare e caricare i dati. Per facilitare questo processo, vengono utilizzati due differenti file: il primo in formato .rdb contiene tutti gli oggetti serializzati da includere in un pacchetto, mentre il file in formato .rdx contiene i metadati relativi a ciascuno degli oggetti.
Quando viene caricato un pacchetto, i metadati memorizzati nel formato RDS all’interno del file .rdx vengono utilizzati per individuare gli oggetti all’interno del file .rdb. Quindi, gli oggetti all’interno dei file .rdb vengono deserializzati.
Un aggressore potrebbe, quindi, sfruttare questa situazione creando un file RDS contenente un promise objects appositamente creato con codice arbitrario che verrà eseguito una volta che l’utente avrà caricato il file o il pacchetto dannoso.
Senza dire che è possibile aggiungere un pacchetto malevolo a un repository R come CRAN e aspettare che un utente incauto lo carichi. Per comprendere quanto questo rischio sia elevato, basti pensare che il Comprehensive R Archive Network (CRAN) è il più popolare repository di pacchetti R e ospita attualmente oltre 20.000 pacchetti. Allo stesso modo, un pacchetto armato potrebbe essere caricato anche su R-Forge, un sito che fornisce strumenti per lo sviluppo di pacchetti R, conta più di 15.800 membri registrati e ospita circa 2.146 progetti.
Soluzioni di mitigazione del rischio
La scoperta dei ricercatori di HiddenLayer ha spinto i manutentori di R a risolvere il problema nella versione 4.4.0 del software.
Tuttavia, la natura open source di R e la vasta rete di repository come CRAN, che contano milioni di download, delineano un’ampia superficie di attacco che potrebbe facilitare attacchi alla supply chain di proporzioni considerevoli.
Pertanto, le organizzazioni sono invitate a passare all’ultima versione di R e a promuovere tra gli utenti la consapevolezza rispetto alle vulnerabilità correnti e future, adottando politiche che privilegiano l’uso di file e pacchetti da fonti fidate per mitigare i rischi associati a questa e potenziali future vulnerabilità.