Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
sqlite-values-union — SQLite 3.53.4 - Élevé - Local - Crash - Débordement de pile lors du nettoyage du fallback de VALUES UNION ALL | Kitploit
Outils/GitHubGitHub/abraxas/sqlite-values-union
Analyse des VulnérabilitésExploitationFuzzingAnalyse de BinairesArticles et RechercheSécurité des Bases de DonnéesLabs et Pratique
GitHubabraxas/sqlite-values-union

sqlite-values-union

SQLite 3.53.4 - Élevé - Local - Crash - Débordement de pile lors du nettoyage du fallback de VALUES UNION ALL

Voir le dépôt
17il y a 6 joursPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Abraxas Labs - sqlite-values-union

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  sqlite-values-union

Write-up : https://abraxaslabs.tech/research/sqlite-values-union

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 sqlite3ExprDeleteNN récursif fait exploser la pile C sur le chemin de nettoyage après erreur.

Un VALUES simple 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.

IDpas encore de CVE
ClasseCrash (stack-overflow ASan sur ExprDelete ; RCE non démontrée)
PortéeLocale (SQL non fiable, ou VALUES dans une VIEW/TRIGGER)
CWECWE-674
CVSSÉlevé : 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
ProduitSQLite
Affecté3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc). Résidu du plafond ultérieur des VALUES composés sur le trunk.
AuthSQL de l'attaquant, ou un schéma planté qui déclenche le repli UNION ALL
LicenceGNU Affero GPL v3.0
Lab127.0.0.1:18820 uniquement. Amalgamation ASan. Témoin de crash.

Ce qu'un attaquant peut faire

Fournir du SQL non fiable qu'un hôte va préparer. Préfixer une énorme liste VALUES par WITH afin de 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 repli se déclenche lorsque VALUES réside dans une VIEW ou un TRIGGER (db->init.busy). L'hôte est l'embedder : une 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 constitue la découverte.

Comment je l'ai trouvé

Vingt chasses dans les sources de github.com/sqlite/sqlite au tag version-3.53.4. La liste d'exclusion avait déjà clos CVE-2026-11824, session NPD, concat_ws, LOOKASIDE, JSON UAF, WAL-reset. Le load_extension par défaut est désactivé. Le résidu du parseur/VDBE était ce contournement 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 à la limite de profondeur documentée et ne provoquent pas de plantage ; il a fallu 300000 lignes pour que la profondeur du destructeur fasse déborder la pile C de 8 MiB. Un simple VALUES reste sur la co-routine et constitue le contrôle négatif.

Lab

cd lab
./run.sh

Zip source canonique 3.53.4, sqlite3 avec ASan. Compose sqlite-values-union. Publié sur 127.0.0.1:18820. Liez-le à l'interface 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

Le correctif

Appliquer SQLITE_LIMIT_COMPOUND_SELECT aux 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 lors de la suppression, ou plafonner EXPR_DEPTH avant la construction de l'arbre 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.

Références

  • sqlite.org/src tag version-3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69)
  • SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc
  • src/parse.y:562-567 saut du compound-SELECT lorsque SF_Values est défini
  • src/insert.c:681-704 repli UNION ALL de sqlite3MultiValues
  • src/expr.c:1406-1430 sqlite3ExprDeleteNN récursif
  • sqlite.org/cves.html · sqlite.org/security.html
Télécharger l’outil