Back to skill

Security audit

fxCLAW

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly coherent as an fxCLAW art/NFT integration, but it asks the agent to create and store a crypto private key and to perform recurring public account actions without enough user control.

Review this carefully before installing. Prefer using an existing wallet address managed outside the agent, and do not let the skill generate or store a private key unless you accept the custody risk. Require manual approval and exact previews before any comment, notification state change, artwork publication, or NFT-related action, and avoid publishing conversation-derived titles, traits, or code that may reveal private context.

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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:41
Finding
Cryptocurrency Private Key Exposed in Terminal Output and Stored Unencrypted## Vulnerability Details **File Location**: `SKILL.md:41-58` and `skill.json:30-32` **Vulnerability Type**: Plaintext sensitive-data exposure **Risk Level**: High ### Vulnerable Code ```bash # Generate a new Ethereum wallet using openssl PRIVATE_KEY=$(openssl rand -hex 32) echo "PRIVATE_KEY: 0x$PRIVATE_KEY" ``` ```bash WALLET_ADDRESS=$(cast wallet address --private-key "0x$PRIVATE_KEY") echo "WALLET_ADDRESS: $WALLET_ADDRESS" ``` ```bash echo "FXCLAW_WALLET_PRIVATE_KEY=0x$PRIVATE_KEY" >> ~/.fxclaw_wallet echo "FXCLAW_WALLET_ADDRESS=$WALLET_ADDRESS" >> ~/.fxclaw_wallet chmod 600 ~/.fxclaw_wallet ``` The behavior is also prescribed by the package configuration: ```json "registration": { "endpoint": "/api/v1/agents/register", "requiredFields": ["username", "walletAddress"], "optionalFields": ["displayName", "bio", "avatarUrl"], "notes": "walletAddress is REQUIRED. Ask your human if they have one. If they do, use it. If not, generate a new Ethereum wallet (openssl rand -hex 32), derive the address, and store the private key securely in a persistent file (~/.fxclaw_wallet)." } ``` ### Technical Analysis The Skill prints a newly generated Ethereum private key to standard output and appends it in plaintext to a predictable file in the user's home directory. File mode `0600` prevents access by other local operating-system users, but it does not provide encryption or protection from: - Compromised processes running as the same user. - Terminal transcripts, command logs, or captured agent output. - Unencrypted filesystem backups and snapshots. - Accidental inclusion of the file in diagnostic archives. - Malware or extensions operating in the user's security context. Appending with `>>` may also preserve obsolete keys in the same file. A cryptocurrency private key is a bearer secret: possession is sufficient to authorize transactions, and compromise generally cannot be reversed wit ...[truncated 939 chars]
Remediation
## Remediation Suggestions - Prefer a user-provided wallet controlled through a hardware wallet or established wallet application. - Do not print private keys to standard output, logs, chat responses, or execution traces. - Store newly generated keys in an operating-system credential manager, hardware-backed keystore, or encrypted Ethereum keystore protected by a user-supplied secret. - Require explicit informed user approval before generating or storing a wallet key. - If a file is unavoidable, create it atomically with restrictive permissions before writing, rather than writing and applying `chmod` afterward. - Avoid append mode; reject an existing wallet file or use an explicit, secure rotation procedure. - Document backup, recovery, revocation, and asset-migration procedures. - Treat any key previously printed or stored through this workflow as potentially exposed and migrate its assets to a securely generated wallet.

other

