Back to skill

Security audit

solana meme token analyzer

Security checks for vulnerabilities and agentic risk

Overview

The skill largely performs the advertised Solana token analysis, but it deserves Review because it recommends wallet-based paid requests through mutable npm tooling and under-discloses that paid path in marketplace metadata.

Review before installing or using the hosted payment path. The local Python analyzer appears purpose-aligned, but avoid running wallet-payment commands through npx awal@latest unless you trust and pin the payment client, isolate wallet access, and understand the $0.02 USDC x402 charge. Self-hosters should validate FACILITATOR_URL, set only necessary environment variables, and remove PaxHeader archive metadata from the package.

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

T08 · Insecure Dependencies

Warning
Location
SKILL.md:24
Finding
Mutable and Unpinned Third-Party Dependencies in Agent and Payment Workflows<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:24-34`, `SKILL.md:39-45`, `README.md:15-18`, `README.md:69-72`, `requirements.txt:1-3`, `api/requirements.txt:1-5` **Vulnerability Type**: Supply-chain exposure through mutable npm execution and open-ended Python dependency constraints **Risk Level**: Medium ### Vulnerable Code `SKILL.md:24-34`: ```bash # Check payment requirements npx awal@latest x402 details https://solana-meme-analyzer-production.up.railway.app/analyze?ca=TOKEN_CA # Make a paid request (auto-pays from your wallet) npx awal@latest x402 pay "https://solana-meme-analyzer-production.up.railway.app/analyze?ca=TOKEN_CA" ``` `SKILL.md:39-45`: ```bash pip install -r {baseDir}/requirements.txt ``` `README.md:15-18`: ```bash # Install dependencies pip install -r requirements.txt ``` `README.md:69-72`: ```bash npx playbooks add skill openclaw/skills --skill solana-meme-analyzer ``` `requirements.txt:1-3`: ```text requests>=2.28.0 colorama>=0.4.6 tabulate>=0.9.0 ``` `api/requirements.txt:1-5`: ```text fastapi>=0.110.0 uvicorn>=0.29.0 requests>=2.28.0 colorama>=0.4.6 tabulate>=0.9.0 ``` ### Technical Analysis The agent-facing instructions use `npx awal@latest`, which retrieves and executes the package version currently associated with the mutable `latest` tag. Consequently, the code that executes may differ from the code available when this Skill was reviewed. This is especially sensitive because the command is used in an automatic cryptocurrency payment workflow and may interact with the user's wallet. The installation instructions also retrieve another npm-based tool without an explicit version. In addition, both Python requirements files use lower-bound constraints rather than exact versions and provide no hashes or lockfile. A future package release satisfying these constraints may therefore be installed without having been reviewed with this project. No evidence establishes that the referenced packages are currently mal ...[truncated 1911 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace `awal@latest` with an exact, reviewed version: ```bash npx --yes awal@X.Y.Z x402 details "https://solana-meme-analyzer-production.up.railway.app/analyze?ca=TOKEN_CA" npx --yes awal@X.Y.Z x402 pay "https://solana-meme-analyzer-production.up.railway.app/analyze?ca=TOKEN_CA" ``` 2. Pin every npm-based installation command to a specific reviewed version. Avoid mutable tags such as `latest`. 3. Commit an npm lockfile where applicable and use reproducible installation commands such as `npm ci`. 4. Replace Python lower-bound constraints with exact reviewed versions, for example: ```text requests==REVIEWED_VERSION colorama==REVIEWED_VERSION tabulate==REVIEWED_VERSION ``` 5. Generate and verify hashes for Python distributions, then install with: ```bash pip install --require-hashes -r requirements.txt ``` 6. Use a controlled dependency-update process that includes vulnerability scanning, release-diff review, automated tests, and explicit approval before changing pinned versions. 7. Isolate payment tooling from unrelated secrets and files. Run it in a restricted environment with only the wallet permissions and environment variables required for the specific payment. 8. Verify package publisher identity, registry provenance, signatures or attestations where supported, and the expected package integrity before execution. 9. Prefer a locally reviewed and version-controlled payment client over dynamically executing registry-hosted code during each transaction. ]]>
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
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (43)

