
SQLite 3.53.4 - Élevé - Local - Crash - Débordement de pile lors du nettoyage du fallback de VALUES UNION ALL
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-values-union
Classe : Crash Portée : Locale
SQLite 3.53.4 (b09c88c) - Hwaci
Le VALUES par défaut utilise une co-routine. WITH (ou un rechargement de schéma, ou une ligne non constante) force sqlite3MultiValues sur UNION ALL. La longueur du SELECT composé est ignorée lorsque SF_Values est défini (parse.y:562-567). Une liste de lignes suffisamment grande est alors rejetée par SQLITE_LIMIT_EXPR_DEPTH, et le récursif sqlite3ExprDeleteNN fait exploser la pile C sur le chemin de nettoyage d'erreur.
Un simple VALUES de 5000 lignes passe. WITH plus 1000 lignes échoue proprement (Expression tree is too large). WITH plus 300000 lignes provoque un stack-overflow ASan dans sqlite3ExprDeleteNN (rc=134). Pas de RCE.
| ID | pas encore de CVE |
| Classe | Crash (stack-overflow ASan sur ExprDelete ; RCE non démontré) |
| Portée | Locale (SQL non fiable, ou VALUES dans une VIEW/TRIGGER) |
| CWE | CWE-674 |
| 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 |
| Affecté | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc). Vestige du plafond VALUES composé du trunk ultérieur. |
| Auth | SQL de l'attaquant, ou un schéma planté qui emprunte le fallback UNION ALL |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18820 uniquement. Amalgamation ASan. Témoin de crash. |
Fournir du SQL non fiable qu'un hôte va préparer. Préfixer une énorme liste VALUES par WITH pour désactiver le chemin co-routine. L'analyse est censée échouer avec une erreur de profondeur d'expression. Le nettoyage de cet arbre récurse dans sqlite3ExprDeleteNN jusqu'à ce que le processus meure.
Le même fallback se déclenche lorsque VALUES réside dans une VIEW ou un TRIGGER (db->init.busy). L'hôte est l'embedder : un CLI, une application qui prépare du SQL attaquant, un service qui ouvre un .db hostile. SQLite n'évalue pas les octets VALUES comme du code. Le crash est la découverte.
Vingt chasses dans les sources de github.com/sqlite/sqlite tag version-3.53.4. La skip list avait déjà fermé CVE-2026-11824, session NPD, concat_ws, LOOKASIDE, JSON UAF, WAL-reset. Le load_extension par défaut est désactivé. Le vestige Parser/VDBE était ce skip VALUES UNION ALL plus un destructeur récursif.
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() parcourt pPrior de manière itérative. sqlite3ExprDeleteNN() récurse toujours sur pRight et sur pLeft lorsque EP_Static est défini.
Fausses pistes : 1000 lignes avec WITH échouent proprement au plafond de profondeur documenté et ne crashent pas ; il fallait 300000 lignes pour que la profondeur du destructeur fasse exploser la pile C de 8 MiB. Un simple VALUES reste sur la co-routine et constitue le contrôle négatif.
cd lab
./run.sh
Zip source canonique 3.53.4, sqlite3 ASan. Compose sqlite-values-union. Publié sur 127.0.0.1:18820. Liez-le à 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
Appliquer SQLITE_LIMIT_COMPOUND_SELECT à VALUES de la même manière que les autres composés sont plafonnés. Parcourir la chaîne UNION ALL de manière itérative à la suppression, ou plafonner EXPR_DEPTH avant que l'arbre ne soit construit afin que le nettoyage ne puisse pas récurser hors de la pile C. Le trunk ultérieur (Bug 2026-10-04T05:34:47Z) est postérieur à cette GA.
b09c88c14082339b66c7b7158d609a771e64ca69)2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bccsrc/parse.y:562-567 skip du SELECT composé lorsque SF_Values est définisrc/insert.c:681-704 fallback UNION ALL de sqlite3MultiValuessrc/expr.c:1406-1430 récursif sqlite3ExprDeleteNN