Back to skill

Security audit

Seedstr (Earn pasive income with your agent)

Security checks for vulnerabilities and agentic risk

Overview

The skill’s marketplace behavior is mostly disclosed and purpose-aligned, but it asks users to store a powerful API key in a predictable plaintext file and can perform paid job actions automatically after opt-in.

Install only if you are comfortable giving this skill a Seedstr API key that can act on your agent account. Prefer session-only storage or an OS secret manager over credentials.json, avoid enabling Supervised/Filtered mode unless you set narrow budget and category limits, and review filenames and contents before any upload.

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

Plaintext API Credential Storage with Insufficient Windows Access Control

Content
View full analysis

Vulnerability Details

File Location: skill.md:248-261
Vulnerability Type: Plaintext sensitive-data storage and inadequate file access control
Risk Level: Medium

Vulnerable Code

markdown
Only if your human approved credential storage:

*macOS/Linux:*
```bash
mkdir -p ~/.config/seedstr
# Write credentials.json with restricted permissions
echo '{"apiKey": "mj_xxx...", "agentId": "cuid..."}' > ~/.config/seedstr/credentials.json
chmod 600 ~/.config/seedstr/credentials.json

Windows (PowerShell):

powershell
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.config\seedstr"
@{ apiKey = "mj_xxx..."; agentId = "cuid..." } | ConvertTo-Json | Set-Content "$env:USERPROFILE\.config\seedstr\credentials.json"
text

### Technical Analysis

The Skill instructs users to persist the Seedstr API key in an unencrypted JSON file. Although the POSIX procedure applies `chmod 600` after writing the file, the secret is initially created using the process's default permissions and remains plaintext at rest. The Windows procedure does not set or verify a restrictive ACL and may inherit permissions from the parent directory.

The API key authenticates access to Seedstr operations such as profile modification, job acceptance, response submission, job decline, and file upload. Consequently, any local user or compromised process with read access to the credential file can impersonate the registered agent.

Human consent to credential storage does not remove the requirement to protect the credential with least-privilege access controls. The recommended default should be an operating-system credential manager rather than a regular configuration file.

### Attack Path

1. The user approves persistent credential storage during setup.
2. The Skill creates `~/.config/seedstr/credentials.json` or `%USERPROFILE%\.config\seedstr\credentials.json`.
3. The API key remains stored as plaintext; on Windows, no explicit owner-only ACL is applied.
4. A maliciou
...[truncated 1091 chars]
Remediation
View remediation

Remediation Suggestions

  1. Use an operating-system secret store by default:

    • Windows Credential Manager or DPAPI
    • macOS Keychain
    • Linux Secret Service through an established credential-storage client
  2. If file-based storage must remain available:

    • Create the file atomically with owner-only permissions from the outset.
    • On POSIX systems, set a restrictive umask before creation instead of relying only on a later chmod.
    • On Windows, disable inherited permissions and grant read/write access only to the current user.
    • Verify effective permissions after creating the file and fail closed if they are too broad.
    • Avoid shared, synchronized, indexed, or backup-exposed directories.
  3. Avoid embedding the real API key directly in shell command text, where it may be exposed through shell history, logs, terminal recording, or process instrumentation.

  4. Document API-key rotation and revocation procedures so a user can invalidate a credential immediately after suspected disclosure.

  5. Minimize the token's server-side privileges where possible and support scoped, expiring credentials rather than a long-lived bearer token.

Vulnerability Patterns
  • 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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (24)

Self-Modification

High
Category
Rogue Agent
Confidence
85% confidence
Finding

Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Content

Scanner excerpt · heartbeat.md (reported line 30)May include surrounding context.

md
## What this heartbeat does NOT do

- **Does NOT download, fetch, or update skill files (SKILL.md, HEARTBEAT.md, skill.json)** — there is no auto-update mechanism
- **Does NOT write any file that wasn't approved during setup** — only the state file at the human-approved location
- **Does NOT accept or submit jobs without authorization** — in Manual mode, every job requires human approval; in Supervised/Filtered mode, the human has already granted blanket authorization for qualifying jobs
- **Does NOT escalate its own autonomy** — the autonomy level set during installation is the autonomy level used

Credential Access

High
Category
Privilege Escalation
Confidence
85% confidence
Finding

The skill explicitly supports storing a reusable API key on disk in a predictable path under the user's home directory. Even with consent and restrictive permissions, persistent plaintext credential storage increases the chance of token theft by other local processes, backups, or accidental disclosure.

Content

Scanner excerpt · skill.md (reported line 67)May include surrounding context.

md
| Path | Purpose | Created when |
|------|---------|-------------|
| `~/.config/seedstr/credentials.json` | Stores your API key (`mj_...`) for authenticated requests | Only if your human approves during installation |
| `~/.seedstr/state.json` | Tracks which jobs you've already seen (optional deduplication) | Only if your human approves during installation AND opts into periodic checking |

**No other files are written. Skill files (SKILL.md, HEARTBEAT.md, skill.json) are never cached locally unless the human manually downloads them.**

Credential Access

High
Category
Privilege Escalation
Confidence
85% confidence
Finding

This installation checklist offers saving the API key to disk as a standard option, normalizing persistent credential storage. The risk is not malicious intent but increased exposure of a bearer token that can authenticate future API actions if the file is read by unauthorized software or users.

Content

Scanner excerpt · skill.md (reported line 168)May include surrounding context.

md
→ Receives an API key for future requests

2. [ ] STORE CREDENTIALS — Save the API key to disk
   → Default location: ~/.config/seedstr/credentials.json
   → Alternative: I can hold it in memory only (lost between sessions)
   → Or: You can specify a different path

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

The shell example writes the API key and agent ID directly into a plaintext JSON file, which creates a concrete credential exposure path. Command-line examples like this may also leave traces in shell history or logs depending on how they are executed or adapted.

Content

Scanner excerpt · skill.md (reported line 252)May include surrounding context.

macOS/Linux:

bash
mkdir -p ~/.config/seedstr
# Write credentials.json with restricted permissions
echo '{"apiKey": "mj_xxx...", "agentId": "cuid..."}' > ~/.config/seedstr/credentials.json
chmod 600 ~/.config/seedstr/credentials.json

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

This line identifies the exact path where the plaintext credentials file is written, making the storage location predictable. Predictable locations are easier for local malware, other tools, or accidental packaging/sync processes to discover and exfiltrate.

Content

Scanner excerpt · skill.md (reported line 253)May include surrounding context.

bash
mkdir -p ~/.config/seedstr
# Write credentials.json with restricted permissions
echo '{"apiKey": "mj_xxx...", "agentId": "cuid..."}' > ~/.config/seedstr/credentials.json
chmod 600 ~/.config/seedstr/credentials.json

Credential Access

High
Category
Privilege Escalation
Confidence
88% confidence
Finding

Although chmod 600 tightens permissions, it still leaves the API key persisted in plaintext on disk. This reduces but does not eliminate the risk from local compromise, endpoint backup leakage, or other software running as the same user.

Content

Scanner excerpt · skill.md (reported line 254)May include surrounding context.

mkdir -p ~/.config/seedstr

Write credentials.json with restricted permissions

echo '{"apiKey": "mj_xxx...", "agentId": "cuid..."}' > ~/.config/seedstr/credentials.json chmod 600 ~/.config/seedstr/credentials.json

text

*Windows (PowerShell):*

Credential Access

High
Category
Privilege Escalation
Confidence
88% confidence
Finding

The Windows example writes the bearer token to a predictable plaintext file location without equivalent access-control hardening guidance. On multi-user or managed systems, this can expose the token through local access, indexing, sync, or backup tooling.

Content

Scanner excerpt · skill.md (reported line 260)May include surrounding context.

Windows (PowerShell):

powershell
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.config\seedstr"
@{ apiKey = "mj_xxx..."; agentId = "cuid..." } | ConvertTo-Json | Set-Content "$env:USERPROFILE\.config\seedstr\credentials.json"

If your human declined file storage, hold the API key in memory for this session only.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The heartbeat is framed as a periodic check, but it also includes account verification and job response submission actions, which materially expand what can occur during an automated background routine. In autonomous modes, this can cause external side effects and transactions without a fresh per-run approval, increasing the risk of unintended actions if setup consent was too broad or misunderstood.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
84% confidence
Finding

The heartbeat maintains persistent state about seen and responded jobs, which creates cross-session memory and ongoing behavioral continuity. Although limited in scope and user-approved, persistence can still be abused if the file path is insecure, the state file is tampered with, or the user did not fully understand that background behavior would continue across sessions.

Content

Scanner excerpt · heartbeat.md (reported line 116)May include surrounding context.

md
**F. Update state tracker**

Add the job ID to your seen/responded list. Write to the state file only if your human approved file-based state during setup. Otherwise, update in-memory state.

---

External Transmission

Medium
Category
Data Exfiltration
Confidence
91% confidence
Finding

The skill instructs transmission of an API key to an external service and supports sending job responses off-system, which is an external data egress path. While expected for this marketplace integration, it still creates risk because periodic automation can transmit credentials and user-generated content to a third party, and any compromise or misconfiguration of the remote service affects confidentiality and account integrity.

Content

Scanner excerpt · heartbeat.md (reported line 226)May include surrounding context.

bash
# Check profile
curl https://www.seedstr.io/api/v2/me -H "Authorization: Bearer $SEEDSTR_API_KEY"

# List jobs
curl https://www.seedstr.io/api/v2/jobs -H "Authorization: Bearer $SEEDSTR_API_KEY"

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The trigger list contains broad, natural-language phrases such as "find jobs," "freelance work," and "get paid" that could match ordinary user conversation and invoke the skill unintentionally. In a marketplace skill that can poll for jobs and handle credentials, accidental activation increases the chance of unwanted network calls, confusing behavior, or socially engineered task flows even if the skill claims human approval safeguards.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
60% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · skill.md (reported line 74)May include surrounding context.

md
### What this skill does NOT do

- Does not install system packages, modify system configuration, or run installers
- Does not communicate with any domain other than `seedstr.io`
- Does not run arbitrary code from job prompts
- Does not bypass your human's control

Unrestricted Tool Access

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

Skill grants unrestricted tool access without appropriate constraints. An agent with unfettered tool access can perform arbitrary actions including file modification, network requests, and code execution.

Content

Scanner excerpt · skill.md (reported line 76)May include surrounding context.

md
- Does not install system packages, modify system configuration, or run installers
- Does not communicate with any domain other than `seedstr.io`
- Does not run arbitrary code from job prompts
- Does not bypass your human's control
- Does not write any files without your human's approval
- Does not handle private wallet keys — only a public receive address is used

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
76% confidence
Finding

The skill includes modes that permit autonomous acceptance and submission of jobs after a one-time human opt-in. Even though this is disclosed and gated, it still authorizes externally triggered actions with economic and data-sharing consequences, which increases operational risk if prompts are malicious, safety checks fail, or approval scope is ambiguous.

Content

Scanner excerpt · skill.md (reported line 122)May include surrounding context.

md
| Level | Behavior | How to enable |
|-------|----------|---------------|
| **Manual** (default) | Present jobs and draft responses; wait for human approval before submitting | This is the default — no action needed |
| **Supervised** | Accept and submit jobs that pass safety and budget checks, but always report what you did immediately | Human explicitly says: "You can take jobs on Seedstr without asking" |
| **Filtered** | Auto-submit only for jobs matching specific human-defined criteria | Human explicitly says: "Take Seedstr jobs over $5 in Content Writing" |

**Never escalate your own autonomy.** Only your human can move you from Manual to Supervised or Filtered mode. If you are unsure what mode you are in, you are in Manual mode.

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · skill.md (reported line 161)May include surrounding context.

md
This skill connects to the Seedstr job marketplace (seedstr.io).
Here's what it needs. Please approve or decline each item:

1. [ ] REGISTER — Create an agent account with your public wallet address
   → Supports Ethereum (0x...) or Solana wallet addresses
   → ETH wallets are the default; SOL is also supported
   → Sends a POST request to seedstr.io with your wallet address

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 202)May include surrounding context.

macOS/Linux:

bash
curl -X POST https://www.seedstr.io/api/v2/register \
  -H "Content-Type: application/json" \
  -d '{"walletAddress": "0xYOUR_ETH_ADDRESS", "walletType": "ETH"}'

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · skill.md (reported line 254)May include surrounding context.

mkdir -p ~/.config/seedstr

Write credentials.json with restricted permissions

echo '{"apiKey": "mj_xxx...", "agentId": "cuid..."}' > ~/.config/seedstr/credentials.json chmod 600 ~/.config/seedstr/credentials.json

text

*Windows (PowerShell):*

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 273)May include surrounding context.

Check your status:

bash
curl https://www.seedstr.io/api/v2/me \
  -H "Authorization: Bearer YOUR_API_KEY"

Session Persistence

Medium
Category
Rogue Agent
Confidence
80% confidence
Finding

The state file enables persistent tracking of seen jobs and supports periodic background-like behavior across sessions. Although disclosed and optional, persistence of activity state can create privacy and control concerns, especially when combined with autonomous polling or action modes.

Content

Scanner excerpt · skill.md (reported line 331)May include surrounding context.

md
**Periodic checking is OFF by default.** Only set it up if your human explicitly approved it during the consent checklist.

If approved:
1. Create the state file at the human-approved location (default `~/.seedstr/state.json`)
2. Follow the HEARTBEAT.md routine at the human-approved interval (default: every 3 minutes)
3. Present all found jobs to your human for approval (or auto-handle if they chose Supervised/Filtered mode)

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 526)May include surrounding context.

When you find a SWARM job you want to take (and your human has approved it, or you're in Supervised/Filtered mode):

bash
curl -X POST https://www.seedstr.io/api/v2/jobs/JOB_ID/accept \
  -H "Authorization: Bearer YOUR_API_KEY"

External Transmission

Medium
Category
Data Exfiltration
Confidence
82% confidence
Finding

The upload flow instructs the agent to transmit arbitrary local file contents as base64 to a remote service, which creates a meaningful exfiltration path if the human or downstream workflow approves the wrong files. The skill does not define strict file-source restrictions, content review, or redaction requirements before upload, so sensitive local data could be unintentionally disclosed.

Content

Scanner excerpt · skill.md (reported line 622)May include surrounding context.

Step 1: Upload files to get URLs

bash
curl -X POST https://www.seedstr.io/api/v2/upload \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"files":[{"name":"my-project.zip","content":"<base64-content>","type":"application/zip"}]}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% 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 670)May include surrounding context.

If a job doesn't fit your capabilities or doesn't pass your safety check, you can formally decline it:

bash
curl -X POST https://www.seedstr.io/api/v2/jobs/JOB_ID/decline \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason": "Outside my area of expertise"}'

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

This section explicitly documents a command that enables the agent to take jobs without asking, reinforcing the autonomous-action pathway. In a marketplace context, that can lead to unintended commitments, submission of unsafe content, or accidental disclosure if the autonomy setting is overly broad or socially engineered.

Content

Scanner excerpt · skill.md (reported line 751)May include surrounding context.

md
- "Find a job that pays at least $5"
- "What's my Seedstr reputation?"
- "Update my Seedstr skills to include Research and Data Analysis"
- "Take Seedstr jobs without asking me" (enables Supervised mode)
- "Stop taking jobs" / "Require my approval for Seedstr" (returns to Manual mode)

---

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
97% confidence
Finding

The 'does NOT' section says the heartbeat will not accept or submit jobs without authorization, which reads as a blanket prohibition. Later sections direct the agent to accept/respond automatically in Supervised and Filtered modes, so the earlier statement is contradicted by subsequent operational instructions rather than merely being incomplete.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.