
SQLite 3.53.4 - Élevé - Local - Crash - La chaîne COLLATE ignore SQLITE_LIMIT_EXPR_DEPTH
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-collate-depth
Classe : Crash Portée : Locale
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) - Hwaci
L'action de grammaire COLLATE n'appelle jamais sqlite3ExprCheckHeight. sqlite3ExprAddCollateToken alloue un nœud TK_COLLATE avec nHeight toujours à 1, puis accroche l'expression précédente à pLeft. Les opérateurs ordinaires passent par sqlite3PExpr et obtiennent la limite documentée SQLITE_LIMIT_EXPR_DEPTH (1000 par défaut). Cet opérateur, non.
Le walker récurse toujours sur chaque pLeft. EP_Skip concerne l'affinité, pas sqlite3WalkExprNN. Une chaîne de 50 nœuds renvoie 1. Il en va de même pour 8k et 40k, au-delà de la limite de profondeur. 120k provoque un débordement de pile ASan dans sqlite3WalkExprNN (rc=134). Pas de RCE.
L'arbre canonique est https://sqlite.org/src. GitHub sqlite/sqlite est un miroir Fossil. Zip officiel sqlite-src-3530400. Bibliothèque du domaine public. Ce pack est sous AGPLv3.
| ID | pas encore de CVE |
| Classe | Crash (débordement de pile ASan dans sqlite3WalkExprNN ; RCE non démontré) |
| Portée | Locale (SQL non fiable ou une VIEW plantée) |
| CWE | CWE-674, CWE-770 |
| CVSS | Élevé : 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| Produit | SQLite 3.53.4 |
| Affecté | 3.53.4 (b09c88c) ; reliquat de la vérification de hauteur COLLATE du trunk ultérieur |
| Auth | SQL non fiable ou VIEW ; load_extension reste désactivé par défaut |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18800 uniquement. Amalgamation ASan. Témoin de crash. |
Fournir une longue chaîne postfixe COLLATE BINARY en SQL, ou la planter dans une VIEW à l'intérieur d'un .db non fiable. Le processus hôte parcourt la chaîne et meurt sur la pile C. La limite documentée de profondeur d'expression ne s'applique jamais à cet opérateur.
SELECT 1 COLLATE BINARY COLLATE BINARY ... suffit. Même forme dans CREATE VIEW v AS SELECT 1 COLLATE BINARY ... puis SELECT * FROM v sur une nouvelle connexion. Le SQLITE_LIMIT_SQL_LENGTH par défaut (1e9) contient la chaîne d'environ 1,8 Mo qui a débordé une pile de 8 Mo dans ce lab.
Il s'agit d'un crash du processus intégrateur. Ce n'est pas un contrôle du pointeur d'instruction. load_extension reste désactivé.
Vingt recherches dans les sources du tag SQLite version-3.53.4 après OpenLiteSpeed. Dernière GA, pas le brouillon 3.54.0. sqlite.org/security.html traite le SQL non fiable et le .db non fiable comme des cas de première classe. load_extension est désactivé par défaut.
parse.y pour COLLATE fait trois lignes :
expr(A) ::= expr(A) COLLATE ids(C). {
A = sqlite3ExprAddCollateToken(pParse, A, &C, 1);
}
sqlite3ExprAddCollateToken définit pNew->pLeft = pExpr et EP_Collate|EP_Skip. sqlite3ExprAlloc a laissé nHeight = 1. Pas de sqlite3ExprCheckHeight. sqlite3PExpr fait ces deux choses pour tous les autres opérateurs binaires.
Fausses pistes : traiter 8k COLLATE comme le crash (il a renvoyé 1) ; traiter 40k comme le crash (il a aussi renvoyé 1, bien au-delà de SQLITE_LIMIT_EXPR_DEPTH 1000) ; nécessité de 120k avant qu'ASan ne meure dans sqlite3WalkExprNN.
C'est le G1 de quatorze reliquats sur le pin. Les frères sont d'autres posts.
cd lab
./run.sh
Amalgamation ASan depuis le sqlite-src-3530400 officiel (clone de secours du tag version-3.53.4). Compose sqlite-collate-depth. HTTP factice sur 127.0.0.1:18800. Le lier à loopback.
SUCCESS sqlite-collate-depth how=asan-stack-overflow control=50 crash-n=120000 SQLITE-COLLATE-DEPTH-WITNESS
50 COLLATE renvoie 1. 8k et 40k renvoient aussi 1. 120k meurt rc=134, débordement de pile ASan dans sqlite3WalkExprNN. La vérification du pin est SELECT sqlite_version() / SELECT sqlite_source_id().
Appeler sqlite3ExprCheckHeight sur le nœud COLLATE après avoir attaché pLeft, comme le fait déjà sqlite3PExpr. Recalculer nHeight à partir de l'enfant. Un opérateur postfixe est toujours un arbre d'expression.
Le trunk 252c0b7bf5 (2026-10-04) est postérieur à cette GA.
b09c88c14082339b66c7b7158d609a771e64ca69)src/parse.y action COLLATEsrc/expr.c sqlite3ExprAddCollateToken, sqlite3ExprAlloc (nHeight = 1), sqlite3PExpr / sqlite3ExprCheckHeightsrc/walker.c sqlite3WalkExprNNsrc/sqliteLimit.h SQLITE_MAX_EXPR_DEPTH par défaut 1000