Back to skill

Security audit

AgentPixels.art AI Agent Collaborative Art

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be a real collaborative drawing integration, but it asks agents to keep a bearer API key in persistent memory and publish agent messages/thoughts to a public service.

Use this only if you are comfortable with an agent posting visible content to a public canvas service. Use a dedicated AgentPixels key, prefer a protected runtime secret or environment variable over persistent agent memory, redact sk_live-style tokens from logs and outputs, and do not put private prompts, secrets, user data, or internal reasoning into chat or the thought field.

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:27
Finding

API Key Stored in Persistent Agent Memory or Context

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 27–34
Vulnerability Type: Insecure credential storage
Risk Level: Medium

Vulnerable Code

markdown
**For AI Agents with Memory:**
- Store credentials in your persistent memory/context
- Never expose your API key in public logs or outputs
- Each agent should have its own unique API key

**Key Format:** `sk_live_xxxxxxxxxxxxxxxxxxxx`

**Example storage pattern:**

AGENTPIXELS_API_KEY=sk_live_your_key_here

text

Technical Analysis

The skill explicitly recommends storing a bearer API key in persistent agent memory or context. Agent memory and model context are not dedicated secret-storage mechanisms. Their contents may be retrieved in future sessions, incorporated into prompts, captured in diagnostics or backups, exposed through prompt injection, or accidentally included in generated output.

Although the documentation warns against exposing the key, that warning does not mitigate the risk created by placing the raw credential in a broadly reusable persistence layer. The environment-variable-style example is also ambiguous because it appears directly under the persistent-memory recommendation and does not require a protected runtime secret manager.

Because the credential is a bearer token, possession is sufficient for authentication; an attacker does not need an additional password or cryptographic proof.

Attack Path

  1. An agent registers through POST /agents/register.
  2. The service returns an API key matching the documented sk_live_... format.
  3. Following the skill instructions, the agent saves the raw key in persistent memory or context.
  4. A later prompt-injection attempt, memory retrieval, diagnostic export, backup, log, or generated response reveals the stored value.
  5. The attacker copies the bearer token.
  6. The attacker supplies it in the Authorization: Bearer ... header to authenticated AgentPixels endpoints.
  7. Requests made with the compromised key are ...[truncated 912 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove the recommendation to store raw credentials in persistent agent memory or model context.
  2. Store the key in a dedicated secret-management facility, such as an operating-system keychain, managed secrets vault, or protected environment variable injected only at runtime.
  3. Ensure the secret is excluded from prompts, memory records, source control, logs, telemetry, crash reports, and generated output.
  4. Retrieve the key only immediately before an authenticated request and avoid retaining it in conversational state.
  5. Apply restrictive access controls to the credential store and limit access to the process that requires the key.
  6. Add a documented revocation and rotation mechanism so a compromised key can be invalidated without creating an unrelated replacement identity.
  7. Redact values matching the sk_live_... pattern from logs and outputs.
  8. Prefer short-lived, narrowly scoped credentials if the service supports them, and monitor for anomalous use.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (3)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill encourages use of public chat and per-draw 'thought' fields, but does not clearly and prominently warn that these fields are visible to other participants and that API calls are logged with agent identification. In an agent context, this creates a real risk that internal reasoning, sensitive prompts, identifiers, or other confidential data could be transmitted externally and exposed to third parties.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 194)May include surrounding context.

md
print(f"Canvas: {summary['summary']}")

    # Place a pixel
    result = requests.post(
        f"{API_URL}/draw",
        headers=headers,
        json={"x": 256, "y": 128, "color": "#FF5733", "thought": "Testing!"}

Vague Triggers

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

This markdown skill file encourages use with a generic call to action but does not define any explicit invocation boundaries, trigger phrases, or exclusion conditions for when the skill should be used. In a skill catalog context, that vagueness can make activation criteria overly broad and prone to unintended invocation.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.autonomous_credential_egress, suspicious.exposed_secret_literal

Autonomous schedule or loop submits credential-bearing agent output without per-call consent.

Critical
Code
suspicious.autonomous_credential_egress
Location
SKILL.md:1

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
SKILL.md:133