The ATTACH/VACUUM-INTO blocklist that GHSA-q5mp-gfjf-cf2j (CVE-2026-96630) added at admin/sql.inc.php:147 anchors with ^$space*+ where $space matches only PCRE whitespace or SQL comments. A leading UTF-8 BOM (EF BB BF) is none of those, so the regex returns 0 (ALLOWED), while SQLite's sqlite3_prepare_v2 silently skips the BOM and executes the statement. This is an incomplete-fix bypass of the exact regex the fix introduced.
admin/sql.inc.php:147 (v5.8.0):
if (DIALECT == "sqlite" && preg_match("~^$space*+(ATTACH|VACUUM\\b.*\\bINTO)\\b~is", $q, $match) !== 0) {with $space = (?:\s|/\*[\s\S]*?\*/|(?:--)[^\n]*\n?|--\r?\n). PCRE \s does NOT match EF BB BF, and $space cannot consume it, so a BOM-prefixed VACUUM INTO/ATTACH fails the anchor → match=0 → statement is forwarded to Connection::get()->multiQuery($q) → SQLite3::query(). SQLite's tokenizer skips the leading BOM and executes the statement, writing the file.
Authenticated SQLite user writes an attacker-controlled SQLite database file (PHP polyglot in a table name) to a web-served path → PHP web shell → RCE. Identical impact and precondition to GHSA-q5mp-gfjf-cf2j (CVE-2026-96630).
query field begins with raw bytes EF BB BF then VACUUM INTO '/var/www/html/x.php', submitted with a valid token.
POST /admin/?sqlite=... with query = bytes EF BB BF + VACUUM INTO '/var/www/html/x.php' + valid token.verify_token() + Sec-Fetch-Site (auth.inc.php:391).admin/sql.inc.php:34 $query = $_POST["query"] — BOM preserved (no trim); statement splitter yields $q still starting with the BOM (first bytes ef bb bf 56 41 43).admin/sql.inc.php:147 preg_match("~^$space*+(ATTACH|VACUUM\\b.*\\bINTO)\\b~is", $q) → returns 0.BOM VACUUM match=0 ALLOWED, BOM ATTACH match=0 ALLOWED; plain forms match=1 BLOCKED. PCRE \s does not match EF BB BF.admin/sql.inc.php Connection::get()->multiQuery($q) → admin/drivers/sqlite.inc.php:34 @$this->sqlite->query($q) → sqlite3_prepare_v2 strips the BOM and executes.sqlite3 (libsqlite) executes BOM-prefixed VACUUM INTO — file written = True (reproduced via Python sqlite3.execute).Regex test (exact line-147 pattern):
plain VACUUM match=1 BLOCKED
BOM VACUUM match=0 ALLOWED <-- bypass
plain ATTACH match=1 BLOCKED
BOM ATTACH match=0 ALLOWED <-- bypassSQLite execution: '\ufeff' + "VACUUM INTO '<path>'" via sqlite3 → file_written=True.
Control: identical string WITHOUT the BOM is BLOCKED (match=1) — the BOM is the sole differentiator; the fix works for every non-BOM case. Both SQLite3 and PDO_SQLite drivers wrap the same C sqlite3_prepare_v2.
Verified: regex and export sink present on latest release v5.8.0 (line 147, unchanged).
>= 5.5.1, <= 5.8.0 (the BOM-vulnerable regex was introduced by the v5.5.1 fix).
$space anchor Unicode-aware (e.g. also consume \x{FEFF}), OR validate the normalized statement SQLite will actually execute rather than the raw bytes.Reported by zx (Jace) — GitHub: @manus-use
Fuente: NVD
Evaluación gratuita de vulnerabilidades
Evalúa tus prácticas de seguridad en la nube en 9 dominios de seguridad para evaluar tu nivel de riesgo e identificar brechas en tus defensas.
Obtén una demostración personalizada
"La mejor experiencia de usuario que he visto en mi vida, proporciona una visibilidad completa de las cargas de trabajo en la nube."
"Wiz proporciona un panel único para ver lo que ocurre en nuestros entornos en la nube."
"Sabemos que si Wiz identifica algo como crítico, en realidad lo es."