
SQLite 3.53.4 - Alta - Local - Privilégio remanescente - INSERT SELECT xfer ignora leitura da origem
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-xfer-auth
Classe: Privilégio remanescente Alcance: Local
SQLite 3.53.4 (b09c88c, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) ainda usa o caminho rápido xferOptimization para INSERT INTO dest SELECT * FROM src. sqlite3AuthCheck é SQLITE_INSERT apenas em dest. A cópia nunca chama sqlite3Select nem sqlite3AuthRead por coluna em src. SELECT * FROM src é negado. O INSERT SELECT copia a testemunha. O log do autorizador é INSERT:dest.
O autorizador fica desligado a menos que o embedder instale um. Não é RCE. DRH tratou o Fossil d1cdb817 como recurso da 3.54, não como correção da 3.53. A 3.54.0 ainda é rascunho.
| ID | ainda sem CVE |
| Classe | Privilégio remanescente (cópia de tabela com READ negado) |
| Alcance | Local (embedder sqlite3_set_authorizer) |
| CWE | CWE-863 |
| CVSS | Alto: 7.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Produto | SQLite (Hwaci) |
| Afetado | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) |
| Auth | SQL local contra um autorizador instalado que NEGA READ/SELECT em src e permite INSERT em dest |
| Licença | GNU Affero GPL v3.0 |
| Lab | somente 127.0.0.1:18850 |
Preparar INSERT INTO dest SELECT * FROM src quando dest é compatível com o esquema e INSERT é permitido. Registros brutos de B-tree saem de uma tabela de origem com READ negado e chegam a dest. SELECT * FROM src puro é SQLITE_AUTH. O caminho xfer não compila o SELECT, então SQLITE_SELECT da origem, SQLITE_READ em nível de tabela e sqlite3AuthRead por coluna nunca disparam.
Requer um embedder que tenha instalado sqlite3_set_authorizer como o portão de ACL de SQL não confiável / coluna. A biblioteca padrão tem esse callback NULL. Não é RCE.
Mesma caçada Crit/High da 3.53.4 que os outros remanescentes nesta GA. O autorizador está documentado em sqlite3_set_authorizer. A auth de INSERT é apenas da tabela dest (insert.c:969). O xfer é tomado antes de sqlite3Select() (insert.c:1020-1038). xferOptimization copia registros. Grep de insert.c neste pin: um sqlite3AuthCheck, nenhum sqlite3AuthRead. SQLITE_OMIT_XFER_OPT não é uma flag de build padrão.
Fórum 2026-05-21T03:31:22Z. O trunk d1cdb817cafd03a4 é apenas da 3.54. DRH: novo recurso, não vai para a branch-3.53.
cd lab
./run.sh
Compila a amalgamation 3.53.4 mais lab/xfer_auth.c. Compose sqlite-xfer-auth. Bind 127.0.0.1:18850. O oráculo é JSON do autorizador em processo: SELECT * FROM src negado; INSERT INTO dest SELECT * FROM src ok; dest tem SQLITE-XFER-AUTH-WITNESS; as ações de insert são apenas INSERT:dest.
SUCCESS sqlite-xfer-auth how=xfer-opt-skip-src-read select-src=denied insert-select=ok dest-has-witness=yes SQLITE-XFER-AUTH-WITNESS
Autorizar a origem como a 3.54 d1cdb817 faz: se um autorizador estiver registrado, xferOptimization deve fazer sqlite3AuthCheck de SELECT/READ em src (ou recusar o caminho rápido e cair para sqlite3Select). Até então, embedders que NEGAM READ em uma tabela ainda precisam NEGAR INSERT em qualquer dest compatível, ou compilar com -DSQLITE_OMIT_XFER_OPT.
b09c88c14082339b66c7b7158d609a771e64ca69)src/insert.c sqlite3AuthCheck INSERT dest, xferOptimization antes de sqlite3Select