Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate to GraphQL API with valid JWT
-
ExploitIssue query/mutation on records guarded by a 'none' @authorization filter
-
ExecutionInverted Cypher translation returns denied records instead of excluding them
-
ImpactRead, create, or delete sensitive data the typedefs intended to block
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization logic validation
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation 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 user - the CVSS vector specifies PR:L, so the attacker must hold a valid JWT accepted by the API; and (2) the target application must define an @authorization filter that uses the 'none' quantifier on a relationship or connection field (e.g. @authorization(filter: [{ where: { node: { creator: { none: { id: { eq: "$jwt.sub" } } } } } }])). Applications that never use the 'none' quantifier in authorization filters are NOT exploitable. No user interaction is needed and the attack works against default library behavior in affected versions (7.0.0 through 7.6.3). The key limiting factor is this configuration dependency on the 'none' quantifier, which narrows real-world exposure despite the network, low-complexity profile. |
| Impact | This is a genuine authorization-bypass priority rather than a merely inflated CVSS number. The vendor-supplied CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L/UI:N) describes a network-reachable, low-complexity flaw requiring only low privileges (any authenticated API user), and the dual VC:H/VI:H impact is consistent with the description - protected records can be both read and mutated (created/deleted). The root cause is unambiguous and confirmed by the patch diff: the 'none' quantifier was translated to Cypher without the required Cypher.not() negation, so it silently behaved like 'some', inverting every rule that used it. No EPSS score, CISA KEV listing, or public POC was provided in the input, so there is no public exploit identified at time of analysis and no evidence of active exploitation; the risk signal here comes from exploitation ease and logic certainty, not from observed attacks. One caveat to flag: exploitation is conditional on an application actually using the 'none' quantifier inside an @authorization filter on a relationship or connection - deployments that never use 'none' are not exploitable, so real-world blast radius depends on configuration and is narrower than the raw 8.6 suggests. |
| Exploit ScenarioDerived | An application uses @neo4j/graphql with an @authorization filter such as 'none of the related users matches $jwt.sub' to hide records from denied users. Because 'none' is inverted to 'some', an authenticated attacker simply issues a normal GraphQL query (or mutation) and receives exactly the records the rule was meant to deny - and can likewise create or delete them. No special tooling is needed and complexity is low; no public exploit code was provided in the input. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 12, 2026
Authorization bypass in @neo4j/graphql 7.0.0 through 7.6.3 lets an authenticated user read, create, and delete records that @authorization filter rules were written to deny, because the library translates the 'none' quantifier on relationship and connection filters into Cypher without the required negation so the predicate is evaluated as though it were 'some'. The flaw only manifests in applications whose typedefs actually use the 'none' quantifier inside an @authorization filter on a relationship or connection field (for example creator: { none: { id: { eq: "$jwt.sub" } } }), so applications that never use that construct are not affected; the CVSS vector specifies PR:L, meaning the attacker must hold a valid JWT accepted by the API. No confirmed active exploitation (not in CISA KEV) and no public exploit code identified at time of analysis; a vendor patch and the upstream fix commit are available.
RemediationAI
Upgrade @neo4j/graphql to 7.6.4 or later (vendor-released patch: 7.6.4), which wraps the generated EXISTS predicate in Cypher.not() for the NONE operator in both AuthRelationshipFilter and AuthConnectionFilter; the release is available via npm at https://www.npmjs.com/package/@neo4j/graphql and the exact fix commit is https://github.com/neo4j/graphql/commit/17650cc370445a6bb9d394d34063d3623e987aa2, with details in the advisory https://github.com/neo4j/graphql/security/advisories/GHSA-h873-p2wr-fjx6. If an immediate upgrade is not possible, the effective compensating control is to eliminate the vulnerable construct from typedefs: rewrite any @authorization filter that uses the 'none' quantifier on a relationship or connection as an explicitly positive allowlist predicate (for example matching the permitted subject rather than excluding a denied one), or push the check into a custom Cypher directive / middleware where the negation can be expressed directly - the trade-off being added translation work and the risk of re-introducing the same logic error if the rewrite is not carefully reviewed and tested against both read and mutation operations. Because the same defect permits unauthorized creates and deletes, teams should also treat data written while an affected version was deployed as untrusted and audit recently created or deleted nodes for records that violate the intended authorization rules before assuming the post-upgrade state is clean; disabling the authorization feature entirely is not a viable workaround since it removes all enforcement rather than fixing the inverted equality, and restricting the JWT issuer/audience or API reachability only narrows the attacker population without closing the bypass.
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
@neo4j/graphql is the JavaScript/TypeScript library that compiles GraphQL type definitions into Cypher statements executed against a Neo4j database; its @authorization directive is the application-level access-control layer that injects filter predicates into generated queries based on claims such as $jwt.sub. The query-AST translation classes AuthConnectionFilter and AuthRelationshipFilter, which build predicates for relationship and connection fields, emitted a bare Cypher EXISTS(...) clause for the 'none' quantifier instead of wrapping it in Cypher.not(), so the semantics were inverted: 'none of the related nodes match the JWT subject' was evaluated as 'at least one related node matches', returning exactly the records the rule was meant to exclude. Because the same translation path is used for write operations, the inversion also affects mutations, allowing unauthorized creation and deletion rather than only disclosure. This is a CWE-863 (Incorrect Authorization) defect in an authorization-enforcement mechanism, and the affected CPE (cpe:2.3:a:neo4j:@neo4j/graphql:*:*:*:*:*:*:*:*) confirms the exposure is limited to the npm client library - the Neo4j DBMS itself is not implicated - with the fix landing in 7.6.4 per the commit diff and the .changeset note 'Fix "none" quantifier being inverted in authorization relationship and connection filters'.
Know when Neo4j 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:H/VA:N/SC:N/SI:N/SA:N
Network GraphQL API with low-privilege authenticated access (PR:L) and no user interaction; inverted filter exposes and allows modification of protected records (C:H/I:H), with no direct availability impact.
Primary rating from Vendor (Neo4j).
CVSS VectorVendor: Neo4j
DescriptionCVE.org
In @neo4j/graphql versions from 7.0.0 up to but not including 7.6.4, the none quantifier in @authorization filters on relationships and connections is not negated when translated to Cypher, so it behaves like some. A rule such as "none of the related denied users matches the JWT subject" therefore returns exactly the records it was meant to exclude, and excludes those it was meant to return. An authenticated user whom such a rule is meant to deny can read the protected records. This is also the case for mutations, so the impact is that sensitive data could also be created and deleted by users that shouldn't have access according to the typedefs. Fixed in 7.6.4.
Technical POC Analysis
CWE-863 (Incorrect Authorization): a boolean-polarity defect in the GraphQL-to-Cypher translation of authorization filter predicates, not a missing check.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
@neo4j/graphql versions 7.0.0 through 7.6.3 contain an authorization bypass that allows any holder of a valid JWT to read, create, and delete records that application-level @authorization rules were explicitly written to deny, undermining the access-control guarantees customers and auditors rely on. Only GraphQL APIs whose type definitions use the 'none' quantifier on relationship or connection filters are exposed, so leadership should treat this as a targeted but potentially serious integrity and confidentiality risk for affected services. Given the authenticated attack path and the possibility of unauthorized data modification, owners of affected Neo4j-backed APIs should prioritize remediation and assess whether any data was altered.
Apply vendor patch.
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.
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
neo4j-contrib neo4j-apoc-procedures version before commit 45bc09c contains a XML External Entity (XXE) vulnerability in
Neo4j through 3.4.18 (with the shell server enabled) exposes an RMI service that arbitrarily deserializes Java objects,
Due to incorrect access control in Neo4j Enterprise Database Server 3.4.x before 3.4.9, the setting of LDAP for authenti
APOC (Awesome Procedures on Cypher) is an add-on library for Neo4j. Rated high severity (CVSS 8.1), this vulnerability i
Neo4j APOC (Awesome Procedures on Cypher) before 4.3.0.7 and 4.x before 4.4.0.8 allows Directory Traversal to sibling di
Schema-level and Query/Mutation type-level @authentication directives are silently ignored for top-level @cypher fields
A failure in resetting the security context in some transaction actions in Neo4j Graph Database 4.2 and 4.3 could allow
JWT authentication bypass in @neo4j/graphql allows unauthenticated remote clients to forge arbitrary JWT claims over Gra
Authentication bypass in @neo4j/graphql exposes admin-restricted custom-resolver fields to any authenticated user holdin
Multiple cross-site request forgery (CSRF) vulnerabilities in Neo4J 1.9.2 allow remote attackers to hijack the authentic
The Cypher component in Neo4j 5.0.0 through 5.18 mishandles IMMUTABLE privileges in some situations where an attacker al
Bolt protocol handshake decoder in Neo4j Enterprise and Community Editions fails to distinguish overlong capability mask
EUVD-2026-97486
NVD
CVE.org
EPSS
GitHub
Exploit-DB