Vibe Security Radar
Back to Vulnerabilities

CVE-2026-31998

openclaw/openclaw
Mar 19, 2026CWE-863
TypeScript
Verified by gpt-5.4-high
Severity
HIGH8.3
Verdict
CONFIRMED
0.95 confidence
AI Tool
Claude CodeClaude Code
Language
TypeScript

OpenClaw versions 2026.2.22 and 2026.2.23 contain an authorization bypass vulnerability in the synology-chat channel plugin where dmPolicy set to allowlist with empty allowedUserIds fails open. Attackers with Synology sender access can bypass authorization checks and trigger unauthorized agent dispatch and downstream tool actions.

How AI Introduced This

Yes. The Claude Opus 4.6 co-authored Synology Chat introduction commit `03586e3d0057b5975090d50dadcc5bc95b51f977` created the fail-open authorization behavior by making `checkUserAllowed(..., [])` return true, then wiring that result into the inbound webhook path that calls `deliver()` and can trigger downstream agent/tool actions. The same commit also made the unsafe state easy to hit by resolving accounts to `dmPolicy: "allowlist"` while empty `allowedUserIds` parse to `[]`.

Attribution Chain
Advisory
GitHub Advisory
Fix Commit
0ee3036— openclaw/openclaw
git blame
extensions/synology-chat/src/security.ts, extensions/synology-chat/src/webhook-handler.ts, extensions/synology-chat/src/channel.ts
Squash Merge
03586e3— 2 sub-commits
PR Decomposition
File overlap + AI signal analysis
Bug-Introducing Commit
Bug-Introducing Commits(1)

feat(channels): add Synology Chat native channel

druide67Feb 21, 2026extensions/synology-chat/src/security.ts, extensions/synology-chat/src/webhook-handler.ts, extensions/synology-chat/src/channel.tsBlame: 100%

Extracted from squash merge 03586e3

1 other sub-commit in this PR
75c5610druide67

feat(synology-chat): add pairing, warnings, messaging, agent hints

Claude Code·Co-author trailer

Deep Verification

by GPT-5.4
CONFIRMED0.95
62 tool calls
95%

Fix `0ee30361b8f6ef3f110f3a7b001da6dd3df96bb5` directly removes `if (allowedUserIds.length === 0) return true;` from `extensions/synology-chat/src/security.ts` and changes the comment/test from "empty allowlist = allow all users" to reject-empty behavior. `git_log_search` for that exact removed line and for the original test text (`allows any user when allowlist is empty`) both point to `03586e3d0057b5975090d50dadcc5bc95b51f977`, and blame on the pre-fix lines also attributes them to that commit. This is the core fail-open authorization bug the CVE describes.

AI Signals(1)
Commitcc048a2
Claude CodeCo-author trailerCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>95%
Fix Commits(2)