
Nell'aprile 2025, Orange Cyberdefense ha scoperto una vulnerabilità critica in Craft CMS durante un'indagine su un incidente, ora tracciata come CVE-2025-32432. La falla consente l'esecuzione di codice remoto (RCE) non autenticato con un punteggio CVSS v3.1 massimo di 10,0 (critico) dal NVD (National Vulnerability Database).
Nell'ambito del programmaOPSWAT Infrastructure Cybersecurity Graduate Fellowship, i nostri borsisti hanno condotto uno studio approfondito su questa vulnerabilità, riproducendo l'exploit, verificandone l'impatto, valutando i rischi organizzativi e analizzando le strategie di protezione raccomandate.
Questo blog offre un'analisi approfondita e completa della vulnerabilità CVE-2025-32432, analizzandone la causa principale, il flusso di sfruttamento e le implicazioni più ampie in termini di sicurezza, fornendo al contempo indicazioni pratiche alle organizzazioni per difendersi da questa minaccia.
CVE-2025-32432 Introduzione
CVE-2025-32432 interessa le versioni di Craft CMS dalla 3.0.0-RC1 alla 3.9.14, dalla 4.0.0-RC1 alla 4.14.14 e dalla 5.0.0-RC1 alla 5.6.16. Classificato come CWE-94: Code Injection, il difetto deriva da una gestione impropria degli input non attendibili, consentendo in ultima analisi un RCE non autenticato.

Craft CMS e il framework Yii
Craft CMS è un moderno sistema di gestione dei contenuti che consente agli sviluppatori e ai team di contenuti di creare siti web flessibili e completamente personalizzati, anziché affidarsi a modelli rigidi e predefiniti. Adottato da oltre 46.000 siti web in tutto il mondo, è ampiamente utilizzato e spesso bersaglio di attacchi da parte di hacker alla ricerca di vulnerabilità ad alto impatto.
Craft CMS è basato sul framework Yii, un framework PHP veloce e potente creato per lo sviluppo web moderno. Yii fornisce la struttura e gli strumenti di base, mentre Craft CMS lo estende per offrire un sistema di gestione dei contenuti flessibile.

Una delle caratteristiche principali del framework Yii è il suo contenitore Dependency Injection (DI). La Dependency Injection è un modello di progettazione che fornisce ai componenti le risorse di cui hanno bisogno, invece di richiedere loro di costruire tali risorse autonomamente. Il contenitore DI di Yii è altamente flessibile, in grado di costruire oggetti complessi a partire da regole di configurazione relativamente semplici.
Tuttavia, questa flessibilità comporta dei rischi. Nel caso di CVE-2025-32432, il contenitore DI è stato utilizzato in modo improprio in combinazione con input utente non attendibili, creando un percorso per l'esecuzione di codice remoto. Questo caso dimostra che anche le funzionalità di framework sicure e potenti possono diventare pericolose se integrate senza una comprensione completa delle loro implicazioni di sicurezza.
Approfondimento su CVE-2025-32432
Craft CMS include una funzione chiamata Image Transforms, progettata per ottimizzare le prestazioni generando immagini ridimensionate direttamente sul server. Invece di fornire un'immagine di grandi dimensioni (4,5 MB) da visualizzare come miniatura 300×300, Craft CMS crea e fornisce automaticamente una versione più piccola e ottimizzata. Questo approccio riduce l'utilizzo della larghezza di banda e migliora significativamente la velocità di caricamento della pagina.
Per rendere questa funzionalità ampiamente disponibile, Craft CMS espone l'endpoint actions/assets/generate-transform senza richiedere l'autenticazione. Sebbene ciò garantisca che sia gli utenti autenticati che quelli anonimi possano beneficiare di immagini ottimizzate, introduce anche una superficie di attacco accessibile al pubblico dove chiunque può fornire input appositamente creati all'applicazione.

Attraverso un'analisi dettagliata di questo flusso di lavoro, i nostri colleghi hanno identificato che il metodo AssetsController::actionGenerateTransform viene richiamato ogni volta che viene inviata una richiesta POST all'endpoint esposto. Questa funzione recupera il parametro handle direttamente dal corpo della richiesta e lo inoltra a valle per un'ulteriore elaborazione nella fase successiva.

Nel passaggio successivo, viene richiamato il metodo ImageTransforms::normalizeTransform(). Questo metodo prende il parametro handle fornito dall'utente e lo converte in un oggetto ImageTransform. Poiché l'oggetto viene creato direttamente da un input non attendibile, ciò rappresenta un punto critico di rischio nel flusso di esecuzione.

Durante questo processo, tutte le coppie chiave-valore dell'array $transform controllato dall'utente (proveniente dal parametro handle) vengono unite in un array di configurazione. Il metodo normalizeTransform passa quindi questo array a Craft::createObject(), che è responsabile dell'istanziazione di un nuovo oggetto ImageTransform.

La vulnerabilità deriva dal modo in cui Craft::createObject() (che racchiude Yii::createObject() di Yii) elabora gli array di configurazione. Poiché questo meccanismo utilizza il contenitore DI per istanziare e configurare oggetti direttamente dall'array non convalidato, gli aggressori potrebbero ottenere il controllo sul processo di costruzione degli oggetti.

Quando viene passato un payload dannoso, il costruttore dell'oggetto (ereditato dalla classe Model ) richiama il metodo App::configure().

Questo metodo esegue un'iterazione su ciascuna proprietà dell'array controllato dall'autore dell'attacco e le assegna al nuovo oggetto.

When App::configure() assigns properties from the attacker-controlled configuration array, most keys are mapped directly onto the object. However, if a key begins with the prefix as, the assignment is routed through Component::__set, Yii’s magic setter. This method interprets as <name> as an instruction to attach a behavior (mixin) to the object.
Uno di questi payload dannosi può essere creato per sfruttare il modo in cui Component::__set elabora le proprietà con prefisso as, come ad esempio exploit:

