Back to skill

Security audit

Steamcommunity

Security checks for vulnerabilities and agentic risk

Overview

The skill is coherent for Steam inventory and trade management, but it asks users to handle live Steam credentials and perform item-transfer actions without enough safety guidance.

Install only if you are comfortable giving the agent access to your Steam session cookies and API key. Treat those values like passwords, avoid logging or sharing commands that contain them, verify every partner ID and asset ID manually, and require an explicit preview before sending or accepting any trade.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:233
Finding
Steam API Key Exposed in Command-Line URLs<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:233-304` **Vulnerability Type**: Sensitive credential exposure through command-line arguments and URL query parameters **Risk Level**: Medium ### Vulnerable Code ```bash # SKILL.md:233-234 curl -s "https://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=$STEAM_API_KEY&get_sent_offers=1&get_received_offers=1&active_only=1&get_descriptions=1&language=english" \ | jq '.' ``` ```bash # SKILL.md:239-240 curl -s "https://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=$STEAM_API_KEY&get_sent_offers=0&get_received_offers=1&active_only=1&get_descriptions=1&language=english" \ | jq '.response.trade_offers_received' ``` ```bash # SKILL.md:245-246 curl -s "https://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=$STEAM_API_KEY&get_sent_offers=1&get_received_offers=0&active_only=1&get_descriptions=1&language=english" \ | jq '.response.trade_offers_sent' ``` ```bash # SKILL.md:252-253 curl -s "https://api.steampowered.com/IEconService/GetTradeOffer/v1/?key=$STEAM_API_KEY&tradeofferid=$TRADE_OFFER_ID&language=english&get_descriptions=1" \ | jq '.response.offer' ``` ```bash # SKILL.md:259-260 curl -s "https://api.steampowered.com/IEconService/GetTradeOffersSummary/v1/?key=$STEAM_API_KEY&time_last_visit=0" \ | jq '.response' ``` ```bash # SKILL.md:304-305 curl -s "https://api.steampowered.com/IEconService/GetTradeHistory/v1/?key=$STEAM_API_KEY&max_trades=10&get_descriptions=1&language=english&include_failed=0" \ | jq '.response.trades' ``` ### Technical Analysis The Skill interpolates `STEAM_API_KEY` directly into URLs passed to `curl`. After shell expansion, the complete API key becomes part of the `curl` process arguments. Depending on the operating system and execution environment, command-line arguments may be visible through process inspection utilities, diagnostic tooling, audit systems, telemetry collectors, or error reports. Embedding credentials in URLs al ...[truncated 2113 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Avoid placing API keys directly in URLs supplied as command-line arguments. 2. Use a wrapper that supplies secret-bearing request configuration through standard input or another protected channel so the expanded key is not exposed in the process argument list. 3. If a Steam endpoint supports a non-URL authorization mechanism, use that mechanism instead of a query-string credential. 4. Ensure debugging, verbose HTTP logging, shell tracing, and command recording are disabled around credential-bearing requests. 5. Redact `key` query parameters in proxy logs, application telemetry, audit records, and error reports. 6. Run the Skill under a dedicated, least-privileged local account so unrelated users and processes cannot inspect its environment or process metadata. 7. Clearly document that users should rotate their Steam API key after suspected process, log, or telemetry exposure. 8. Prefer narrowly scoped or short-lived credentials if Steam makes such credential types available. ]]>
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 (15)

Missing User Warnings

Medium
Confidence
98% confidence
Finding
The setup instructs users to extract and store Steam session cookies, session IDs, and API keys without clear warnings that these are highly sensitive authentication secrets. Exposure of these values can let anyone impersonate the user for inventory access and trade actions, potentially leading to account abuse and item theft.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill documents high-risk trade actions including sending, accepting, canceling, and declining offers, but it does not prominently warn that these actions can irreversibly transfer valuable virtual items or cause permanent loss if the wrong offer is accepted or sent. In an agent context, omission of explicit confirmation and consequence warnings increases the chance of accidental destructive actions with real monetary value.

External Transmission

Medium
Category
Data Exfiltration
Content
}'

# Send with trade token (non-friend)
curl -s "https://steamcommunity.com/tradeoffer/new/send" \
  -X POST \
  -H "Cookie: sessionid=$STEAM_SESSION_ID; $STEAM_COOKIES" \
  -H "Referer: https://steamcommunity.com/tradeoffer/new/?partner=$PARTNER_ACCOUNT_ID&token=$TRADE_TOKEN" \
