From 877530db1fe2756674cb2914403cb6706e0f5de7 Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Thu, 23 Apr 2026 20:07:23 +0000 Subject: [PATCH] sqlite: add permission model checks to DatabaseSync Add permission model enforcement to DatabaseSync::Open(). File-backed databases now check kFileSystemRead (readOnly) or kFileSystemWrite (read-write) before calling sqlite3_open_v2. In-memory databases (:memory:) are exempt. Refs: https://hackerone.com/reports/3686625 --- src/node_sqlite.cc | 13 +++ test/fixtures/permission/sqlite.db | Bin 0 -> 8192 bytes test/parallel/test-permission-sqlite.js | 146 ++++++++++++++++++++++++ 3 files changed, 159 insertions(+) create mode 100644 test/fixtures/permission/sqlite.db create mode 100644 test/parallel/test-permission-sqlite.js diff --git a/src/node_sqlite.cc b/src/node_sqlite.cc index 9c3aa6e0b4dc5f..e03ac41efc2954 100644 --- a/src/node_sqlite.cc +++ b/src/node_sqlite.cc @@ -912,6 +912,19 @@ bool DatabaseSync::Open() { return false; } + // Permission checks: skip for in-memory databases, enforce FS permissions + // for file-backed databases. + std::string_view db_path = open_config_.location(); + if (db_path != ":memory:" && !db_path.empty()) { + if (open_config_.get_read_only()) { + THROW_IF_INSUFFICIENT_PERMISSIONS( + env(), permission::PermissionScope::kFileSystemRead, db_path, false); + } else { + THROW_IF_INSUFFICIENT_PERMISSIONS( + env(), permission::PermissionScope::kFileSystemWrite, db_path, false); + } + } + // TODO(cjihrig): Support additional flags. int default_flags = SQLITE_OPEN_URI; int flags = open_config_.get_read_only() diff --git a/test/fixtures/permission/sqlite.db b/test/fixtures/permission/sqlite.db new file mode 100644 index 0000000000000000000000000000000000000000..2321b9eac82af67ad5f7624720168fcf24f09e13 GIT binary patch literal 8192 zcmeI#u?oU45C-5&6>*Wel&&`_h>I^^l_1qBS~J+OV#GqFpi%HKd>0?cr|4{}?sgUa zBbQ5#gTS|Cy$TYed7qt*vEc!=NeCJ;6Or}JqP#;Cd;NPZOL_kl7WMDXRxu^)2Neqe z0SG_<0uX=z1Rwwb2tWV=5P(2MfvIS?jw5a+-lp2