
SQLite 3.53.4 – Hoch – Lokal – Verbleibendes Privileg – INSERT SELECT xfer überspringt Quell-READ
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · sqlite-xfer-auth
Write-up: https://abraxaslabs.tech/research/sqlite-xfer-auth
Klasse: Privilegien-Rest Reichweite: Lokal
SQLite 3.53.4 (b09c88c, SOURCE_ID 2026-07-24 19:02:57 bf7c7f30031888f4e796e429ab3978879485813aaca6f641c7b33e4e09459bcc) nimmt für INSERT INTO dest SELECT * FROM src weiterhin den xferOptimization-Fast-Path. sqlite3AuthCheck ist SQLITE_INSERT nur auf dest. Die Kopie ruft niemals sqlite3Select oder das spaltenweise sqlite3AuthRead auf src auf. SELECT * FROM src wird verweigert. Das INSERT SELECT kopiert den Zeugen. Das Authorizer-Log ist INSERT:dest.
Der Authorizer ist deaktiviert, sofern der Embedder keinen installiert. Kein RCE. DRH behandelte Fossil d1cdb817 als 3.54-Feature, nicht als 3.53-Bugfix. 3.54.0 ist noch ein Entwurf.
| ID | noch keine CVE |
| Klasse | Privilegien-Rest (READ-verweigerte Tabellenkopie) |
| Reichweite | Lokal (Embedder sqlite3_set_authorizer) |
| CWE | CWE-863 |
| CVSS | Hoch: 7.5 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Produkt | SQLite (Hwaci) |
| Betroffen | 3.53.4 (b09c88c14082339b66c7b7158d609a771e64ca69) |
| Auth | lokales SQL gegen einen installierten Authorizer, der READ/SELECT auf src verweigert und INSERT auf dest erlaubt |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18850 |
INSERT INTO dest SELECT * FROM src vorbereiten, wenn dest schema-kompatibel ist und INSERT erlaubt ist. Rohe B-Tree-Datensätze verlassen eine READ-verweigerte Quelltabelle und landen in dest. Ein bloßes SELECT * FROM src ergibt SQLITE_AUTH. Der xfer-Pfad kompiliert das SELECT nicht, daher werden Quell-SQLITE_SELECT, tabellenweites SQLITE_READ und spaltenweises sqlite3AuthRead nie ausgelöst.
Erfordert einen Embedder, der sqlite3_set_authorizer als Gate für nicht vertrauenswürdiges SQL / Spalten-ACLs installiert hat. In der Standardbibliothek ist dieser Callback NULL. Kein RCE.
Dieselbe Crit/High-Jagd auf 3.53.4 wie bei den anderen Resten auf dieser GA. Der Authorizer ist unter sqlite3_set_authorizer dokumentiert. INSERT-Auth gilt nur für die dest-Tabelle (insert.c:969). xfer wird vor sqlite3Select() genommen (insert.c:1020-1038). xferOptimization kopiert Datensätze. Grep von insert.c auf diesem Pin: ein sqlite3AuthCheck, kein sqlite3AuthRead. SQLITE_OMIT_XFER_OPT ist kein Standard-Build-Flag.
Forum 2026-05-21T03:31:22Z. Trunk d1cdb817cafd03a4 ist nur für 3.54. DRH: neues Feature, kommt nicht auf branch-3.53.
cd lab
./run.sh
Erstellt die Amalgamation 3.53.4 plus lab/xfer_auth.c. Setzt sqlite-xfer-auth zusammen. Bindet 127.0.0.1:18850. Das Oracle ist JSON vom prozessinternen Authorizer: SELECT * FROM src verweigert; INSERT INTO dest SELECT * FROM src ok; dest hat SQLITE-XFER-AUTH-WITNESS; Insert-Aktionen sind nur 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
Autorisiere die Quelle so, wie es 3.54 d1cdb817 tut: Wenn ein Authorizer registriert ist, muss xferOptimization einen sqlite3AuthCheck für SELECT/READ auf src durchführen (oder den schnellen Pfad verweigern und auf sqlite3Select zurückfallen). Bis dahin müssen Embedder, die READ auf einer Tabelle verweigern (DENY), auch INSERT in jedes kompatible Ziel verweigern (DENY) oder mit -DSQLITE_OMIT_XFER_OPT kompilieren.
b09c88c14082339b66c7b7158d609a771e64ca69)src/insert.c sqlite3AuthCheck INSERT dest, xferOptimization vor sqlite3Select