
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
Classe : écriture hors limites dans le tas (heap OOB write) 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. Écriture 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é. Le NPD CVE-2026-50812 est corrigé à partir de 3.53.2. Ce n'est pas une charge utile RCE weaponisée. L'oracle est l'écriture ASan.
| ID | pas encore de CVE |
| Classe | écriture hors limites dans le tas (écriture ASan de taille 12 ; RCE non démontré) |
| 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 d'écriture 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 hors limites 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 en UPDATE. Écriture 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. L'écriture 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é (sessionBindRow traite une valeur manquante comme SQLITE_CORRUPT). Session indexe toujours SessionApplyCtx uniquement par 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. Compilation supplémentaire -DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK. Health sur 127.0.0.1:18900. Liez-le à la 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 d'un changeset ultérieur réutilise un nom, reconstruire SessionApplyCtx comme le fait déjà un nouveau nom : 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