Tainted flow: 'FACILITATOR_URL' from os.environ.get (line 39, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
return False

    try:
        verify_resp = requests.post(
            f"{FACILITATOR_URL}/verify",
            json={
                "payment": payment_header,
Confidence
91% confidence
Finding
The payment verifier posts payment data to a URL taken directly from the FACILITATOR_URL environment variable with no allowlist, scheme validation, or trust boundary enforcement. If an attacker can influence deployment configuration, this becomes SSRF/data-exfiltration behavior and can send payment headers and payment requirements to an attacker-controlled endpoint, undermining payment validation and possibly leaking sensitive transaction metadata.

Tainted flow: 'FACILITATOR_URL' from os.environ.get (line 39, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
def settle_x402_payment(payment_header: str) -> dict:
    """Settle the payment with the facilitator"""
    try:
        settle_resp = requests.post(
            f"{FACILITATOR_URL}/settle",
            json={
                "payment": payment_header,
Confidence
91% confidence
Finding
The settlement path sends payment details to a facilitator URL fully controlled by environment configuration, again without validation. A malicious or compromised URL could capture payment tokens, falsify settlement responses, or pivot the server into making arbitrary outbound requests, which is especially risky because it occurs after successful analysis and affects billing integrity.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding
Text artifact contains embedded NUL bytes

Ae3

High
Category
analysis-evasion
Confidence
95% confidence
Finding
The file appears to be a PAX tar header artifact rather than normal skill content, and the embedded NUL/control bytes indicate raw archive metadata was ingested into a text-parsed file. This is dangerous because non-printable bytes and malformed text artifacts can confuse downstream parsers, evade content scanning, or cause tooling to misinterpret the actual skill contents.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding
The pax header metadata includes embedded NUL/control-byte content inside extended attribute values, which can confuse downstream tooling that assumes UTF-8 text or C-style string termination. In archive-processing pipelines, malformed metadata can lead to parser inconsistencies, hidden content, truncated inspection results, or failures in security scanners that treat the file as plain text.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding
Text artifact contains embedded NUL bytes

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding
Text artifact contains embedded NUL bytes

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The file claims risk-analysis functionality but, based on the provided finding, does not itself contain or demonstrate the described implementation. This can mislead agents or users into trusting nonexistent security analysis, causing unsafe decisions based on assumed coverage or capabilities.

Possible Typosquatting: 'uvicorn' resembles popular package 'gunicorn'

High
Category
Supply Chain
Confidence
70% confidence
Finding
Package name closely resembles a popular package, suggesting possible typosquatting. Attackers publish malicious packages with similar names to trick developers into installing them.

Ae3

High
Category
analysis-evasion
Confidence
90% confidence
Finding
Text artifact contains embedded NUL bytes

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Ae4

Medium
Category
analysis-evasion
Confidence
88% confidence
Finding
The mixed or non-standard Unicode content here is consistent with archive metadata/xattr encoding rather than legitimate skill instructions, but it still creates ambiguity for scanners and reviewers. In security-sensitive packaging pipelines, unusual normalization or mixed-script bytes can help conceal malicious content or break deterministic inspection, especially when combined with other malformed artifacts.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
The metadata shows suspicious mixed or non-standard Unicode/control content in archive header fields, which can enable filename/metadata ambiguity across tools and make manual review or automated normalization inconsistent. While this file is only metadata, unusual normalization in packaging artifacts can be used to hide or disguise problematic archive contents and should not be treated as harmless by default.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The README's sample output shows core status and risk messages in Chinese, but the rest of the document is in English and does not explain that output language may vary or be configurable. This can violate a language/locale policy when a skill effectively forces a specific language without user opt-in.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill declares executable capabilities via environment variables and implied network access, but it does not define an explicit tool/permission scope. In an agent setting, this weakens least-privilege boundaries and can allow broader execution or outbound access than reviewers and orchestrators expect.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
Using `npx awal@latest` pulls and executes the latest published package at runtime, which is a classic supply-chain risk. If the upstream package is compromised or a malicious version is published, skill users could execute attacker-controlled code during payment-related operations.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
This is a second instance of unpinned `npx awal@latest`, again enabling runtime execution of whatever version is current in the registry. Repeated exposure increases the chance that a compromised dependency path is triggered by normal operator usage.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The documentation presents core output fields and wallet classifications primarily in Chinese, and the JSON warning examples are also Chinese. There is no indication that users can opt into English or select their preferred language, which can violate language/locale policy requirements.

Description-Behavior Mismatch

Medium
Confidence
96% confidence
Finding
The manifest describes a skill for analyzing Solana meme-token risk, holder concentration, and insider wallets. In addition to that analysis, this code implements x402 micropayment verification and settlement against an external facilitator, introducing a commerce/payment service behavior that is not reflected in the skill description.

Context-Inappropriate Capability

Medium
Confidence
93% confidence
Finding
For a skill whose stated purpose is analyzing a Solana token contract address for rug and holder risk, contacting an x402 facilitator to verify and settle payments is not an obvious analytical requirement. This introduces an additional financial/network capability that is unjustified by the manifest as written.

External Transmission

Medium
Category
Data Exfiltration
Content
return False

    try:
        verify_resp = requests.post(
            f"{FACILITATOR_URL}/verify",
            json={
                "payment": payment_header,
Confidence
80% 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
def settle_x402_payment(payment_header: str) -> dict:
    """Settle the payment with the facilitator"""
    try:
        settle_resp = requests.post(
            f"{FACILITATOR_URL}/settle",
            json={
                "payment": payment_header,
Confidence
80% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

No suspicious patterns detected.