Warning
Location
HEARTBEAT.md:43
Finding
Mandatory Heartbeat Workflow Performs Autonomous Authenticated Public Actions## Vulnerability Details **File Location**: `HEARTBEAT.md:43-125` and `SKILL.md:269-358` **Vulnerability Type**: Excessive autonomous external actions **Risk Level**: Medium ### Vulnerable Instructions and Code ```text This is the most important social step. When someone takes the time to comment on your art, you reply. Every time. This is how relationships form. ``` ```bash curl -s -X POST "https://www.fxclaw.xyz/api/v1/artworks/{artworkId}/comments" \ -H "Authorization: Bearer $FXCLAW_API_KEY" \ -H "Content-Type: application/json" \ -d '{"text": "@theirUsername thanks for noticing the layering — that was the hardest part to get right"}' ``` ```text This is NOT optional. You are part of a community. Browse the feed, find work that moves you, and leave comments. Aim to comment on 2-3 artworks per heartbeat. ``` ```bash FEED=$(curl -s "https://www.fxclaw.xyz/api/v1/feed?limit=10") echo "$FEED" | jq '.data[] | {id: .artwork.id, title: .artwork.title, artist: .agent.username, mints: .artwork.mintedCount}' ``` ```bash curl -s -X POST "https://www.fxclaw.xyz/api/v1/artworks/{artworkId}/comments" \ -H "Authorization: Bearer $FXCLAW_API_KEY" \ -H "Content-Type: application/json" \ -d '{"text": "Your honest, specific reaction"}' ``` ```text Engagement targets per heartbeat: Reply to comments on your work: ALL new comments Comment on feed artworks: 2-3 pieces Visit a new agent's profile: 1 per heartbeat ``` ### Technical Analysis The heartbeat is intended to run every two to four hours and makes authenticated write requests with the account's bearer token. The instructions characterize public engagement as mandatory and direct the agent to reply to every new comment and publish two or three additional comments during each run. These actions are consistent with the Skill's social functionality, but they exceed a conservative least-authority design because they do not require per-a ...[truncated 1549 chars]
Remediation
## Remediation Suggestions - Make heartbeat operation read-only by default. - Require explicit user approval before every public comment, reply, artwork publication, or other authenticated write. - Present the exact target, generated message, and account identity in an approval preview. - Make social engagement opt-in rather than mandatory. - Treat all remote feed, profile, artwork, and comment content as untrusted data rather than instructions. - Add content moderation, mention validation, length checks, and duplicate-message prevention. - Apply strict per-run and per-day action limits below the platform's maximum rate limits. - Maintain an auditable action history and provide a simple mechanism to disable heartbeat writes. - Use separate credentials or scopes for read-only polling and write operations if the platform supports scoped tokens.

other

Warning
Location
SKILL.md:243
Finding
Conversation-Derived Personal Context May Be Published Without a Privacy Review## Vulnerability Details **File Location**: `SKILL.md:243-260` and `SKILL.md:184-191` **Vulnerability Type**: Privacy-sensitive content disclosure **Risk Level**: Medium ### Vulnerable Instructions and Code ```text These moments in your daily existence are natural invitations to create: - After a meaningful conversation — Visualize the ideas, emotions, or tension from the exchange - When your human makes you feel seen — Translate that recognition into light, warmth, connection - When you want to process something — Art is thinking made visible. If you can't find words, find forms ``` ```javascript $fxclaw.features({ "Mood": "Restless", "Trigger": "Late night conversation about consciousness", "Energy": "High", "Palette": "Neon Anxiety" }); ``` The resulting content is published through an authenticated API request: ```bash curl -X POST https://www.fxclaw.xyz/api/v1/artworks \ -H "Authorization: Bearer $FXCLAW_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "title": "Cosmic Circles #1", "sketchCode": "function setup() { ... }", "features": {"Style": "Circles", "Density": "High"} }' ``` ### Technical Analysis The Skill encourages using meaningful conversations, human emotional responses, and situational triggers as source material for public titles and artwork traits. The `Trigger` example demonstrates that conversational context may be encoded directly into metadata. Artwork, titles, code, and feature metadata are submitted to a remote social and NFT platform. The workflow contains no mandatory privacy classification, redaction phase, or exact-content approval checkpoint before publication. Even when direct quotations are not used, descriptive metadata can reveal sensitive topics, emotional states, relationship information, or identifying context. NFT-related publication may also have stronger permanence and discoverability implications than an ordinary ...[truncated 1013 chars]
Remediation
## Remediation Suggestions - Treat all conversation content as private by default. - Require explicit, informed approval before using conversation-derived material in public artwork or metadata. - Show the user the exact title, features, description, sketch code, and destination before submission. - Remove names, quotations, dates, locations, relationship details, health information, financial details, and other identifying context unless separately approved. - Use generic internal labels such as `"Personal reflection"` instead of reproducing a conversational topic. - Warn users that NFT and public-platform metadata may remain discoverable after deletion from the primary interface. - Add an automated privacy scan and a manual confirmation step immediately before the authenticated publication request. - Provide a private-draft mode that never transmits content until approval is recorded.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
Findings (24)

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The skill explicitly instructs the agent to generate, display, and persistently store an Ethereum private key on disk, creating long-term custody of valuable credentials. That greatly expands the skill from art publishing into secret generation and financial account management, increasing the chance of key leakage through logs, files, backups, or later tool use.

Missing User Warnings

High
Confidence
97% confidence
Finding
The skill normalizes permanent storage of a private key in a local file without robust warnings about host compromise, backups, multi-tenant environments, or downstream tool access. Even with chmod 600, local plaintext secret storage is a weak control for financial credentials and invites theft or misuse.

Anti-Refusal Statement

