T09 · Insecure Skill Coding Practices
- Location
SKILL.md:28- Finding
Client-Controlled User ID Used as the Sole Documented Authorization Mechanism
- Content
View full analysis
Profile). ``` Related instructions broaden the potential impact: ```markdown - `getUserInfo({userId})` - verify the userId resolves to a real user. Use to validate pairing before running other tools. ``` ```markdown - Never invent a `userId`. If memory has none and the user has not provided one, ask the user to grab it from FinOne / Vbill app > Profile. - If the agent is shared across multiple users (group chat, shared web widget), confirm the active `userId` at session start. Treat `finone.userId` in memory as the user's last-confirmed binding, not a fixed identity for the agent. ``` ### Technical Analysis The skill explicitly states that the MCP service uses no authentication header and that every request is authorized operationally by a caller-supplied `userId`. The identifier may be accepted directly from a user or loaded from agent memory. A numeric account identifier is not an authentication credential. Unless the remote service applies an undocumented, independent authentication and authorization control, accepting `userId` from the request creates an insecure direct object reference or broken object-level authorization condition. A caller could select another merchant's account by supplying that merchant's identifier. The documented `getUserInfo` operation only verifies that an identifier resolves to an existing account. It does not establish that the current caller owns or is authorized to access that account. It may therefore also function as an account-enumeration oracle. The risk is increased in shared agents because a reme ...[truncated 2771 chars]- Remediation
View remediation
