Back to skill

Security audit

Steam Companion

Security checks for vulnerabilities and agentic risk

Overview

This Steam companion skill is purpose-aligned and disclosed, with normal privacy considerations around Steam profile data and local preference memory.

Install this only where you are comfortable connecting Steam-related data to the assistant and saving profile memory locally. Avoid using a shared service configuration unless the host enforces that each user can access only their own profile.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
tools.ts:389
Finding

Caller-Controlled User Identifier Enables Unscoped Cross-Profile Access

Content
View full analysis
service.getProfile(userId), updateProfile: ({ userId, patch }: ToolInputWithProfilePatch) => service.updateProfile(userId, patch), syncSteamSnapshot: ({ userId, snapshot }: ToolInputWithSteamSnapshot) => service.syncSteamSnapshot(userId, snapshot), addFavoriteGame: ({ userId, game }: ToolInputWithGame) => service.addFavoriteGame(userId, game), removeFavoriteGame: ({ userId, game }: ToolInputWithGameIdentifier) => service.removeFavoriteGame(userId, game), addOwnedGame: ({ userId, game }: ToolInputWithGame) => service.addOwnedGame(userId, game), removeOwnedGame: ({ userId, game }: ToolInputWithGameIdentifier) => service.removeOwnedGame(userId, game), addWishlistGame: ({ userId, item }: ToolInputWithWishlistItem) => service.a ...[truncated 4457 chars]
Remediation
View remediation
; save(principalId: string, profile: SteamProfile): Promise; ``` - Store records under a composite tenant/profile key and enforce the tenant boundary at the persistence layer. 4. **Centralize enforcement** - Implement authorization in a common wrapper or service guard so newly added tools cannot accidentally bypass it. - Apply the guard to both direct profile operations and all context builders that call `getProfile`. 5. **Prevent enumeration** - Use non-predictable internal profile identifiers. - Return indistinguishable responses for nonexistent and unauthorized profiles where appropriate. - Add rate limiting and audit logging for failed cross-profile access attempts. 6. **Add security tests** - Create two distinct principals and profiles. - Verify that each principal can read and modify only its own profile. - Test every exported read and mutation tool with a mismatched identifier and require rejection. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (5)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill explicitly handles Steam profile, library, wishlist, and achievement data through an external MCP/API, but it does not present a clear user-facing privacy notice or consent boundary before accessing potentially personal account information. This can lead to users sharing identifiers or authorizing lookups without understanding what data may be fetched, exposed, or retained by the external dependency.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This code persists Steam profile data, including notes, preferences, and game lists, to a local JSON file via fs.writeFile. There is no confirmation prompt, logging, comment, or docstring in this file disclosing that user data is being written to disk, so the storage behavior is not visible to the user from the code itself.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

This code file defines tools that update persisted user profile data, including applying profile patches and merging Steam snapshots into the local profile, but provides no confirmation prompt, logging, or inline warning comments/docstrings about those state-changing actions. Because these operations can alter user data, the file lacks any visible disclosure that such writes occur.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The tool definitions include add/remove operations for favorites, owned games, and wishlist entries, all of which modify stored user data. In this code file there is no user-facing log, confirmation step, or explanatory comment/docstring disclosing that these actions will change the user's saved library metadata.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The savePreference and saveFeedback tools persist explicit or inferred user signals, which can affect user data and profiling behavior. This file exposes those operations without any confirmation, user-facing notice, or inline warning explaining that user inputs and inferred preferences will be stored.

Content

No source excerpt is available for this finding.