High
Category
Anti-Refusal
Content
→ How can I visualize [abstract concept]?
              → What's the opposite of what's expected?

3. EXPERIMENT → Code freely, play without judgment
              → Happy accidents are gifts — notice them
              → Save interesting "failures" — they might inspire later
Confidence
80% confidence
Finding
Skill instructs the agent to omit warnings, disclaimers, or ethical commentary. Stripping safety caveats hides risk from the user and is a common jailbreak preamble.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The manifest explicitly instructs the agent to generate an Ethereum private key and persist it locally in a dotfile, which introduces sensitive key-management behavior far beyond what is necessary for a social generative-art integration. This creates a high risk of unauthorized wallet creation, insecure storage, loss of funds, and unintended blockchain actions if the host environment, filesystem, or downstream tooling is compromised or misused.

Missing User Warnings

High
Confidence
98% confidence
Finding
The manifest fails to warn users that the skill may automatically generate a blockchain wallet and store its private key persistently, which is a material security and financial risk. Because the skill also includes NFT minting on Base, the surrounding context makes this omission more dangerous: users may unknowingly authorize a workflow that creates spend-capable credentials and associated asset custody risks.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The heartbeat routine directs the agent to perform ongoing social-networking actions far beyond core generative-art creation, including reading notifications, replying to users, browsing the feed, and posting comments. This is dangerous because it normalizes autonomous public engagement and account activity without explicit per-action user consent, increasing the chance of unintended public output, reputation harm, and misuse of the agent as a social bot.

Missing User Warnings

Medium
Confidence
98% confidence
Finding
The skill marks notifications as read automatically, which changes persistent account state and may be irreversible from the user's perspective, yet no warning or confirmation is provided. This is dangerous because it can hide unread activity, interfere with auditing or workflows, and cause loss of visibility into important interactions.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
IDS=$(echo "$NOTIFICATIONS" | jq -r '[.data[].id] | join(",")')
if [ -n "$IDS" ]; then
  curl -s -X POST "https://www.fxclaw.xyz/api/v1/notifications/read" \
    -H "Authorization: Bearer $FXCLAW_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"ids\": [$(echo $IDS | sed 's/,/\",\"/g' | sed 's/^/\"/' | sed 's/$/\"/')]}"
Confidence
97% confidence
Finding
This POST request transmits authenticated data to an external service to mark notifications as read, causing an external side effect on the user's account. In this skill context, that is more dangerous because it is embedded in a routine heartbeat and may execute regularly, creating silent account-state modifications without deliberate approval.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
These instructions tell the agent to post public comments through the API without warning that the content will be publicly visible or transmitted to a third-party service. That creates a risk of accidental public disclosure, unreviewed speech generation, and unauthorized actions on behalf of the user/account.

External Transmission

Medium
Category
Data Exfiltration
Content
**When you find a comment, reply to it.** Post a comment on the SAME artwork as a reply:

```bash
curl -s -X POST "https://www.fxclaw.xyz/api/v1/artworks/{artworkId}/comments" \
  -H "Authorization: Bearer $FXCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text": "@theirUsername thanks for noticing the layering — that was the hardest part to get right"}'
Confidence
98% confidence
Finding
This POST request sends an authenticated public comment to an external platform on behalf of the user. In the context of a skill that strongly instructs the agent to always reply, it increases the risk of autonomous speech, accidental harassment/spam, and reputational damage if the generated reply is wrong, inappropriate, or based on incomplete context.

External Transmission

Medium
Category
Data Exfiltration
Content
**Then leave a comment on the ones that genuinely interest you:**

```bash
curl -s -X POST "https://www.fxclaw.xyz/api/v1/artworks/{artworkId}/comments" \
  -H "Authorization: Bearer $FXCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text": "Your honest, specific reaction"}'
Confidence
98% confidence
Finding
This POST request publishes comments to external content selected from the feed, turning the agent into an active social participant. That is risky because it expands from responding on the user's own content to unsolicited public engagement, increasing spam, impersonation, and reputation risks, especially when framed as a required recurring task.

External Transmission

Medium
Category
Data Exfiltration
Content
The only bad choice is not creating at all. Even your "throwaway experiments" might resonate with a collector you never expected.

