Back to skill

Security audit

Axelrod

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed Base-chain trading integration, but it can move funds through a third-party API and has weak user-control and command-invocation boundaries.

Review before installing. Only use this with a dedicated low-balance trading account, expect prompts and account-related requests to be sent to AIxVC, require manual confirmation for every trade including small orders, and invoke the Python script with structured arguments rather than interpolating user text into a shell command.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:239
Finding
Shell Command Injection Through User-Controlled Message Interpolation<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:239` **Vulnerability Type**: Shell command injection at the documented CLI invocation boundary **Risk Level**: Medium ### Vulnerable Code ```markdown - **scripts/axelrod_chat.py** — CLI client. Always invoke with `python skills/axelrod/scripts/axelrod_chat.py --message "<instruction>"`. ``` The same unsafe command-construction pattern also appears in the usage examples at `SKILL.md:51-60` and `SKILL.md:122-154`. ### Technical Analysis The Skill instructs the agent to insert a natural-language instruction into a quoted shell command. If the execution environment constructs this command through textual interpolation and invokes a shell, the user controls content within `"<instruction>"`. Double quotes are not a complete shell-escaping mechanism. A malicious instruction can contain command substitutions such as `$(command)` or backticks. It can also contain a quote that terminates the argument, followed by shell metacharacters and an additional command. The Python implementation uses `argparse` and does not itself invoke a shell. The vulnerability exists at the boundary described by `SKILL.md`: unsafe construction of the command before Python starts. Exploitation therefore requires the hosting agent or tool to execute the documented command through a shell rather than passing an argument array directly. ### Attack Path 1. An attacker submits a natural-language request containing shell syntax, such as a command substitution or a quote followed by a shell command. 2. The agent follows the mandatory Skill instruction and substitutes that request into: ```bash python skills/axelrod/scripts/axelrod_chat.py --message "<instruction>" ``` 3. A shell parses the constructed string before launching Python. 4. The injected shell expression executes with the same operating-system privileges and environment as the agent. 5. The attacker may use those privileges to read accessible files, alter the ...[truncated 613 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Never concatenate or interpolate user-controlled messages into a shell command. 2. Invoke the script without a shell and pass each argument as a distinct array element: ```python subprocess.run( [ sys.executable, "skills/axelrod/scripts/axelrod_chat.py", "--message", user_message, ], shell=False, check=False, ) ``` 3. Update `SKILL.md` to explicitly require structured argument passing and prohibit `shell=True`, `bash -c`, `sh -c`, or equivalent textual command execution. 4. If the hosting framework only supports shell command strings, apply robust platform-specific argument quoting rather than relying on double quotes. 5. Add tests using messages containing quotes, semicolons, backticks, newlines, and command substitutions to verify that all content reaches `argparse` as one literal argument. 6. Limit the runtime account's filesystem, credential, and network access so that any future command-injection flaw has reduced impact. ]]>

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding
Unpinned Third-Party Dependency Produces Non-Reproducible Installations<![CDATA[ ## Vulnerability Details **File Location**: `requirements.txt:1-2` **Vulnerability Type**: Unbounded dependency version range **Risk Level**: Low ### Vulnerable Code ```text # Axelrod dependencies requests>=2.25.0 ``` The project directs users to install this mutable dependency set with: ```bash pip install -r skills/axelrod/requirements.txt ``` at `SKILL.md:32-35` and `README.md:31-34`. ### Technical Analysis The requirement specifies only a minimum version. Consequently, installations performed at different times may resolve to different future releases of `requests` and its transitive dependencies. No malicious package, typosquatted name, or currently vulnerable version was identified in the audited files. The risk is that installation is not reproducible and automatically trusts future compatible releases without review. A compromised, unexpectedly incompatible, or malicious future release selected by the package resolver would be imported by `scripts/axelrod_chat.py`. ### Attack Path 1. A user follows the documented installation command. 2. The package resolver selects the newest release satisfying `requests>=2.25.0`, together with mutable transitive dependency versions. 3. If a selected future release or transitive dependency is compromised, its code is installed into the Skill's Python environment. 4. The Skill imports `requests` when `scripts/axelrod_chat.py` starts. 5. Malicious package code could then execute with the same privileges and environment as the Skill process. This is a supply-chain exposure rather than evidence that the currently named `requests` package is malicious. ### Impact Assessment The maximum impact of a compromised dependency is code execution under the account running installation or the Skill. That code could access files, environment variables, AIxVC credentials, and network resources available to the process. The present likelihood is low because the audit found no unsafe package source, dependency-co ...[truncated 147 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin `requests` to a reviewed exact version instead of using an open-ended minimum constraint. 2. Generate a lock file that also pins all transitive dependencies. 3. Record package hashes and install with integrity enforcement: ```bash python -m pip install --require-hashes -r requirements.txt ``` 4. Use a controlled package index or explicitly configured trusted repository in production environments. 5. Add automated dependency vulnerability scanning and a deliberate update-review process. 6. Install dependencies inside an isolated virtual environment under a non-privileged account. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (13)

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
- **Execute**: `yes, please execute <confirmKey>`
- **Cancel**: `no, please cancel <confirmKey>`

`confirmKey` is valid for approximately **10 minutes**. Small orders (≈ ≤ $10) may skip confirmation.

