Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate and submit a query
-
DeliveryCall denied function via method syntax (e.g. $f.put())
-
ExploitMethodPart::evaluate skips capability check
-
ExecutionDenied function executes, bypassing --deny-funcs
-
ImpactRead and write file bucket data
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Access control enforcement
MITRE ATT&CK
1 technique across 1 tactic: Defense Evasion The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires (1) an authenticated subject able to submit queries via RPC/HTTP/WS, DEFINE FUNCTION bodies, or custom APIs (PR:L); and (2) a deployment that has actually configured --deny-funcs or the SURREAL_DENY_FUNCS environment variable as hardening - deployments with no deny rules are explicitly unaffected. On the default 3.x streaming engine all denied families are bypassable via method-style syntax; the specific file bucket read/write chain additionally requires the experimental Files feature enabled (3.3.x only). Limiting factors: authentication is mandatory, the deny-funcs configuration is non-default hardening that must already be in place for there to be any control to bypass, and the highest (file::*) impact depends on the experimental Files feature and the bucket's own PERMISSIONS (default FULL). |
| Impact | The input CVSS 4.0 vector (CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:L/VA:N, score 7.1) indicates a network-reachable, low-complexity attack that nonetheless requires authentication (PR:L) - consistent with the description stating 'authenticated users who can submit queries.' There is no CISA KEV entry and no EPSS score was supplied, so widespread or automated exploitation cannot be asserted; this is not confirmed actively exploited. Public PoC reproduction scripts (repro.sh ×4) and transcripts are attached to the GHSA advisory, so a public PoC reference exists; it is not formally labeled confirmed working exploit code but demonstrates the bypass across 10 deny families including a file::* write+read round-trip. The vuln.today decision label is 'this_week' (not act_now/emergency). The most important real-world qualifier is that risk is entirely conditional: only deployments that have configured --deny-funcs (or SURREAL_DENY_FUNCS) as hardening are affected - out-of-the-box deployments with no deny rules are explicitly not affected - so the high VC:H impact only materializes where operators relied on function denial as a security control. For those deployments the control is fully voided on the default streaming engine and partially voided on the legacy path, which is a genuine priority to patch this week rather than a paper-only high score; for deployments not using deny-funcs this is effectively non-applicable. |
| Exploit ScenarioDerived | On a SurrealDB 3.x deployment hardened with --deny-funcs file::* (experimental Files feature enabled), an authenticated user submits a query using method syntax such as $f.put() then $f.get() instead of the normal function form. Because MethodPart::evaluate resolves and invokes the function without a capability check, the denied function executes, letting the user write and then read back file bucket data despite the file::* denial. Public reproduction scripts and transcripts demonstrating this (and 9 other deny families) are attached to the GHSA advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Nov 03, 2026
SurrealDB 2.0.0 through 3.3.0 does not enforce the --deny-funcs function-level security control on method-style function invocations, so an authenticated user who can submit queries can execute function families the operator explicitly denied - for example [1,2].map(...) instead of array::map(...), or $f.put()/$f.get() against a file bucket despite a file::* denial. The gap only exists on deployments that actually configure deny rules (--deny-funcs or SURREAL_DENY_FUNCS); the default 3.x streaming engine performs no capability check at all on this path, while the legacy compute-only path blocks some families and still lets others (math::abs, value::chain, array::any, array::sort::asc, type::string) through. Impact is highest when the experimental Files feature is enabled (3.3.x only) and bucket PERMISSIONS are permissive, allowing file bucket reads and writes under a deny file::* policy. There is no CISA KEV entry and no EPSS score was supplied, so active exploitation cannot be asserted; public reproduction scripts and transcripts are attached to the GHSA advisory.
RemediationAI
Upgrade to SurrealDB 3.3.1, the version in which the package is listed as fixed (rust/surrealdb < 3.3.1 vulnerable, fixed in 3.3.1); the vendor advisory at https://github.com/surrealdb/surrealdb/security/advisories/GHSA-p296-7pr4-87rr documents the fix approach of calling check_allowed_function on the fully resolved function name in MethodPart::evaluate and at the planner resolution point. Because the defect voids --deny-funcs rather than exposing a default configuration, the practical interim controls are: treat deny-funcs as non-enforcing until patched and restrict query submission to trusted subjects (any principal that can submit a query via RPC/HTTP/WS, DEFINE FUNCTION bodies or custom APIs can reach the bypass, so tightening who holds query privileges removes the prerequisite, at the cost of narrowing application access); on 3.3.x, disable the experimental Files feature and/or tighten file bucket PERMISSIONS, which default to FULL and are what ultimately bound the .get()/.put() reachability (side effect: dependent file functionality stops working); and do not treat --planner-strategy compute-only as a full workaround, since it only blocks the array::map, record::exists, string::len and file::get method forms while math::abs, value::chain, array::any, array::sort::asc and type::string still bypass under deny rules. No other vendor-released patch beyond 3.3.1 is identified in the available data.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
SurrealDB is a Rust-implemented multi-model database whose --deny-funcs CLI flag (also exposed as the SURREAL_DENY_FUNCS environment variable) is the documented function-level security control: once an operator denies a function family, no subject may execute it. The control is implemented as scattered checks at several call sites rather than a central dispatcher - legacy compute (expr/function.rs), streaming normal-form calls (exec/physical_expr/function/builtin.rs) and the legacy method path (fnc/mod.rs) - while the streaming engine's method path resolves the descriptor in MethodPart::evaluate (exec/parts/method.rs) and at planning time in exec/planner/idiom.rs, then calls func.invoke/invoke_async without invoking check_allowed_function. The root cause is an improper access control gap (CWE-284), with a secondary not-failing-securely aspect (CWE-636) in the legacy canonicalization layer: it converts values with kind_of() into names like 'int'/'float'/'decimal' and 'geometry<point>' while the deny mapping table is keyed on 'number' and 'geometry', so those branches never match, and method aliases such as every/some/includes/index_of/sort_asc and cross-family mappings like chain/expect/diff/patch/to_*/is_* are compared against names that are not the registered function names. In practice the deny list is matched against the canonical/normal-form function name in one invocation style but not the other, so the same capability is reachable through syntax the check never sees. The flaw has existed since method syntax and deny-funcs coexisted in 2.0.0; the newer streaming engine (default in 3.x) simply never implemented the check that the older engine partially gained.
Know when Surrealdb gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N
Authenticated query submitter gives PR:L; method-syntax call is low complexity (AC:L); C:H from reading file bucket data and I:L from writes, no availability impact.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
2DescriptionCVE.org
SurrealDB 2.0.0 before 3.3.1 does not enforce --deny-funcs restrictions on method-style function calls in the streaming engine, because MethodPart::evaluate invokes resolved functions without a capability check. Authenticated users who can submit queries can run denied functions via method syntax, e.g. [1,2].map() or $f.put()/$f.get() to write and read file bucket data despite file::* denials.
Technical POC Analysis
CVE-2026-121416 (GHSA-p296-7pr4-87rr; the advisory still says "No known CVE" at publication) is CWE-284 Improper Access Control, with CWE-636 failing open as a secondary classification.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
A high-severity vulnerability in SurrealDB versions 2.0.0 through 3.3.0 allows authenticated users to bypass function-level deny rules, potentially enabling unauthorized execution of restricted function families and, if the experimental Files feature is enabled with permissive bucket permissions, unauthorized file reads and writes. This undermines the product's security controls and could lead to data exposure or integrity compromise, particularly in environments where strict function restrictions are mandated. Leadership should prioritize remediation because the flaw affects a core security mechanism and may violate compliance requirements, though no active exploitation has been confirmed.
No vendor-released patch identified at time of analysis. Interim mitigations: disable the experimental Files feature if not required; enforce strict bucket permissions; restrict authenticated users who can submit queries to only trusted individuals; monitor query logs for unauthorized method-style function calls; consider using the legacy compute-only path if it provides additional restrictions for critical function families.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
Privilege escalation via second-order SurrealQL injection in SurrealDB before 2.0.5, 2.1.5, and 2.2.2 lets an authentica
Privilege escalation in SurrealDB before v3.1.0 lets unauthenticated attackers hijack the privileges of concurrently-act
Use-after-free in SurrealDB Core before 3.3.0 can crash or corrupt memory in Rust applications that embed the database a
Denial of service in SurrealDB before 3.1.0 lets an unauthenticated remote attacker crash the database with a single Web
Denial of service in SurrealDB before 3.1.0 lets an unauthenticated remote attacker crash the entire database process wi
Session hijacking in SurrealDB before 3.1.0 lets unauthenticated attackers enumerate attached session UUIDs through the
SurrealDB versions before 3.3.0 fail to validate a caller's authorization level when the SurrealQL USE statement switche
Cross-tenant data access in SurrealDB before 3.3.0 allows an authenticated namespace- or database-level SYSTEM user to b
Cross-tenant authorization bypass in SurrealDB before 3.2.0 lets any authenticated user reach custom API endpoints belon
Cross-user MCP session takeover in SurrealDB 3.1.0 through 3.2.x allows an authenticated holder of even a lowest-role JW
Arbitrary file read in SurrealDB before 3.1.5 lets an authenticated database user holding the EDITOR or OWNER role discl
Confused-deputy privilege escalation in SurrealDB before 2.5.0 and before 3.0.0-beta.3 lets a low-privileged user (e.g.
EUVD-2026-115948
GHSA-347j-rmf7-f74x
NVD
CVE.org
Exploit-DB