Strapi CVE-2023-22894: da bug 'medio' a RCE non autenticato nel mirino CISA
CVE-2023-22894 sembra una fuga di dati 'media', ma concatenata porta a RCE non autenticato su Strapi end-of-life. CISA l'ha appena aggiunta al KEV.
Pubblicato da Zero Hunt, un red team AI autonomo su un'appliance on-premise con AI privata: penetration test automatizzato per reti e infrastrutture, in black box o gray box, con una persona che approva ogni passo che conta.
L'8 ottobre 2026 CISA ha inserito CVE-2023-22894 — una falla di Strapi del 2023 — nel suo catalogo Known Exploited Vulnerabilities, con scadenza di remediation federale fissata all'11 ottobre, tre giorni dopo. Sulla carta il bug è insignificante: NVD lo valuta 4.9, medio, e lo cataloga come fuga di informazioni che richiede privilegi elevati. Quel punteggio è la trappola. I ricercatori che lo hanno segnalato all'origine hanno dimostrato che CVE-2023-22894 si può sfruttare senza autenticazione e che, concatenato a un secondo bug di Strapi, porta all'esecuzione di codice remoto su qualunque istanza con una build end-of-life vulnerabile. Un inserimento nel KEV significa una cosa sola: qualcuno lo sta già usando.
Notizia in evoluzione — pubblicata alle 20:05 (18:05 UTC) dell'8 ottobre 2026. Aggiornata man mano che vendor e CISA pubblicano.
In breve
| CVE | CVE-2023-22894 |
| Prodotto / versioni colpite | Strapi (@strapi/strapi) · >= 3.2.1, < 4.8.0 |
| Corretta in | 4.8.0 (rilasciata il 15 marzo 2023); il partner della catena RCE CVE-2023-22621 è stato corretto in 4.5.6 (11 gennaio 2023) |
| CVSS | 4.9 Medio · CVSS 3.1 · NVD/NIST · AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:N/A:N. Il punteggio secondario CNA è 7.2 Alto · AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H |
| Sfruttata attivamente | Sì · CISA KEV (inserita il 2026-10-08) |
| CISA KEV | Inserita il 2026-10-08; scadenza federale 2026-10-11 (BOD 26-04); triage forense non richiesto |
| PoC pubblico | Sì — sia la disclosure del vendor sia il write-up originale del ricercatore documentano l'intera catena |
| Advisory ufficiale | Disclosure di sicurezza Strapi |
Perché CVE-2023-22894 non è un bug di gravità media
Strapi è uno dei CMS headless open-source più diffusi, e per design le sue API dei contenuti si affacciano direttamente su internet. CVE-2023-22894 è una falla del filtro di query: Strapi rimuove correttamente i campi privati come password e reset_password_token dalle risposte delle API, ma non li rimuove dalla query eseguita sul database. Un attaccante può così filtrare su un campo che non potrà mai leggere.
Questo si trasforma in un oracolo cieco. Usando operatori di filtro come $startsWith, si pone all'API una domanda sì/no un carattere alla volta — l'hash della password admin inizia con $2a? il reset token inizia con f? — e si osserva se l'insieme dei risultati cambia. Carattere dopo carattere, esattamente come in una blind SQL injection, il segreto viene fuori.
Il motivo per cui tutto questo è non autenticato, nonostante il vettore PR:H di NVD, è il modello relazionale. Qualunque collezione pubblica con permesso find — un endpoint articles o comments, il tipo che ogni sito Strapi espone — porta con sé le relazioni auto-generate createdBy e updatedBy, che puntano dritto alla tabella degli utenti admin. La ricerca originale di ghostccamm mostra il percorso completo:
filters[$and][0][createdBy][email][$startsWith]=afa trapelare l'email dell'admin una lettera alla volta. Si innesca un reset password per quell'account, si estraereset_password_tokencon la stessa tecnica, si imposta una nuova password e si ottiene l'accesso Super Administrator.
Dal Super Admin, il secondo bug completa l'opera. CVE-2023-22621 è una server-side template injection nei template email del plugin users-permissions: Strapi li renderizza con _.template() di lodash, e la regex di validazione si può aggirare. Un attaccante che controlla il pannello admin modifica il template dell'email di conferma con un payload <%= %> che lancia una shell, abilita la conferma via email e registra un utente per farlo scattare. La disclosure di Strapi conferma che i due bug combinati producono RCE non autenticato su tutti gli Strapi <= 4.5.5. Il punteggio 4.9 descrive il primo anello isolato; il risultato nel mondo reale è esecuzione di codice come processo applicativo.
Chi è esposto e come verificare
- La primitiva di information disclosure colpisce Strapi >= 3.2.1, < 4.8.0.
- La catena completa di RCE non autenticato richiede il partner SSTI e quindi colpisce Strapi <= 4.5.5.
- Strapi v3 e le prime v4 sono end-of-life — ed è proprio per questo che l'entry KEV di CISA invita gli operatori a passare a una versione supportata, non a dare per scontato che esista una patch per il proprio branch.
Verifica in fretta la versione in esecuzione: il footer del pannello admin la mostra, npm ls @strapi/strapi (o cat package.json) riporta il pacchetto installato, e la build /admin spesso espone la release. Se il numero è inferiore a 4.8.0 e il servizio è raggiungibile da internet, consideralo esposto adesso.
Remediation
1. Sono interessato? Conferma la versione (npm ls @strapi/strapi, package.json, o il footer admin). Inventaria ogni collection type pubblico e verifica se il find è abilitato per il ruolo pubblico — sono gli endpoint che fanno trapelare createdBy.
2. Patch — versioni corrette esatte. Aggiorna a 4.8.0 o successiva, che chiude la fuga dal filtro; la SSTI dei template email era già corretta in 4.5.6. Se sei su v3 o una prima v4 fuori supporto, la soluzione è una migrazione a un branch mantenuto, non una point release — pianificala come tale.
3. Non puoi applicare la patch ora? Controlli compensativi. Sul reverse proxy o sul WAF, blocca le query string che filtrano su colonne sensibili o relazionali — rifiuta le richieste che contengono [password], [reset_password_token], [resetPasswordToken] o operatori $startsWith/$contains annidati sotto createdBy/updatedBy. Togli il permesso pubblico find da ogni collezione che non ne ha strettamente bisogno. Blocca i template email di users-permissions e disabilita registrazione pubblica / conferma via email fino alla patch. Metti il pannello admin dietro VPN o IP allow-list.
4. Caccia alla compromissione. Usando solo gli indicatori pubblicati da ricercatore e vendor, controlla i log per:
- Parametri di filtro che puntano a
email,passwordoreset_password_token— regex(\[|%5B)\s*(email|password|reset_password_token)\s*(\]|%5D)— soprattutto in raffiche di richieste quasi identiche (l'oracolo cieco è rumoroso). Mappa su MITRE ATT&CK T1190 (Exploit Public-Facing Application) e T1212 (Exploitation for Credential Access). - Richieste di reset password seguite immediatamente da molte query filtrate, poi un login admin da un nuovo IP — la sequenza di account takeover.
- Richieste
PUTa/users-permissions/email-templatescon nel corpo delimitatori lodash<%= %>che contengono JavaScript — la scrittura SSTI, ATT&CK T1059 (Command and Scripting Interpreter). - Account admin nuovi o inattesi e registrazioni utente appena innescate in coincidenza con una modifica di template.
5. Bonifica + verifica. Se vedi questi pattern, dai per scontato che il Super Admin sia stato preso: ruota ogni credenziale admin, invalida tutti i valori reset_password_token, ruota JWT_SECRET e ADMIN_JWT_SECRET, revoca e riemetti gli API token. Verifica ogni template email per delimitatori iniettati. Ricostruisci l'istanza da un'immagine integra invece di ripulirla sul posto, poi ri-testa l'oracolo del filtro dopo la patch per confermare che non risponda più.
Cosa non si sa ancora
L'entry di CISA segna l'uso noto da parte di ransomware come Sconosciuto e non nomina un threat actor, una campagna o un numero di vittime. L'inserimento nel KEV conferma che lo sfruttamento è in corso, ma non la sua portata, né se si tratti di scansione opportunistica a tappeto o di attacchi mirati, né quanto si estenda la popolazione end-of-life ancora raggiungibile su internet. Aggiorneremo questo articolo man mano che vendor, CISA o chi gestisce gli incidenti pubblicheranno di più.
Dove ti lascia tutto questo
La lezione di CVE-2023-22894 è che un punteggio di gravità è un'etichetta, non una misura della tua esposizione. Un PR:H, 4.9 "medio" è diventato un percorso non autenticato verso il Super Admin e poi verso l'esecuzione di codice — e nessuno scanner che si basa sul CVSS lo avrebbe messo vicino alla cima della tua coda. L'unico modo per sapere cosa fa davvero una vulnerabilità al tuo deployment è eseguire la catena contro di esso come farebbe un attaccante.
È ciò che fa l'red team autonomo basato su AI di Zero Hunt: uno swarm di 10 agenti, che gira on-premise su modelli privati con un human in the loop per qualsiasi azione che tocchi un sistema reale, identifica la build Strapi esatta, poi fa scrivere e iterare a un coding agent sigillato un proof-of-concept per questa specifica catena finché non funziona in modo dimostrabile — in black-box, come ci arriva l'attaccante vero, non una ricerca per firma che si fida del 4.9. Se la catena scatta, ottieni un exploit firmato e riproducibile depositato sull'asset, non un ticket "medio" che resta fermo un trimestre. E poiché l'oracolo del filtro è così rumoroso — centinaia di richieste quasi identiche che deducono un segreto byte dopo byte — il modello di analisi del traffico di Zero Hunt, quattro teste di inferenza che girano sulla GPU dell'apparato a velocità di rete, segnala quel pattern di brute-force mentre sta avvenendo, il che per un CMS end-of-life che non puoi applicare patch in modo pulito è spesso l'unico controllo che ti resta. Vedi la guida al penetration testing automatizzato per capire come una validazione continua e basata sulla prova chiude il divario che un numero CVSS lascia aperto, oppure contattaci.
Tutte le vulnerabilità che CISA segnala come sfruttate, con le scadenze federali: tracker CISA KEV →
È sfruttabile nel tuo ambiente?
Zero Hunt lo verifica sulla tua rete: un red team AI autonomo su un'appliance on-premise, con AI privata, in black box o gray box e con una persona che approva ogni passo che conta. La prova di cosa è sfruttabile, la correzione e le evidenze firmate — nessun dato esce dal tuo perimetro.