Confidence
95% confidence
Finding
This command transmits authenticated Steam session cookies and a trade token to Steam in order to create a trade offer, which can directly move items of real-world value. In an agent workflow, any mistaken parameter substitution, prompt injection, or unauthorized execution could result in fraudulent trades or asset loss.

External Transmission

Medium
Category
Data Exfiltration
Content
To send to a **friend** (no token needed), omit the `token` from the Referer and set `trade_offer_create_params` to `{}`:

```bash
curl -s "https://steamcommunity.com/tradeoffer/new/send" \
  -X POST \
  -H "Cookie: sessionid=$STEAM_SESSION_ID; $STEAM_COOKIES" \
  -H "Referer: https://steamcommunity.com/tradeoffer/new/?partner=$PARTNER_ACCOUNT_ID" \
Confidence
95% confidence
Finding
This variant sends an authenticated trade offer to a friend using live session credentials, enabling direct transfer of inventory items. Because it performs a state-changing external action with account authority, misuse or automation errors can cause irreversible loss even without a trade token.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# Get all active trade offers (sent and received)
curl -s "https://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=$STEAM_API_KEY&get_sent_offers=1&get_received_offers=1&active_only=1&get_descriptions=1&language=english" \
  | jq '.'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# Get all active trade offers (sent and received)
curl -s "https://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=$STEAM_API_KEY&get_sent_offers=1&get_received_offers=1&active_only=1&get_descriptions=1&language=english" \
  | jq '.'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# Get all active trade offers (sent and received)
curl -s "https://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=$STEAM_API_KEY&get_sent_offers=1&get_received_offers=1&active_only=1&get_descriptions=1&language=english" \
  | jq '.'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# Get all active trade offers (sent and received)
curl -s "https://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=$STEAM_API_KEY&get_sent_offers=1&get_received_offers=1&active_only=1&get_descriptions=1&language=english" \
  | jq '.'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# Get all active trade offers (sent and received)
curl -s "https://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=$STEAM_API_KEY&get_sent_offers=1&get_received_offers=1&active_only=1&get_descriptions=1&language=english" \
  | jq '.'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# Get all active trade offers (sent and received)
curl -s "https://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=$STEAM_API_KEY&get_sent_offers=1&get_received_offers=1&active_only=1&get_descriptions=1&language=english" \
  | jq '.'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# Get all active trade offers (sent and received)
curl -s "https://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=$STEAM_API_KEY&get_sent_offers=1&get_received_offers=1&active_only=1&get_descriptions=1&language=english" \
  | jq '.'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# Get all active trade offers (sent and received)
curl -s "https://api.steampowered.com/IEconService/GetTradeOffers/v1/?key=$STEAM_API_KEY&get_sent_offers=1&get_received_offers=1&active_only=1&get_descriptions=1&language=english" \
  | jq '.'
```
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
TRADE_OFFER_ID="1234567890"
PARTNER_STEAM_ID="76561198012345678"

curl -s "https://steamcommunity.com/tradeoffer/$TRADE_OFFER_ID/accept" \
  -X POST \
  -H "Cookie: sessionid=$STEAM_SESSION_ID; $STEAM_COOKIES" \
  -H "Referer: https://steamcommunity.com/tradeoffer/$TRADE_OFFER_ID/" \
Confidence
95% confidence
Finding
The accept-offer request uses authenticated cookies to finalize a pending trade, which may permanently exchange items once confirmed. This is dangerous because accepting the wrong tradeofferid or a manipulated offer can immediately authorize unwanted asset transfer.

External Transmission

Medium
Category
Data Exfiltration
Content
### Cancel a sent trade offer

```bash
curl -s "https://api.steampowered.com/IEconService/CancelTradeOffer/v1/" \
  -X POST \
  -d "key=$STEAM_API_KEY" \
  -d "tradeofferid=$TRADE_OFFER_ID"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Natural-Language Policy Violations

Low
Confidence
96% confidence
Finding
Across multiple examples, the skill forces English locale in request parameters, which is a natural-language policy concern when no opt-in or alternative is provided. The file does not explain why English is required or mention that users may substitute another language.

Static analysis

No suspicious patterns detected.