
SQLite 3.53.4 - Élevé - Local - écriture hors limites dans le tas - croissance de nCol avec des noms identiques dans les changesets de session
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-session-ncol
Write-up : https://abraxaslabs.tech/research/sqlite-session-ncol
Classe : écriture hors limites (OOB) dans le tas Portée : Locale
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) avec -DSQLITE_ENABLE_SESSION. Un changeset à deux blocs qui réutilise le nom de table t avec nCol=2 puis nCol=64 contourne la réinitialisation de sessionTableInfo (sqlite3session.c:5619) et effectue un memset au-delà de l'aUpdateMask du premier bloc. WRITE ASan de taille 12 dans sessionUpdateFind. Contrôle : un seul UPDATE à 2 colonnes, apply-rc=0.
Pas une amalgamation par défaut, sauf si SESSION est activé. La NPD CVE-2026-50812 est corrigée à partir de 3.53.2+. Ce n'est pas une charge RCE weaponisée. L'oracle est le WRITE ASan.
| ID | pas encore de CVE |
| Classe | écriture OOB dans le tas (WRITE ASan de taille 12 ; RCE non démontrée) |
| Portée | Locale (changeset non fiable via sqlite3changeset_apply*) |
| CWE | CWE-787 |
| CVSS | Élevé : 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Produit | SQLite extension Session (Hwaci) |
| Affecté | 3.53.4 (b09c88c) compilé avec -DSQLITE_ENABLE_SESSION |
| Auth | l'hôte applique un changeset non fiable |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18900 uniquement. Témoin WRITE ASan de taille 12. |
Appliquer un changeset non fiable dont le second bloc de table réutilise un nom de table avec un nCol plus grand. Écriture OOB dans le tas. Extension de compilation. Pas une amalgamation par défaut, sauf si SESSION est activé.
Le premier bloc alloue aUpdateMask à partir de pIter->nCol. Le bloc ultérieur portant le même nom contourne la réinitialisation de sessionTableInfo et effectue un memset d'un masque plus grand par-dessus l'ancienne allocation. Lab : nCol=2 puis nCol=64 sur un UPDATE. WRITE ASan de taille 12 dans sessionUpdateFind. Contrôle : un seul UPDATE à 2 colonnes, apply-rc=0.
Ne traitez pas ce pack comme un gadget write-what-where. Le WRITE ASan de taille 12 est l'oracle.
Vingt recherches dans le code source de SQLite 3.53.4 après la vague FTS5 / session-NPD de 3.53.2. CVE-2026-50812 est corrigée (sessionBindRow traite une valeur manquante comme SQLITE_CORRUPT). Session indexe toujours SessionApplyCtx uniquement sur le nom de table. Un second bloc portant le même nom et un nombre de colonnes déclaré plus grand réutilise aUpdateMask.
Fausses pistes déjà consignées : considérer l'amalgamation par défaut comme dans le périmètre (SESSION est désactivé) ; re-déposer CVE-2026-50812 ; envoyer un seul bloc de table avec nCol=64 contre un schéma à 2 colonnes (schemaMismatch, aucune écriture) ; prétendre à une RCE à partir d'un memset de 12 octets.
cd lab
./run.sh
Amalgamation ASan issue du zip officiel sqlite-src-3530400. Compiler avec -DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK en supplément. Health sur 127.0.0.1:18900. Le lier à loopback.
SUCCESS sqlite-session-ncol how=asan-heap-write-sessionUpdateFind write-size=12 control-apply-rc=0 SQLITE-SESSION-NCOL-WITNESS
Lorsqu'un bloc de table de changeset ultérieur réutilise un nom, reconstruire SessionApplyCtx de la même manière qu'un nouveau nom le fait déjà : libérer aUpdateMask, relancer sessionTableInfo, refuser un nCol plus grand que le schéma actif. Trunk 3f57024aec / branch-3.53 a1dd7123d8 (2026-08-17) est postérieur à cette GA.
b09c88c14082339b66c7b7158d609a771e64ca69)sessionChangesetApply :5619, sessionUpdateFind :4381-4412