
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
Classe: Crash Reach: 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 compound-SELECT viene saltata quando SF_Values è impostato (parse.y:562-567). Una lista di righe sufficientemente grande viene quindi rifiutata 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 è uno stack-overflow ASan in sqlite3ExprDeleteNN (rc=134). Non è RCE.
| ID | nessuna CVE al momento |
| Classe | Crash (stack-overflow ASan su ExprDelete; RCE non dimostrata) |
| Reach | 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 |
| Affected | 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 impiantato che ricade nel fallback UNION ALL |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18820. Amalgamazione ASan. Crash witness. |
Fornire SQL non attendibile che un host preparerà. Anteporre a una grande lista VALUES la clausola WITH in modo che il percorso della co-routine sia disattivato. 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 del 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() ricorre ancora su pRight e su pLeft quando EP_Static è impostato.
Vicoli ciechi: 1000 righe con WITH generano un errore pulito al limite di profondità documentato e non vanno in crash; sono servite 300000 righe perché la profondità del distruttore facesse esplodere lo stack C da 8 MiB. Un semplice VALUES rimane 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 a VALUES allo stesso modo in cui vengono limitati gli altri compound. Percorrere la catena UNION ALL in modo iterativo alla cancellazione, oppure limitare EXPR_DEPTH prima che l'albero venga costruito, così che la pulizia non possa ricorrere oltre lo 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 ricorsivo