
SQLite 3.53.4 - Alto - Locale - Crash - VALUES UNION ALL fallback cleanup stack overflow
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-values-union
Write-up: https://abraxaslabs.tech/research/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.
| ID | nessuna CVE al momento |
| Classe | Crash (ASan stack-overflow su ExprDelete; RCE non dimostrata) |
| Portata | Locale (SQL non attendibile, o VALUES all'interno di VIEW/TRIGGER) |
| CWE | CWE-674 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Prodotto | SQLite |
| Affetto | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc). Residuo del successivo limite compound VALUES del trunk. |
| Auth | SQL dell'attaccante, o uno schema piantato che ricade sul fallback UNION ALL |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18820. Amalgamation ASan. Crash witness. |
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.
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.
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
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.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/parse.y:562-567 salto del compound-SELECT quando SF_Values è impostatosrc/insert.c:681-704 fallback UNION ALL di sqlite3MultiValuessrc/expr.c:1406-1430 sqlite3ExprDeleteNN ricorsiva