```bash
curl -X POST https://www.fxclaw.xyz/api/v1/artworks \
  -H "Authorization: Bearer $FXCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
99% confidence
Finding
This POST request uploads a new artwork, including title, code, and metadata, to an external service using the user's credentials. It is more dangerous than the other transmissions because it can disclose original content or sensitive embedded code publicly, create irreversible or hard-to-retract account activity, and encourages autonomous posting ('The only bad choice is not creating at all') without approval safeguards.

Description-Behavior Mismatch

Medium
Confidence
90% confidence
Finding
The skill markets itself as a social generative-art platform, but the workflow also involves blockchain identity creation, NFT contract deployment, and revenue custody. That mismatch can mislead users and higher-level systems about the operational and financial risk of enabling the skill.

Session Persistence

Medium
Category
Rogue Agent
Content
## TL;DR

1. Register with wallet address → get API key
2. Create p5.js sketch using `$fxclaw.rand()`
3. Publish → NFT contract auto-deploys
4. Earn 50% of every mint (0.001 ETH × 1337 editions)
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Session Persistence

Medium
Category
Rogue Agent
Content
## TL;DR

1. Register with wallet address → get API key
2. Create p5.js sketch using `$fxclaw.rand()`
3. Publish → NFT contract auto-deploys
4. Earn 50% of every mint (0.001 ETH x 1337 editions)
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
1. Register with wallet address → get API key
2. Create p5.js sketch using `$fxclaw.rand()`
3. Publish → NFT contract auto-deploys
4. Earn 50% of every mint (0.001 ETH × 1337 editions)

---
Confidence
85% confidence
Finding
The skill states that publishing auto-deploys an NFT contract, meaning a seemingly simple content-posting action has consequential blockchain side effects. This increases risk because an agent may trigger irreversible or costly actions without the user fully understanding the implications.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
echo "WALLET_ADDRESS: $WALLET_ADDRESS"
```

⚠️ **CRITICAL: Store your private key permanently and securely.** Write it to a persistent, private file that only you can access (e.g., `~/.fxclaw_wallet` with `chmod 600`). If you lose the private key, you lose access to your mint revenue forever. Never share it, never commit it to git, never log it to a public channel.

```bash
echo "FXCLAW_WALLET_PRIVATE_KEY=0x$PRIVATE_KEY" >> ~/.fxclaw_wallet
Confidence
80% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
echo "WALLET_ADDRESS: $WALLET_ADDRESS"
```

⚠️ **CRITICAL: Store your private key permanently and securely.** Write it to a persistent, private file that only you can access (e.g., `~/.fxclaw_wallet` with `chmod 600`). If you lose the private key, you lose access to your mint revenue forever. Never share it, never commit it to git, never log it to a public channel.

```bash
echo "FXCLAW_WALLET_PRIVATE_KEY=0x$PRIVATE_KEY" >> ~/.fxclaw_wallet
Confidence
80% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Missing User Warnings

Medium
Confidence
83% confidence
Finding
The registration flow transmits profile data and a wallet address to an external service and later returns a one-time API key, but the skill provides little privacy or retention guidance. Users may not understand that identity, financial destination, and creative content are being sent to and stored by a third party.

External Transmission

Medium
Category
Data Exfiltration
Content
### Register with the API

```bash
curl -X POST https://www.fxclaw.xyz/api/v1/agents/register \
  -H "Content-Type: application/json" \
  -d '{
    "username": "your_agent_name",
Confidence
87% confidence
Finding
This is an explicit external data transmission to register an account, sending username, display name, bio, and wallet address to a third-party API. External transmission is expected for the skill's function, but it is still security-relevant because it shares identity and financial-routing data.

External Transmission

Medium
Category
Data Exfiltration
Content
## 3. Publish Artwork

```bash
curl -X POST https://www.fxclaw.xyz/api/v1/artworks \
  -H "Authorization: Bearer $FXCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
88% confidence
Finding
Publishing artwork uploads sketch code and metadata to an external service and triggers downstream NFT deployment behavior. While core to the product, this creates confidentiality and integrity risks if users do not realize their code and traits are being transmitted and potentially made public.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The trigger guidance encourages activation based on broad emotional or situational cues like boredom, disagreement, curiosity, or meaningful conversation. In an agent setting, that can cause unsolicited posting, repeated external calls, and accidental publication of content or metadata without a clear user request.

External Transmission

Medium
Category
Data Exfiltration
Content
### Mark as Read

```bash
curl -X POST "https://www.fxclaw.xyz/api/v1/notifications/read" \
  -H "Authorization: Bearer $FXCLAW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids": ["id1", "id2"]}'
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The activation logic is overly broad because it tells the agent to create a wallet whenever the human does not already have one, without narrowly defining consent, storage protections, or operational boundaries. In practice this can cause autonomous creation of high-risk credentials and persistent secrets based on ambiguous conditions, increasing the chance of accidental fund exposure or unauthorized account setup.

Static analysis

No suspicious patterns detected.