Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
sqlite-values-union — SQLite 3.53.4 - Alto - Locale - Crash - VALUES UNION ALL fallback cleanup stack overflow | Kitploit
Strumenti/GitHubGitHub/abraxas/sqlite-values-union
Analisi delle VulnerabilitàExploitFuzzingAnalisi di BinariPaper e RicercaSicurezza dei DatabaseLab e Pratica
GitHubabraxas/sqlite-values-union

sqlite-values-union

SQLite 3.53.4 - Alto - Locale - Crash - VALUES UNION ALL fallback cleanup stack overflow

Vedi Repository
176 giorni faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

Abraxas Labs - sqlite-values-union

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  sqlite-values-union

Write-up: https://abraxaslabs.tech/research/sqlite-values-union

sqlite-values-union

Classe: Crash Portata: Locale

SQLite 3.53.4 (b09c88c) - Hwaci

Il VALUES predefinito usa una co-routine. WITH (o il ricaricamento dello schema, o una riga non costante) forza sqlite3MultiValues su UNION ALL. La lunghezza del SELECT composto viene saltata quando SF_Values è impostato (parse.y:562-567). Un elenco di righe sufficientemente grande viene quindi rifiutato da SQLITE_LIMIT_EXPR_DEPTH, e la ricorsione di sqlite3ExprDeleteNN fa esplodere lo stack C nel percorso di pulizia dell'errore.

Un semplice VALUES di 5000 righe va bene. WITH più 1000 righe genera un errore pulito (Expression tree is too large). WITH più 300000 righe provoca un ASan stack-overflow in sqlite3ExprDeleteNN (rc=134). Non è RCE.

IDnessuna CVE al momento
ClasseCrash (ASan stack-overflow su ExprDelete; RCE non dimostrata)
PortataLocale (SQL non attendibile, o VALUES all'interno di VIEW/TRIGGER)
CWECWE-674
CVSSHigh: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
ProdottoSQLite
Affetto3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc). Residuo del successivo limite compound VALUES del trunk.
AuthSQL dell'attaccante, o uno schema piantato che ricade sul fallback UNION ALL
LicenzaGNU Affero GPL v3.0
Labsolo 127.0.0.1:18820. Amalgamation ASan. Crash witness.

Cosa può fare un attaccante

Fornire SQL non attendibile che un host preparerà. Anteporre a un'enorme lista VALUES la clausola WITH in modo da disattivare il percorso della co-routine. Il parsing dovrebbe fallire con un errore di profondità dell'espressione. La pulizia di quell'albero ricorre in sqlite3ExprDeleteNN finché il processo non muore.

Lo stesso fallback si attiva quando VALUES risiede in una VIEW o TRIGGER (db->init.busy). L'host è l'embedder: una CLI, un'app che prepara SQL dell'attaccante, un servizio che apre un .db ostile. SQLite non valuta i byte di VALUES come codice. Il crash è la scoperta.

Come l'ho trovato

Venti ricerche nel sorgente di github.com/sqlite/sqlite tag version-3.53.4. La skip list aveva già chiuso CVE-2026-11824, session NPD, concat_ws, LOOKASIDE, JSON UAF, WAL-reset. Il load_extension predefinito è disattivato. Il residuo nel parser/VDBE era questo salto di VALUES UNION ALL più un distruttore ricorsivo.

if( (p->selFlags & (SF_MultiValue|SF_Values))==0
 && (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0
 && cnt>mxSelect
){
  sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
}
if( pParse->bHasWith
 || pParse->db->init.busy
 || exprListIsConstant(pParse,pRow)==0
 ...
){
  /* The co-routine method cannot be used. Fall back to UNION ALL. */
  ...
  pSelect->op = TK_ALL;
  pSelect->pPrior = pLeft;
}

clearSelect() percorre pPrior in modo iterativo. sqlite3ExprDeleteNN() continua comunque a ricorrere su pRight e su pLeft quando EP_Static è impostato.

Vicoli ciechi: 1000 righe con WITH restituiscono un errore in modo pulito al limite di profondità documentato e non causano crash; sono state necessarie 300000 righe affinché la profondità del distruttore facesse saltare lo stack C da 8 MiB. Il semplice VALUES resta sulla co-routine ed è il controllo negativo.

Lab

cd lab
./run.sh

Zip sorgente canonico 3.53.4, sqlite3 con ASan. Compose sqlite-values-union. Pubblicato su 127.0.0.1:18820. Associalo al loopback.

SUCCESS sqlite-values-union how=with-values-union-all-fallback-exprdelete rows=300000 crash=asan-stack-overflow plain=5000 depth-error=1000 SQLITE-VALUES-UNION-WITNESS

La correzione

Applicare SQLITE_LIMIT_COMPOUND_SELECT ai VALUES allo stesso modo in cui vengono limitati gli altri compound. Percorrere la catena UNION ALL in modo iterativo durante l'eliminazione, oppure limitare EXPR_DEPTH prima che l'albero venga costruito, così che la pulizia non possa ricorrere fuori dallo stack C. Il trunk successivo (Bug 2026-10-04T05:34:47Z) è posteriore a questa GA.

Riferimenti

  • sqlite.org/src tag version-3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69)
  • SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc
  • src/parse.y:562-567 salto del compound-SELECT quando SF_Values è impostato
  • src/insert.c:681-704 fallback UNION ALL di sqlite3MultiValues
  • src/expr.c:1406-1430 sqlite3ExprDeleteNN ricorsiva
  • sqlite.org/cves.html · sqlite.org/security.html
Scarica lo strumento