
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
Write-up: https://abraxaslabs.tech/research/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, dessen nHeight noch 1 ist, 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 dennoch auf jedem pLeft. EP_Skip ist für Affinität gedacht, nicht für sqlite3WalkExprNN. Eine Kette aus 50 Knoten liefert 1. Ebenso 8k und 40k, jenseits des Tiefenlimits. 120k führen 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 RCE nachgewiesen) |
| 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 COLLATE-Höhenprüfung im Trunk |
| Auth | nicht vertrauenswürdiges SQL oder VIEW; Standard-load_extension bleibt deaktiviert |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18800. ASan-Amalgamation. Crash-Nachweis. |
Eine lange postfixe 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 am C-Stack. Das dokumentierte Ausdruckstiefenlimit greift bei diesem Operator nie.
SELECT 1 COLLATE BINARY COLLATE BINARY ... genügt. Dieselbe 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 zum Überlaufen brachte.
Dies ist ein Absturz des Embedder-Prozesses. Es ist keine Kontrolle über den Instruction Pointer. load_extension bleibt deaktiviert.
Zwanzig Quellcode-Suchen im SQLite-Tag version-3.53.4 nach OpenLiteSpeed. Neueste 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 deaktiviert.
parse.y für COLLATE besteht aus 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 Absturz zu behandeln (es gab 1 zurück); 40k als den Absturz zu behandeln (es gab ebenfalls 1 zurück, weit über SQLITE_LIMIT_EXPR_DEPTH 1000 hinaus); 120k zu benötigen, bevor ASan in sqlite3WalkExprNN starb.
Dies ist G1 von vierzehn Überbleibseln auf dem Pin. Die Geschwister sind andere Beiträge.
cd lab
./run.sh
ASan-Amalgamation aus offiziellem sqlite-src-3530400 (Fallback-Klon des Tags version-3.53.4). sqlite-collate-depth zusammenstellen. Dummy-HTTP auf 127.0.0.1:18800. An Loopback binden.
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. Die Pin-Prüfung ist SELECT sqlite_version() / SELECT sqlite_source_id().
Rufe sqlite3ExprCheckHeight auf dem COLLATE-Knoten auf, nachdem pLeft angehängt wurde, so wie es sqlite3PExpr bereits tut. Berechne nHeight aus dem Kind neu. Ein Postfix-Operator ist immer noch ein Ausdrucksbaum.
Trunk 252c0b7bf5 (2026-10-04) liegt 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 Standardwert 1000