T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/tradeit_api.py:143- Finding
Unrestricted Authenticated Tool Dispatcher
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a disclosed Trade It trading integration, but it gives agents authenticated paths that can place real orders before per-trade confirmation and includes an arbitrary authenticated tool dispatcher.
Review this skill carefully before installing. It needs a Trade It token that can view brokerage data and place trades, and some create calls may submit real orders before a separate execution step. Use only with deliberately limited accounts or hosted review flows, avoid yolo/immediate-placement settings, and do not allow generic tool-execute or unredacted output in normal use.
scripts/tradeit_api.py:143Unrestricted Authenticated Tool Dispatcher
SKILL.md:177Trade Creation Can Place a Real Order Before Explicit Confirmation
scripts/tradeit_api.py:61HTTP Error Responses Bypass Sensitive-Data Redaction
scripts/tradeit_api.py:121Command-Line Token Input and Raw-Output Option Can Expose Credentials
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
Use bearer auth in all cases. `TRADEIT_ACCESS_TOKEN` may be an API key token or an OAuth access token.
## Error handling contract
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
- holdings
- and to send buy/sell orders on the user's behalf
- Trade It **NEVER** sells or shares user data with third parties.
- Trade It **NEVER** stores usernames or passwords; it stores revocable access tokens.
- Data is encrypted at rest and in transit using bank-level security protocols.
- OAuth is used whenever possible. For brokerages without OAuth, Trade It uses API keys or securely exchanges credentials for an access token.
- Users can revoke access directly from their brokerage or by deleting a connection on Trade It at any time.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
- Trade It **NEVER** sells or shares user data with third parties.
- Trade It **NEVER** stores usernames or passwords; it stores revocable access tokens.
- Data is encrypted at rest and in transit using bank-level security protocols.
- OAuth is used whenever possible. For brokerages without OAuth, Trade It uses API keys or securely exchanges credentials for an access token.
- Users can revoke access directly from their brokerage or by deleting a connection on Trade It at any time.
- Trade It's access is limited: it is unable to withdraw, transfer, or take custody of money or assets; it can only place trades on the user's behalf.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
- Trade It **NEVER** sells or shares user data with third parties.
- Trade It **NEVER** stores usernames or passwords; it stores revocable access tokens.
- Data is encrypted at rest and in transit using bank-level security protocols.
- OAuth is used whenever possible. For brokerages without OAuth, Trade It uses API keys or securely exchanges credentials for an access token.
- Users can revoke access directly from their brokerage or by deleting a connection on Trade It at any time.
- Trade It's access is limited: it is unable to withdraw, transfer, or take custody of money or assets; it can only place trades on the user's behalf.
The skill uses 'env' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The skill uses 'file_read' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The skill uses 'network' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
The documentation states that trade creation may place an order immediately for some users, but it does not present that behavior as a prominent safety warning. In a trading skill, ambiguous create-vs-execute semantics can cause unintended live orders and direct financial loss if an agent or user assumes create is always non-committal.
The execute_trade endpoint is an explicit commit action for a live trade, yet the reference describes it functionally without a strong user-facing safety warning. In this skill context, under-warning a live asset-moving operation materially increases the risk of unauthorized or accidental trade execution.
The example flow explicitly allows immediate trade placement when 'yolo mode' is enabled, but it does not require a clear, explicit user confirmation at execution time or present a strong warning about irreversible financial impact. In a trading skill that can place real brokerage orders, normalizing one-step execution materially increases the risk of unintended or manipulated transactions, especially if upstream prompts, account selection, or order details are misunderstood.
The script exposes create-trade, create-options-trade, and execute-trade actions with no built-in confirmation, dry-run, or user acknowledgement step before irreversible financial operations. In a skill context, especially one callable by an agent, this increases the risk of accidental, unauthorized, or prompt-induced trades that can cause immediate monetary loss.
The code retrieves TRADEIT_ACCESS_TOKEN and sends it in the Authorization header on every API request, which is sensitive credential handling and network transmission. Although this behavior is expected for an API client, the file itself contains no user-facing message, comment, or docstring disclosing that credentials from the environment will be used and transmitted to the Trade It service.
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.
def build_trade_query(args):
query = {}
for key in ("order_by", "filter", "cursor", "refresh", "expand"):
val = getattr(args, key)
if val is not None:
query[TRADE_QUERY_KEY_MAP.get(key, key)] = val
return query
No suspicious patterns detected.