Dalla nostra analisi, l'implementazione di Component::__set include una misura di sicurezza: quando un comportamento viene associato tramite tale proprietà, il framework verifica che la classe specificata nell'array di configurazione sia una sottoclasse valida di yii\base\Behavior. Questo controllo ha lo scopo di impedire che classi arbitrarie vengano associate direttamente ai componenti.

Tuttavia, questa misura di sicurezza non è così efficace come sembra. La debolezza deriva dal modo in cui Yii::createObject gestisce gli array di configurazione.
Quando si istanzia un oggetto, Yii::createObject dà priorità al parametro speciale __class. Se questa chiave è presente, il suo valore viene utilizzato come classe di destinazione per l'istanziazione e la chiave di classe standard nell'array di configurazione viene ignorata.

L'autore dell'attacco può creare un payload per il comportamento dell'exploit che include due chiavi:
- 'class' => '\craft\behaviors\FieldLayoutBehavior' - Una classe legittima che estende yii\base\Behavior. Questo valore esiste esclusivamente per soddisfare il controllo is_subclass_of in Component::__set, consentendo l'esecuzione senza generare un errore.
- '__class' => '\yii\rbac\PhpManager' - Il vero obiettivo dell'autore dell'attacco. Si tratta della classe "gadget" che desidera istanziare.
Quando il codice viene eseguito, Component::__set supera il controllo di sicurezza perché ispeziona solo la chiave della classe. Tuttavia, quando il framework chiama successivamente Yii::createObject per allegare il comportamento, dà la precedenza a __class, con il risultato che viene istanziato invece l'oggetto \yii\rbac\PhpManager scelto dall'autore dell'attacco.
L'uso di \yii\rbac\PhpManager è intenzionale. La semplice creazione di un oggetto non è sufficiente per lo sfruttamento; per ottenere l'RCE è necessaria una classe gadget con effetti collaterali che possano essere utilizzati come arma. PhpManager è un bersaglio comune negli attacchi POI (PHP Object Injection) a causa del suo flusso di inizializzazione. Al momento dell'istanziazione, il suo metodo init() chiama load(), che a sua volta richiama loadFromFile($this->itemFile). Con il controllo su $this->itemFile, un aggressore può forzare l'applicazione a caricare un file dannoso, trasformando la creazione dell'oggetto in esecuzione di codice.

Il pericolo risiede nel metodo loadFromFile. In PHP, un require esegue il file di destinazione come codice, quindi se un aggressore controlla il percorso del file, può attivare l'esecuzione di codice arbitrario.
Per inserire codice dannoso sul server, l'autore dell'attacco sfrutta i file di sessione PHP. Inserendo PHP in un parametro di richiesta, Craft CMS salva il payload in un file di sessione durante il processo di reindirizzamento. Successivamente, quando PhpManager carica questo file, il codice dell'autore dell'attacco potrebbe essere eseguito.

La catena di attacco completa funziona in tre fasi. Innanzitutto, l'autore dell'attacco inserisce un codice PHP dannoso inviando un URL appositamente creato, che Craft CMS salva in un file di sessione. Successivamente, sfrutta il bypass __class nell'endpoint di trasformazione delle immagini per caricare il gadget PhpManager e indirizzarlo verso il file di sessione compromesso. Infine, quando PhpManager carica il file, viene eseguito il payload dell'autore dell'attacco, che ottiene l'RCE e il controllo completo del server, spesso tramite una webshell o una reverse shell.



Mitigazione e riparazione
Per mitigare efficacemente i rischi associati a CVE-2025-32432, le organizzazioni devono avere visibilità e controllo sui propri componenti open source. Senza un inventario chiaro dei componenti, l'applicazione delle patch diventa un'operazione aleatoria.
OPSWAT , una tecnologia proprietaria dellapiattaforma MetaDefender®, risponde a questa esigenza fornendo un inventario di tutti i componenti software, le librerie, i container Docker e le dipendenze in uso. Consente alle organizzazioni di monitorare, proteggere e aggiornare i propri componenti in modo proattivo.


Nell'esempio sopra riportato,la tecnologia SBOM di MetaDefender ha eseguito la scansione del pacchetto nginx-ingress-controller che conteneva la vulnerabilità CVE-2025-32432. Il sistema ha automaticamente contrassegnato il problema come critico e ha fornito indicazioni sulle versioni corrette disponibili, consentendo ai team di dare rapidamente priorità alla vulnerabilità e di applicare la patch prima che potesse essere sfruttata.
OPSWAT è disponibile in MetaDefender Core e MetaDefender Software Chain™,consentendo ai team di sicurezza di identificare e agire più rapidamente sulle vulnerabilità. Con OPSWAT , i team di sicurezza possono:
- Individuazione rapida dei componenti vulnerabili: identifica immediatamente i componenti open source interessati dagli attacchi di deserializzazione. Ciò garantisce un intervento rapido nell'applicazione di patch o nella sostituzione delle librerie vulnerabili.
- Garantire patch e aggiornamenti proattivi - Monitorare costantemente i componenti open source tramite OPSWAT per prevenire le vulnerabilità di deserializzazione. OPSWAT è in grado di rilevare componenti obsoleti o non sicuri, consentendo aggiornamenti tempestivi e riducendo l'esposizione agli attacchi.
- Mantenere la conformità e la rendicontazione: OPSWAT aiuta le organizzazioni a soddisfare i requisiti di conformità, poiché i quadri normativi richiedono sempre più trasparenza nelle catene di fornitura del software.
Sei pronto a rafforzare la tua catena di fornitura software contro le minacce emergenti?
