
SQLite 3.53.4 - Alta - Local - Privilegio residual - INSERT SELECT xfer omite la lectura de origen
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-xfer-auth
Análisis: https://abraxaslabs.tech/research/sqlite-xfer-auth
Clase: Privilegio residual Alcance: Local
SQLite 3.53.4 (b09c88c, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) todavía toma la ruta rápida xferOptimization para INSERT INTO dest SELECT * FROM src. sqlite3AuthCheck es SQLITE_INSERT solo sobre dest. La copia nunca llama a sqlite3Select ni a sqlite3AuthRead por columna sobre src. SELECT * FROM src es denegado. El INSERT SELECT copia el testigo. El registro del autorizador es INSERT:dest.
El autorizador está desactivado a menos que el embedder instale uno. No es RCE. DRH trató Fossil d1cdb817 como una funcionalidad de 3.54, no como un bugfix de 3.53. 3.54.0 sigue en borrador.
| ID | aún sin CVE |
| Clase | Privilegio residual (copia de tabla con READ denegado) |
| 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 |
| Producto | SQLite (Hwaci) |
| Afectado | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) |
| Auth | SQL local contra un autorizador instalado que DENIEGA READ/SELECT sobre src y permite INSERT sobre dest |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18850 |
Preparar INSERT INTO dest SELECT * FROM src cuando dest es compatible a nivel de esquema y se permite INSERT. Los registros B-tree en bruto salen de una tabla origen con READ denegado y aterrizan en dest. Un SELECT * FROM src simple devuelve SQLITE_AUTH. La ruta xfer no compila el SELECT, por lo que SQLITE_SELECT sobre el origen, SQLITE_READ a nivel de tabla y sqlite3AuthRead por columna nunca se disparan.
Requiere un embedder que haya instalado sqlite3_set_authorizer como puerta de control de acceso para SQL no confiable / ACL por columna. La biblioteca por defecto tiene ese callback en NULL. No es RCE.
La misma caza de Crit/Alto sobre 3.53.4 que los otros residuales de esta GA. El autorizador está documentado en sqlite3_set_authorizer. La autorización de INSERT es solo sobre la tabla dest (insert.c:969). xfer se toma antes de sqlite3Select() (insert.c:1020-1038). xferOptimization copia registros. Grep de insert.c en este pin: un sqlite3AuthCheck, ningún sqlite3AuthRead. SQLITE_OMIT_XFER_OPT no es un flag de compilación por defecto.
Foro 2026-05-21T03:31:22Z. Trunk d1cdb817cafd03a4 es solo para 3.54. DRH: nueva funcionalidad, no irá a branch-3.53.
cd lab
./run.sh
Compila la amalgama 3.53.4 más lab/xfer_auth.c. Compone sqlite-xfer-auth. Enlaza 127.0.0.1:18850. El oráculo es JSON del autorizador en proceso: SELECT * FROM src denegado; INSERT INTO dest SELECT * FROM src ok; dest tiene SQLITE-XFER-AUTH-WITNESS; las acciones de inserción son solo 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
Autoriza el origen tal como lo hace 3.54 d1cdb817: si hay un autorizador registrado, xferOptimization debe realizar sqlite3AuthCheck SELECT/READ sobre src (o rechazar la ruta rápida y pasar a sqlite3Select). Hasta entonces, los embedders que DENIEGAN READ sobre una tabla todavía tienen que DENEGAR INSERT en cualquier dest compatible, o compilar con -DSQLITE_OMIT_XFER_OPT.
b09c88c14082339b66c7b7158d609a771e64ca69)src/insert.c sqlite3AuthCheck INSERT dest, xferOptimization antes de sqlite3Select