
SQLite 3.53.4 - Alta - Local - gravação fora dos limites no heap - crescimento de nCol com mesmo nome no changeset da sessão
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-session-ncol
Classe: escrita OOB no heap Alcance: Local
SQLite 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) com -DSQLITE_ENABLE_SESSION. Um changeset de dois blocos que reutiliza o nome de tabela t com nCol=2 e depois nCol=64 ignora o reset de sessionTableInfo (sqlite3session.c:5619) e faz memset além do aUpdateMask do primeiro bloco. Escrita ASan de tamanho 12 em sessionUpdateFind. Controle: aplicação de um único UPDATE de 2 colunas com apply-rc=0.
Não é uma amalgamação padrão a menos que SESSION esteja ativado. O NPD CVE-2026-50812 está fechado no 3.53.2+. Não é um payload RCE weaponizado. O oráculo é a escrita ASan.
| ID | ainda sem CVE |
| Classe | escrita OOB no heap (escrita ASan de tamanho 12; RCE não demonstrado) |
| Alcance | Local (changeset não confiável via 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 |
| Produto | SQLite Session extra (Hwaci) |
| Afetado | 3.53.4 (b09c88c) compilado com -DSQLITE_ENABLE_SESSION |
| Autenticação | o host aplica um changeset não confiável |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1:18900. Testemunho de escrita ASan de tamanho 12. |
Aplicar um changeset não confiável cujo segundo bloco de tabela reutiliza um nome de tabela com um nCol maior. Escrita OOB no heap. Extra de compilação. Não é uma amalgamação padrão a menos que SESSION esteja ativado.
O primeiro bloco aloca aUpdateMask a partir de pIter->nCol. O bloco posterior com o mesmo nome ignora o reset de sessionTableInfo e faz memset de uma máscara maior sobre a alocação antiga. Lab: nCol=2 e depois nCol=64 UPDATE. Escrita ASan de tamanho 12 em sessionUpdateFind. Controle: aplicação de um único UPDATE de 2 colunas com apply-rc=0.
Não trate este pacote como um gadget write-what-where. A escrita ASan de tamanho 12 é o oráculo.
Vinte buscas no código-fonte do SQLite 3.53.4 após a onda de FTS5 / session-NPD do 3.53.2. O CVE-2026-50812 está fechado (sessionBindRow trata um valor ausente como SQLITE_CORRUPT). O Session ainda indexa SessionApplyCtx apenas pelo nome da tabela. Um segundo bloco com o mesmo nome e uma contagem de colunas declarada maior reutiliza aUpdateMask.
Caminhos errados já registrados: tratar a amalgamação padrão como dentro do escopo (SESSION está desativado); reenviar o CVE-2026-50812; enviar um único bloco de tabela com nCol=64 contra um esquema de 2 colunas (schemaMismatch, sem escrita); alegar RCE a partir de um memset de 12 bytes.
cd lab
./run.sh
Amalgamação ASan do zip oficial sqlite-src-3530400. Extra de compilação -DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK. Health em 127.0.0.1:18900. Vincule-o ao loopback.
SUCCESS sqlite-session-ncol how=asan-heap-write-sessionUpdateFind write-size=12 control-apply-rc=0 SQLITE-SESSION-NCOL-WITNESS
Quando um bloco de tabela de changeset posterior reutiliza um nome, reconstrua SessionApplyCtx da forma como um novo nome já faz: libere aUpdateMask, execute novamente sessionTableInfo, recuse um nCol maior que o esquema ativo. Trunk 3f57024aec / branch-3.53 a1dd7123d8 (2026-08-17) é posterior a este GA.
b09c88c14082339b66c7b7158d609a771e64ca69)sessionChangesetApply :5619, sessionUpdateFind :4381-4412