Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:L/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-reachable API with any authenticated user (PR:L, AC:L, UI:N); impact is integrity to the shared schema (I:H) with minor availability loss (A:L) and no confidentiality exposure.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
3DescriptionCVE.org
BloodHound through 9.4.0, fixed in commit 8f79035, contains a missing authorization vulnerability in the custom-nodes API endpoints that allows any authenticated user to modify the global graph schema. Attackers with valid session tokens can create, update, or delete custom node types affecting all users and tenants by invoking unprotected POST, PUT, and DELETE operations on the custom-nodes endpoints.
AnalysisAI
Improper authorization in SpecterOps BloodHound through 9.4.0 lets any authenticated user tamper with the global custom-node graph schema by calling POST, PUT, and DELETE operations on the /api/v2/custom-nodes endpoints, which enforced only that a caller was logged in rather than that they held write permissions. Because custom node kinds are a shared, tenant-wide schema construct, a single low-privileged account can create, alter, or delete node types that affect every user and tenant on the instance. Publicly available exploit code exists and a vendor patch (commit 8f79035) is available; there is no CISA KEV listing, so exploitation is not confirmed as active.
Technical ContextAI
BloodHound is an Active Directory / Entra ID attack-path analysis platform (SpecterOps) whose backend API is written in Go. The custom-nodes API manages 'custom node kinds' - user-defined node types that extend the graph schema used across the whole deployment (OpenGraph). The root cause is CWE-862 (Missing Authorization): per the PR diff in cmd/api/src/api/registration/v2.go, the mutating routes were registered with .RequireAuth() (any valid session) instead of a permission gate. The fix rebinds reads to permissions.OpenGraphRead and the POST/PUT/DELETE mutations to permissions.OpenGraphWrite, so the flaw is an authorization-check gap where authentication was conflated with authorization, not a code-execution or injection bug.
RemediationAI
Upgrade to a BloodHound release that includes the fix commit 8f790351349fd87bcb04377aba84cba6495825b3 (merged via PR #2989), which changes the custom-nodes routes from RequireAuth() to permission-gated RequirePermissions(OpenGraphRead) for reads and RequirePermissions(OpenGraphWrite) for the POST/PUT/DELETE mutations; a released patched version number is not stated in the input, so confirm the exact tagged release against the SpecterOps advisory before deploying. If you cannot patch immediately, restrict which accounts can reach the API and minimize the number of low-privileged users, place the BloodHound API behind network controls or a reverse proxy that blocks POST/PUT/DELETE to /api/v2/custom-nodes for non-administrative principals (trade-off: this also blocks legitimate custom-node management), and monitor for unexpected creation/modification/deletion of custom node kinds. Full remediation details are in the VulnCheck advisory (https://www.vulncheck.com/advisories/bloodhound-missing-authorization-on-custom-node-management-api) and PR https://github.com/SpecterOps/BloodHound/pull/2989.
More in Bloodhound
View allcomponents/Modals/HelpTexts/GenericAll/GenericAll.jsx in Bloodhound <= 4.0.1 allows remote attackers to execute arbitrar
components/Modals/HelpModal.jsx in BloodHound 2.2.0 allows remote attackers to execute arbitrary OS commands (by spawnin
Improper authorization in SpecterOps BloodHound through version 9.5.1 allows authenticated users holding only GraphDBRea
Same weakness CWE-862 – Missing Authorization
View allSame technique Authentication Bypass
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-44754
GHSA-7qmq-x64g-8v7j