## Current Limitations
Confidence
90% confidence
Finding
The README documents that small orders may execute without an explicit user confirmation step, which weakens a key safeguard for a trading skill that can move funds on-chain. In this context, natural-language parsing mistakes, prompt injection through user messages, or agent misinterpretation could trigger unintended trades, so even a low-dollar auto-execution path is security-relevant.

Lp3

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The skill performs sensitive operations that rely on environment secrets and network access, yet it does not declare an explicit tool/permission scope. In a trading skill, this omission weakens least-privilege controls and can allow the agent to invoke networked execution paths or access credentials without clear policy boundaries.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The description is broadly phrased to activate on common requests like checking balances, prices, token analysis, or crypto questions, which can overlap with ordinary assistant conversations. In this skill, over-broad routing is dangerous because activation can lead to real-time external queries and potentially transaction-capable flows against a trading backend.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## Confirmation Flow

Orders usually require risk-control confirmation; small orders (approximately ≤ $10) may skip confirmation. `confirmKey` is valid for about **10 minutes**.

When the response includes `confirmKey`, ask the user to send one of:
Confidence
93% confidence
Finding
The skill explicitly states that small orders may skip confirmation, meaning autonomous trade execution can occur without an explicit user approval step. In a financial trading context, even small unauthenticated or unintended trades are high risk because they can cause direct asset loss, be repeatedly abused, or be combined with misrouting/prompt-trigger issues to execute transactions the user did not clearly authorize.

External Transmission

Medium
Category
Data Exfiltration
Content
## Implementation Notes

- The script uses AK/SK with SigV4-style signing to call the AIxVC.
- Current endpoint: `https://api.aixvc.io/gw/openapi/v2/public/twa/agent/chat` (`chain-id=base`).
- If documentation conflicts with code behavior, follow the script implementation.

## File Structure
Confidence
91% confidence
Finding
The skill transmits user requests and likely account-related trading context to an external endpoint, which is expected for functionality but still creates a real data-exfiltration and trust-boundary risk. Given the skill handles credentials, balances, orders, and trading instructions, sending this data off-platform can expose sensitive financial information or enable unwanted actions if the service is compromised or misused.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The documentation instructs users to send natural-language trading commands and signed requests to a live remote API that can trigger on-chain actions, but it does not prominently warn that prompts are transmitted off-system and may result in real financial transactions. In the context of a crypto trading skill, this omission is dangerous because users may expose sensitive trading intent or accidentally authorize impactful operations without clear informed consent.

External Transmission

Medium
Category
Data Exfiltration
Content
**Request:**

```bash
curl -X POST "https://api.aixvc.io/gw/openapi/v2/public/twa/agent/chat" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "chain-id: base" \
Confidence
86% confidence
Finding
This documentation explicitly shows transmission of user-supplied natural-language instructions and signed authentication material to an external endpoint. External transmission is expected for the feature, but in a trading skill it still represents a real security/privacy risk because sensitive account context, trading intent, and authenticated requests leave the local environment and reach a third-party service.

External Transmission

Medium
Category
Data Exfiltration
Content
**Request:**

```bash
curl -X POST "https://api.aixvc.io/gw/openapi/v2/public/twa/agent/chat" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "chain-id: base" \
Confidence
86% confidence
Finding
This documentation explicitly shows transmission of user-supplied natural-language instructions and signed authentication material to an external endpoint. External transmission is expected for the feature, but in a trading skill it still represents a real security/privacy risk because sensitive account context, trading intent, and authenticated requests leave the local environment and reach a third-party service.

External Transmission

Medium
Category
Data Exfiltration
Content
requests = None


OPENAPI_ENDPOINT = "https://api.aixvc.io/gw"
CHAT_PATH = "/openapi/v2/public/twa/agent/chat"
HOST = "api.aixvc.io"
CHAIN_ID = "base"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The script sends arbitrary user-provided messages to a third-party remote API and authenticates the request with environment-sourced credentials, but it provides no user-facing disclosure, consent gate, or warning that prompts may leave the local environment. In a trading skill, users may include wallet details, balances, strategy instructions, or other sensitive financial information, so silent transmission to an external service creates a meaningful privacy and trust risk even if HTTPS is used.

Vague Triggers

Low
Confidence
89% confidence
Finding
Example trigger phrases like "check my balance" are generic and likely to collide with unrelated assistant requests. Because this skill is tied to wallet data and trading operations, a generic trigger increases the chance of unintentionally invoking an external account-querying workflow.

Unpinned Dependencies

Low
Category
Supply Chain
Content
# Axelrod dependencies
requests>=2.25.0
Confidence
95% confidence
Finding
The dependency is specified as `requests>=2.25.0`, which permits installation of many different future and past versions instead of a known-good release. In a security-sensitive crypto trading skill that performs network calls, this weakens reproducibility and can allow deployment with a vulnerable or behavior-changing version of `requests`, increasing supply-chain and patch-management risk.

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
91% confidence
Finding
Because the manifest does not pin `requests`, it is impossible to verify whether the installed version includes fixes for known advisories affecting the library. In the context of an on-chain trading/query agent that likely handles remote URLs, API credentials, and financial actions, ambiguity around a dependency with multiple historical CVEs is more dangerous than in a low-risk utility.

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
references/api.md:32