
SQLite 3.53.4 – Hoch – Lokal – Absturz – VALUES UNION ALL Fallback-Bereinigung Stack-Überlauf
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-values-union
Klasse: Crash Reichweite: Lokal
SQLite 3.53.4 (b09c88c) - Hwaci
Standardmäßig verwendet VALUES eine Co-Routine. WITH (oder ein Schema-Reload oder eine nicht-konstante Zeile) zwingt sqlite3MultiValues auf UNION ALL. Die Längenprüfung für Compound-SELECT wird übersprungen, wenn SF_Values gesetzt ist (parse.y:562-567). Eine ausreichend große Zeilenliste wird dann von SQLITE_LIMIT_EXPR_DEPTH abgelehnt, und das rekursive sqlite3ExprDeleteNN sprengt den C-Stack auf dem Fehlerbereinigungspfad.
Einfaches VALUES mit 5000 Zeilen ist in Ordnung. WITH plus 1000 Zeilen führt zu einem sauberen Fehler (Expression tree is too large). WITH plus 300000 Zeilen ist ein ASan-Stack-Overflow in sqlite3ExprDeleteNN (rc=134). Kein RCE.
| ID | noch keine CVE |
| Klasse | Crash (ASan-Stack-Overflow bei ExprDelete; kein nachgewiesenes RCE) |
| Reichweite | Lokal (nicht vertrauenswürdiges SQL oder VALUES innerhalb von 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 |
| Produkt | SQLite |
| Betroffen | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc). Überbleibsel der späteren Trunk-VALUES-Compound-Begrenzung. |
| Auth | Angreifer-SQL oder ein platziertes Schema, das den UNION-ALL-Fallback auslöst |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18820. ASan-Amalgamation. Crash-Witness. |
Nicht vertrauenswürdiges SQL einspeisen, das ein Host vorbereitet. Ein riesige VALUES-Liste mit WITH präfixen, damit der Co-Routine-Pfad deaktiviert ist. Das Parsen soll eigentlich mit einem Expression-Depth-Fehler fehlschlagen. Die Bereinigung dieses Baums rekursiert in sqlite3ExprDeleteNN, bis der Prozess stirbt.
Derselbe Fallback greift, wenn VALUES in einer VIEW oder einem TRIGGER lebt (db->init.busy). Der Host ist der Embedder: eine CLI, eine App, die Angreifer-SQL vorbereitet, ein Dienst, der eine feindliche .db öffnet. SQLite evaluiert die VALUES-Bytes nicht als Code. Der Crash ist der Befund.
Zwanzig Quellcode-Suchen im Tag version-3.53.4 von github.com/sqlite/sqlite. Die Skip-Liste hatte bereits CVE-2026-11824, Session-NPD, concat_ws, LOOKASIDE, JSON-UAF und WAL-Reset geschlossen. Standardmäßig ist load_extension deaktiviert. Ein Parser/VDBE-Überbleibsel war dieser VALUES-UNION-ALL-Skip plus ein rekursiver Destruktor.
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() durchläuft pPrior iterativ. sqlite3ExprDeleteNN() rekursiert weiterhin auf pRight und auf pLeft, wenn EP_Static gesetzt ist.
Irrwege: 1000 Zeilen mit WITH führen am dokumentierten Depth-Cap zu einem sauberen Fehler und stürzen nicht ab; es waren 300000 Zeilen nötig, damit die Destruktor-Tiefe den 8 MiB großen C-Stack sprengt. Einfaches VALUES bleibt auf der Co-Routine und ist die Negativkontrolle.
cd lab
./run.sh
Kanonisches 3.53.4-Quell-Zip, ASan sqlite3. Compose sqlite-values-union. Veröffentlicht auf 127.0.0.1:18820. Binde es an 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
Wende SQLITE_LIMIT_COMPOUND_SELECT auf VALUES genauso an, wie andere Compounds begrenzt werden. Durchlaufe die UNION-ALL-Kette beim Löschen iterativ, oder begrenze EXPR_DEPTH, bevor der Baum aufgebaut wird, damit die Bereinigung nicht vom C-Stack rekursieren kann. Der spätere Trunk (Bug 2026-10-04T05:34:47Z) liegt nach diesem GA.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/parse.y:562-567 Compound-SELECT-Skip, wenn SF_Values gesetzt istsrc/insert.c:681-704 sqlite3MultiValues UNION-ALL-Fallbacksrc/expr.c:1406-1430 rekursives sqlite3ExprDeleteNN