
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
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 está 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ó el Fossil d1cdb817 como una característica de 3.54, no como un bugfix de 3.53. 3.54.0 sigue siendo un 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 |
| Lab | solo 127.0.0.1:18850 |
Preparar INSERT INTO dest SELECT * FROM src cuando dest es compatible a nivel de esquema y INSERT está permitido. Los registros B-tree en bruto salen de una tabla origen con READ denegado y aterrizan en dest. Un SELECT * FROM src simple es 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 la puerta de ACL de SQL no confiable / columnas. La biblioteca por defecto tiene ese callback en NULL. No es RCE.
La misma caza de Crit/High sobre 3.53.4 que los otros residuales en esta GA. El autorizador está documentado en sqlite3_set_authorizer. La autenticació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 una bandera de compilación por defecto.
Foro 2026-05-21T03:31:22Z. El trunk d1cdb817cafd03a4 es solo para 3.54. DRH: nueva característica, no va a la rama 3.53.
cd lab
./run.sh
Compila la amalgama 3.53.4 más lab/xfer_auth.c. Compose sqlite-xfer-auth. Bind 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
Autorizar el origen de la forma en que lo hace d1cdb817 en 3.54: si hay un autorizador registrado, xferOptimization debe hacer sqlite3AuthCheck de SELECT/READ sobre src (o rechazar la ruta rápida y caer 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