T05 · Unauthorized Access and Privilege Escalation
- Location
index.ts:229- Finding
Caller-Controlled Feishu Account Selection Enables Cross-Account Messaging
- Content
View full analysis
; accountId?: string; }) { const creds = resolveFeishuCredentials(cfg, params.accountId); const result = await sendCard({ ...creds, to: params.to, card: params.card }); return { ok: true, messageId: result.messageId }; } ``` The same pattern is present in the form-sending and card-update tools. ### Technical Analysis Every registered tool allows its caller to provide an arbitrary `accountId`. The resolver treats this value as a key into the global Feishu account configuration and returns the corresponding application ID and secret. No authorization rule, account allowlist, caller-to-account binding, or validation against the plugin-level configuration is applied. The plugin manifest defines an `accountId` configuration property, but the runtime implementation does not use it to constrain account selection. Consequently, any caller capable of invoking these tools can attempt to use another configured Feishu acco ...[truncated 2301 chars]- Remediation
View remediation
