
SQLite 3.53.4 - Élevé - Local - Résidu de privilège - INSERT SELECT xfer ignore la lecture de la source
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-xfer-auth
Classe : Privilège résiduel Portée : Locale
SQLite 3.53.4 (b09c88c, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) emprunte toujours le chemin rapide xferOptimization pour INSERT INTO dest SELECT * FROM src. sqlite3AuthCheck est SQLITE_INSERT sur dest uniquement. La copie n'appelle jamais sqlite3Select ni sqlite3AuthRead par colonne sur src. SELECT * FROM src est refusé. L'INSERT SELECT copie le témoin. Le journal de l'authorizer est INSERT:dest.
L'authorizer est désactivé sauf si l'embedder en installe un. Pas de RCE. DRH a traité Fossil d1cdb817 comme une fonctionnalité de la 3.54, pas comme un correctif de la 3.53. La 3.54.0 est encore en draft.
| ID | pas encore de CVE |
| Classe | Privilège résiduel (copie de table refusée en READ) |
| Portée | Locale (embedder sqlite3_set_authorizer) |
| CWE | CWE-863 |
| CVSS | Élevé : 7.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Produit | SQLite (Hwaci) |
| Affecté | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) |
| Auth | SQL local contre un authorizer installé qui DENY READ/SELECT sur src et autorise INSERT sur dest |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18850 uniquement |
Préparer INSERT INTO dest SELECT * FROM src lorsque dest est compatible au niveau du schéma et que INSERT est autorisé. Les enregistrements B-tree bruts quittent une table source refusée en READ et atterrissent dans dest. Un simple SELECT * FROM src renvoie SQLITE_AUTH. Le chemin xfer ne compile pas le SELECT, donc le SQLITE_SELECT de la source, le SQLITE_READ au niveau table et le sqlite3AuthRead par colonne ne se déclenchent jamais.
Nécessite un embedder qui a installé sqlite3_set_authorizer comme barrière ACL pour le SQL non fiable / les colonnes. La bibliothèque par défaut a ce callback à NULL. Pas de RCE.
Même chasse Crit/High sur la 3.53.4 que les autres résidus de cette GA. L'authorizer est documenté à sqlite3_set_authorizer. L'auth INSERT ne concerne que la table dest (insert.c:969). Le xfer est emprunté avant sqlite3Select() (insert.c:1020-1038). xferOptimization copie les enregistrements. Grep de insert.c sur ce pin : un sqlite3AuthCheck, aucun sqlite3AuthRead. SQLITE_OMIT_XFER_OPT n'est pas un flag de build par défaut.
Forum 2026-05-21T03:31:22Z. Le trunk d1cdb817cafd03a4 est réservé à la 3.54. DRH : nouvelle fonctionnalité, ne sera pas rétroportée sur branch-3.53.
cd lab
./run.sh
Compile l'amalgamation 3.53.4 plus lab/xfer_auth.c. Compose sqlite-xfer-auth. Bind 127.0.0.1:18850. L'oracle est du JSON issu de l'authorizer in-process : SELECT * FROM src refusé ; INSERT INTO dest SELECT * FROM src ok ; dest contient SQLITE-XFER-AUTH-WITNESS ; les actions d'insertion sont INSERT:dest uniquement.
SUCCESS sqlite-xfer-auth how=xfer-opt-skip-src-read select-src=denied insert-select=ok dest-has-witness=yes SQLITE-XFER-AUTH-WITNESS
Autoriser la source comme le fait la 3.54 d1cdb817 : si un authorizer est enregistré, xferOptimization doit faire un sqlite3AuthCheck SELECT/READ sur src (ou refuser le chemin rapide et retomber sur sqlite3Select). En attendant, les embedders qui DENY READ sur une table doivent aussi DENY INSERT vers tout dest compatible, ou compiler avec -DSQLITE_OMIT_XFER_OPT.
b09c88c14082339b66c7b7158d609a771e64ca69)src/insert.c sqlite3AuthCheck INSERT dest, xferOptimization avant sqlite3Select