
SQLite 3.53.4 – Hoch – Lokal – Absturz – COLLATE-Kette überschreitet SQLITE_LIMIT_EXPR_DEPTH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-collate-depth
Klasse: Crash Reichweite: Lokal
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
Die COLLATE-Grammatikaktion ruft niemals sqlite3ExprCheckHeight auf. sqlite3ExprAddCollateToken allokiert einen TK_COLLATE-Knoten mit nHeight noch auf 1 und hängt dann den vorherigen Ausdruck an pLeft. Gewöhnliche Operatoren laufen durch sqlite3PExpr und erhalten das dokumentierte SQLITE_LIMIT_EXPR_DEPTH (Standard 1000). Dieser Operator nicht.
Der Walker rekursiert weiterhin auf jedem pLeft. EP_Skip ist für Affinität, nicht für sqlite3WalkExprNN. Eine 50-Knoten-Kette gibt 1 zurück. Ebenso 8k und 40k, jenseits des Tiefenlimits. 120k führt zu einem ASan-Stack-Overflow in sqlite3WalkExprNN (rc=134). Kein RCE.
Der kanonische Baum ist https://sqlite.org/src. GitHub sqlite/sqlite ist ein Fossil-Mirror. Offizielles Zip sqlite-src-3530400. Public-Domain-Bibliothek. Dieses Paket ist AGPLv3.
| ID | noch keine CVE |
| Klasse | Crash (ASan-Stack-Overflow in sqlite3WalkExprNN; kein nachgewiesenes RCE) |
| Reichweite | Lokal (nicht vertrauenswürdiges SQL oder eine eingeschleuste VIEW) |
| CWE | CWE-674, CWE-770 |
| CVSS | Hoch: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Produkt | SQLite 3.53.4 |
| Betroffen | 3.53.4 (b09c88c); Überbleibsel der späteren Trunk-COLLATE-Höhenprüfung |
| Auth | nicht vertrauenswürdiges SQL oder VIEW; Standard-load_extension bleibt aus |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18800. ASan-Amalgamation. Crash-Witness. |
Eine lange Postfix-COLLATE BINARY-Kette als SQL einspeisen oder sie in einer VIEW innerhalb einer nicht vertrauenswürdigen .db platzieren. Der Host-Prozess durchläuft die Kette und stirbt auf dem C-Stack. Das dokumentierte Ausdruckstiefenlimit greift bei diesem Operator nie.
SELECT 1 COLLATE BINARY COLLATE BINARY ... genügt. Gleiche Form in CREATE VIEW v AS SELECT 1 COLLATE BINARY ... und dann SELECT * FROM v auf einer frischen Verbindung. Das Standard-SQLITE_LIMIT_SQL_LENGTH (1e9) hält die ~1,8 MB lange Kette, die in diesem Lab einen 8-MB-Stack überlaufen ließ.
Dies ist ein Absturz des Embedder-Prozesses. Es ist keine Instruction-Pointer-Kontrolle. load_extension bleibt aus.
Zwanzig Quellcode-Suchen in SQLite-Tag version-3.53.4 nach OpenLiteSpeed. Neuestes GA, nicht der 3.54.0-Entwurf. sqlite.org/security.html behandelt nicht vertrauenswürdiges SQL und nicht vertrauenswürdige .db als erstklassig. Standard-load_extension ist aus.
parse.y für COLLATE sind drei Zeilen:
expr(A) ::= expr(A) COLLATE ids(C). {
A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
}
sqlite3ExprAddCollateToken setzt pNew->pLeft = pExpr und EP_Collate|EP_Skip. sqlite3ExprAlloc ließ nHeight = 1. Kein sqlite3ExprCheckHeight. sqlite3PExpr erledigt beides für jeden anderen binären Operator.
Irrwege: 8k COLLATE als den Crash zu behandeln (es gab 1 zurück); 40k als den Crash zu behandeln (es gab ebenfalls 1 zurück, weit jenseits von SQLITE_LIMIT_EXPR_DEPTH 1000); 120k zu benötigen, bevor ASan in sqlite3WalkExprNN starb.
Dies ist G1 von vierzehn Überbleibseln auf dem Pin. Geschwister sind andere Posts.
cd lab
./run.sh
ASan-Amalgamation aus offiziellem sqlite-src-3530400 (Fallback-Clone von Tag version-3.53.4). Compose sqlite-collate-depth. Dummy-HTTP auf 127.0.0.1:18800. Binde es an Loopback.
SUCCESS sqlite-collate-depth how=asan-stack-overflow control=50 crash-n=120000 SQLITE-COLLATE-DEPTH-WITNESS
50 COLLATE gibt 1 zurück. 8k und 40k geben ebenfalls 1 zurück. 120k stirbt mit rc=134, ASan-Stack-Overflow in sqlite3WalkExprNN. Pin-Prüfung ist SELECT sqlite_version() / SELECT sqlite_source_id().
sqlite3ExprCheckHeight auf dem COLLATE-Knoten aufrufen, nachdem pLeft angehängt wurde, so wie es sqlite3PExpr bereits tut. nHeight vom Kind neu berechnen. Ein Postfix-Operator ist immer noch ein Ausdrucksbaum.
Trunk 252c0b7bf5 (2026-10-04) ist nach diesem GA.
b09c88c14082339b66c7b7158d609a771e64ca69)src/parse.y COLLATE-Aktionsrc/expr.c sqlite3ExprAddCollateToken, sqlite3ExprAlloc (nHeight = 1), sqlite3PExpr / sqlite3ExprCheckHeightsrc/walker.c sqlite3WalkExprNNsrc/sqliteLimit.h SQLITE_MAX_EXPR_DEPTH Standard 1000