
SQLite 3.53.4 - Alto - Locale - scrittura OOB nell'heap - changeset di sessione con crescita nCol omonima
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-session-ncol
Write-up: https://abraxaslabs.tech/research/sqlite-session-ncol
Classe: scrittura OOB nell'heap Raggiungibilità: Locale
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) con -DSQLITE_ENABLE_SESSION. Un changeset a due blocchi che riutilizza il nome di tabella t con nCol=2 e poi nCol=64 salta il reset di sessionTableInfo (sqlite3session.c:5619) ed esegue memset oltre la aUpdateMask del primo blocco. Scrittura ASan di dimensione 12 in sessionUpdateFind. Controllo: singolo UPDATE a 2 colonne apply-rc=0.
Non è un amalgamation predefinito a meno che SESSION non sia attivo. La NPD CVE-2026-50812 è chiusa su 3.53.2+. Non è un payload RCE weaponizzato. L'oracolo è la scrittura ASan.
| ID | nessuna CVE al momento |
| Classe | scrittura OOB nell'heap (scrittura ASan di dimensione 12; RCE non dimostrata) |
| Raggiungibilità | Locale (changeset non attendibile tramite sqlite3changeset_apply*) |
| CWE | CWE-787 |
| CVSS | Alto: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Prodotto | SQLite extra Session (Hwaci) |
| Affetto | 3.53.4 (b09c88c) compilato con -DSQLITE_ENABLE_SESSION |
| Auth | l'host applica un changeset non attendibile |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18900. Testimone ASan WRITE-of-size-12. |
Applicare un changeset non attendibile il cui secondo blocco di tabella riutilizza un nome di tabella con un nCol maggiore. Scrittura OOB nell'heap. Extra di compilazione. Non è un amalgamation predefinito a meno che SESSION non sia attivo.
Il primo blocco alloca aUpdateMask in base a pIter->nCol. Il blocco successivo con lo stesso nome salta il reset di sessionTableInfo ed esegue memset di una maschera più grande sopra la vecchia allocazione. Lab: UPDATE con nCol=2 e poi nCol=64. Scrittura ASan di dimensione 12 in sessionUpdateFind. Controllo: singolo UPDATE a 2 colonne apply-rc=0.
Non trattare questo pacchetto come un gadget write-what-where. La scrittura ASan di dimensione 12 è l'oracolo.
Venti ricerche nel codice sorgente di SQLite 3.53.4 dopo l'ondata FTS5 / session-NPD della 3.53.2. CVE-2026-50812 è chiusa (sessionBindRow tratta un valore mancante come SQLITE_CORRUPT). Session continua a identificare SessionApplyCtx solo tramite il nome della tabella. Un secondo blocco con lo stesso nome e un numero di colonne dichiarate maggiore riutilizza aUpdateMask.
Vicoli ciechi già registrati: considerare l'amalgamation predefinito nel perimetro (SESSION è disattivato); ri-segnalare CVE-2026-50812; inviare un singolo blocco di tabella con nCol=64 contro uno schema a 2 colonne (schemaMismatch, nessuna scrittura); dichiarare RCE da un memset di 12 byte.
cd lab
./run.sh
Amalgamazione ASan dallo zip ufficiale sqlite-src-3530400. Compilare con -DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK aggiuntivi. Health su 127.0.0.1:18900. Associarlo al loopback.
SUCCESS sqlite-session-ncol how=asan-heap-write-sessionUpdateFind write-size=12 control-apply-rc=0 SQLITE-SESSION-NCOL-WITNESS
Quando un blocco di tabella changeset successivo riutilizza un nome, ricostruisci SessionApplyCtx come già avviene per un nuovo nome: libera aUpdateMask, riesegui sessionTableInfo, rifiuta un nCol maggiore rispetto allo schema attivo. Trunk 3f57024aec / branch-3.53 a1dd7123d8 (2026-08-17) è successivo a questa GA.
b09c88c14082339b66c7b7158d609a771e64ca69)sessionChangesetApply :5619, sessionUpdateFind :4381-4412