Basekick-Labs Arc CVE-2026-47735
HIGHSeverity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Network vector with low privilege (any valid token); no integrity or availability impact; confidentiality is high due to full credential exfiltration.
Primary rating from Vendor (https://github.com/Basekick-Labs/arc).
CVSS VectorVendor: https://github.com/Basekick-Labs/arc
Lifecycle Timeline
5DescriptionCVE.org
Summary
Arc's user-SQL validator (internal/api/query.go:ValidateSQLRequest) blocked only read_parquet( and arc_partition_agg( via regex denylist. The broader DuckDB I/O function family - read_csv_auto, read_csv, read_json, read_json_auto, read_text, read_blob, glob, parquet_metadata, parquet_schema, read_xlsx, etc. - was not blocked. RBAC table-reference extraction inspected only FROM/JOIN clauses, so scalar table functions in the SELECT list slipped past both layers.
Impact
Any authenticated user, including a token with permissions: [], can read arbitrary local files via:
POST /api/v1/query
Authorization: Bearer <token>
{"sql": "SELECT * FROM read_csv_auto('/etc/passwd', header=false, columns={'l':'VARCHAR'}) LIMIT 5"}Confirmed reachable targets:
auth.db- bcrypt hashes for every API token, plus legacy SHA-256 rows.arc.toml- S3 secrets, TLS keys./proc/self/environ- environment-variable secrets.- Cross-tenant Parquet files - bypasses RBAC because the tenant scope is enforced at the table layer, not on raw file paths.
- SSRF when
httpfsis loaded (any S3-backed deployment) -read_csv_auto('http://169.254.169.254/latest/meta-data/...')reaches instance metadata IPs.
Patches
Fixed in 2026.06.1 (PR #442) via a structural sandbox at the DuckDB layer:
SET GLOBAL allowed_directories = [...]enumerates Arc's legitimate filesystem prefixes (storage roots + tier prefixes + import upload dir + compaction temp).SET GLOBAL enable_external_access = false(one-way at runtime).- Verified by reading back the flag.
After lockdown, DuckDB refuses to open any file outside the allowlist and refuses further INSTALL/LOAD. Already-loaded extensions remain callable.
Workarounds
- Restrict API access to known-trusted networks via firewall rules.
- Temporary mitigation: add
read_csv*/read_json*/globetc. todangerousSQLPatternininternal/api/query.gopending 2026.06.1.
Credits
Reported by Alex Manson (@NeuroWinter, https://neurowinter.com/) on 2026-05-19.
AnalysisAI
Authenticated arbitrary file read in Basekick-Labs Arc allows any API token holder, regardless of permission scope, to exfiltrate arbitrary server-side files by injecting DuckDB I/O table functions into the SQL query endpoint. The SQL denylist in internal/api/query.go blocked only two specific functions while leaving the broader DuckDB I/O family - read_csv_auto, read_json, read_text, read_blob, glob, parquet_metadata, and others - completely unblocked; RBAC enforcement scanned only FROM/JOIN clauses, so a scalar function in the SELECT list bypassed both layers entirely. Confirmed exfiltration targets include auth.db (all bcrypt and legacy SHA-256 token hashes), arc.toml (S3 credentials and TLS private keys), /proc/self/environ, cross-tenant Parquet files, and - in S3-backed deployments with httpfs loaded - cloud instance metadata endpoints via SSRF. No public exploit identified at time of analysis in CISA KEV, though detailed proof-of-concept code is included in the public GitHub advisory.
Technical ContextAI
Arc is a Go-based analytical data platform (pkg:go/github.com/basekick-labs/arc) that embeds DuckDB as its query engine and exposes a SQL execution endpoint at POST /api/v1/query. DuckDB provides a rich set of I/O table functions - read_csv_auto, read_csv, read_json, read_json_auto, read_text, read_blob, glob, parquet_metadata, parquet_schema, read_xlsx - capable of opening arbitrary local filesystem paths and remote URLs when the httpfs extension is loaded. The root cause is CWE-22 (Path Traversal) expressed in two compounding weaknesses: first, an incomplete regex denylist in ValidateSQLRequest (internal/api/query.go) that enumerated only read_parquet( and arc_partition_agg( rather than the full I/O function surface; second, an RBAC extraction pass that parsed only FROM/JOIN clauses, so DuckDB table functions placed in the SELECT list were invisible to table-level permission checks. Together, these allowed any syntactically valid bearer token - including a token whose permissions array was empty - to open and return the contents of any file accessible to the Arc process, as well as any HTTP URL reachable from the server when httpfs was active.
RemediationAI
Upgrade to Arc release 2026.06.1 (commit 91bdc29d1a02178ccf8c66375eccf85203108dfb, tagged v26.06.1 at https://github.com/Basekick-Labs/arc/releases/tag/v26.06.1). This release replaces the incomplete denylist with a structural DuckDB sandbox: SET GLOBAL allowed_directories enumerates only Arc's legitimate filesystem prefixes (storage roots, tier prefixes, upload directory, compaction temp), and SET GLOBAL enable_external_access = false is applied one-way at startup, preventing re-enablement at runtime. After the upgrade, operators should verify the startup log line 'DuckDB external access locked down (sandbox active)' appears, and note that storage paths in arc.toml (storage.local_path, database.temp_directory, compaction.temp_directory) must resolve to absolute paths - the defaults continue to work but are resolved against the process working directory at startup. The multipart-upload directory has moved from os.TempDir() to ${database.temp_directory}/arc-uploads; monitoring that scrapes /tmp should be updated. If immediate upgrade is not possible, two compensating controls are available from the advisory: (1) extend the dangerousSQLPattern denylist in internal/api/query.go to include read_csv*, read_json*, glob, read_text, read_blob, parquet_metadata, parquet_schema, and read_xlsx - note this is a fragile approach and may not cover future DuckDB I/O additions; (2) restrict network access to the Arc query API endpoint to known-trusted IP ranges via firewall or reverse-proxy ACL, reducing the pool of callers who can reach /api/v1/query. The firewall mitigation does not eliminate the risk for multi-tenant deployments where diverse authenticated users share the same Arc instance.
Same weakness CWE-22 – Path Traversal
View allSame technique Path Traversal
View allVendor StatusVendor
SUSE
| Product | Status |
|---|---|
| SUSE Linux Enterprise Server 16.1 | Affected |
| SUSE Linux Enterprise Server for SAP applications 16.1 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP5 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP6 | Affected |
| openSUSE Leap 15.5 | Affected |
| openSUSE Leap 15.6 | Affected |
Share
External POC / Exploit Code
Leaving vuln.today
GHSA-p2j4-c4g6-rpf5