
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
Article : https://abraxaslabs.tech/research/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 dont nHeight vaut encore 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. Idem pour 8k et 40k, au-delà de la limite de profondeur. 120k provoquent 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 dans le 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ée) |
| Portée | Locale (SQL non fiable ou 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 au sein 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. La valeur par défaut SQLITE_LIMIT_SQL_LENGTH (1e9) autorise 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 hôte. 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 premier ordre. load_extension est désactivé par défaut.
parse.y pour COLLATE tient en 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écessiter 120k avant qu'ASan ne meure dans sqlite3WalkExprNN.
Ceci est G1 parmi 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). Composer sqlite-collate-depth. HTTP factice sur 127.0.0.1:18800. Le lier à l'interface 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 correctif 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 reste un arbre d'expression.
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