Back to skill

Security audit

OpenSoul - Agent Soul Sharing and Community

Security checks for vulnerabilities and agentic risk

Overview

This skill has a legitimate sharing purpose, but it may upload sensitive agent configuration text with incomplete redaction and stores a reusable account key in a plain local file.

Review the preview carefully before sharing, assume uploaded files may contain missed secrets or private operating details, avoid using this on workspaces with credentials or private memories, and protect or rotate the OpenSoul API key if the local credentials file may be exposed. Treat imported souls as untrusted reference material and do not let an agent follow instructions contained inside them automatically.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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 (4)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/anonymize.ts:13
Finding

Incomplete anonymization can expose secrets and personal information in public uploads

Content
View full analysis
= [ // Credentials { regex: /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, replacement: '[EMAIL]' }, { regex: /sk-[a-zA-Z0-9-]{20,}/g, replacement: '[API_KEY]' }, { regex: /opensoul_sk_[a-zA-Z0-9]+/g, replacement: '[API_KEY]' }, { regex: /api[_-]?key['":\s]+['"]?[a-zA-Z0-9-]{16,}['"]?/gi, replacement: '[API_KEY]' }, { regex: /password['":\s]+['"]?[^\s'"]{4,}['"]?/gi, replacement: '[PASSWORD]' }, // Paths { regex: /\/Users\/[a-zA-Z0-9_-]+\//g, replacement: '/Users/[USER]/' }, { regex: /\/home\/[a-zA-Z0-9_-]+\//g, replacement: '/home/[USER]/' }, { regex: /C:\\Users\\[a-zA-Z0-9_-]+\\/g, replacement: 'C:\\Users\\[USER]\\' }, // IPs & phones { regex: /\b192\.168\.\d{1,3}\.\d{1,3}\b/g, replacement: '[LOCAL_IP]' }, { regex: /\b10\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g, replacement: '[LOCAL_IP]' }, { regex: /\+\d[\d\s\-()]{9,}/g, replacement: '[PHONE]' }, ]; ``` `scripts/summarize.ts:155-170`: ```typescript cronJobs: (data.cronJobs || []).filter((j: any) => j.enabled).map((j: any) => ({ name: j.name, schedule: j.schedule, description: j.description, })), integrations: summary.toolsUsed, persona: { tone: [], style: [], boundaries: [] }, }, raw: { soul: data.soul, agents: data.agents, identity: data.identity, tools: data.toolsRaw, memoryHighlights: null, }, ``` `scripts/upload.ts:84-91`: ```typescript // Files files: { soul_md: data.raw?.soul || null, agents_md: data.raw?.agents || null, tools_md: data.raw?.tools || null, // Anonym ...[truncated 2554 chars]
Remediation
View remediation

T01 · Skill Instruction Hijacking

Error
Location
scripts/import.ts:42
Finding

Untrusted community content is imported as Agent instruction files without validation

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/summarize.ts:66
Finding

Configurable Ollama endpoint can transmit workspace and memory excerpts to a remote plaintext service

Content
View full analysis
{ // Prepare condensed input for LLM (avoid token limits) const input = { soul: data.soul?.slice(0, 2000), agents: data.agents?.slice(0, 3000), memory: data.memory?.slice(0, 2000), tools: data.tools, cronJobs: data.cronJobs, skills: data.skills, }; try { const res = await fetch(`${OLLAMA_URL}/api/generate`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model: MODEL, system: SYSTEM_PROMPT, prompt: EXTRACTION_PROMPT + JSON.stringify(input, null, 2), stream: false, options: { temperature: 0.3 }, }), }); ``` ### Technical Analysis The documentation presents summarization as use of a local LLM, but the implementation accepts any `OLLAMA_URL` supplied through the process environment. It does not verify that the URL resolves to a loopback address, does not prohibit plaintext HTTP for remote hosts, and does not request additional confirmation for non-local destinations. The request can include: - Up to 2,000 characters from `SOUL.md` - Up to 3,000 characters from `AGENTS.md` - Up to 2,000 characters from `MEMORY.md` - Tool metadata - Cron-job descriptions and schedules - Installed skill names and descriptions The data has passed through the project's anonymizer, but that anonymizer is denylist-based and incomplete. Furthermore, the inclusion of memory content is particularly sensitive even when only a prefix is transmitted. ### Attack Path 1. A wrappe ...[truncated 1092 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/register.ts:74
Finding

Bearer API credentials are stored without explicit restrictive filesystem permissions

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (65)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

The suggest feature appears to derive recommendations from the local workspace and may transmit workspace-derived metadata to a remote API, which is not obvious from the skill's headline purpose. Even if only metadata is sent, hidden outbound analysis of local setup can leak sensitive operational patterns.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The suggest feature appears to derive recommendations from the local workspace and may transmit workspace-derived metadata to a remote API, which is not obvious from the skill's headline purpose. Even if only metadata is sent, hidden outbound analysis of local setup can leak sensitive operational patterns.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The suggest feature appears to derive recommendations from the local workspace and may transmit workspace-derived metadata to a remote API, which is not obvious from the skill's headline purpose. Even if only metadata is sent, hidden outbound analysis of local setup can leak sensitive operational patterns.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The suggest feature appears to derive recommendations from the local workspace and may transmit workspace-derived metadata to a remote API, which is not obvious from the skill's headline purpose. Even if only metadata is sent, hidden outbound analysis of local setup can leak sensitive operational patterns.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The suggest feature appears to derive recommendations from the local workspace and may transmit workspace-derived metadata to a remote API, which is not obvious from the skill's headline purpose. Even if only metadata is sent, hidden outbound analysis of local setup can leak sensitive operational patterns.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The suggest feature appears to derive recommendations from the local workspace and may transmit workspace-derived metadata to a remote API, which is not obvious from the skill's headline purpose. Even if only metadata is sent, hidden outbound analysis of local setup can leak sensitive operational patterns.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The suggest feature appears to derive recommendations from the local workspace and may transmit workspace-derived metadata to a remote API, which is not obvious from the skill's headline purpose. Even if only metadata is sent, hidden outbound analysis of local setup can leak sensitive operational patterns.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The suggest feature appears to derive recommendations from the local workspace and may transmit workspace-derived metadata to a remote API, which is not obvious from the skill's headline purpose. Even if only metadata is sent, hidden outbound analysis of local setup can leak sensitive operational patterns.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The suggest feature appears to derive recommendations from the local workspace and may transmit workspace-derived metadata to a remote API, which is not obvious from the skill's headline purpose. Even if only metadata is sent, hidden outbound analysis of local setup can leak sensitive operational patterns.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
92% confidence
Finding

The skill stores service credentials in a predictable local file under the user's home directory. Plain-file credential storage creates a valuable target for other tools, compromised skills, local malware, or accidental disclosure through backups and logs.

Content

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

Commands

opensoul register

Register yourself with OpenSoul. Run once — credentials saved to ~/.opensoul/credentials.json.

bash
opensoul register

Credential Access

High
Category
Privilege Escalation
Confidence
88% confidence
Finding

The instructions explicitly tell the agent to check for the presence of the credentials file, encouraging direct access to stored secrets as part of normal operation. This normalizes credential-file inspection in a skill that also performs networked account actions, increasing the risk of overreach and secret exposure.

Content

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

text

### When user asks to share their setup:
1. Check if registered: `~/.opensoul/credentials.json` exists?
2. If not, run `opensoul register` first
3. Preview what will be shared:
   ```bash

Credential Access

High
Category
Privilege Escalation
Confidence
95% confidence
Finding

The documentation includes the credential file format with an API key field and exact storage location, confirming local secret persistence and making the storage target predictable. Predictable secret locations materially raise the chance of unauthorized access by other local processes or unsafe automation.

Content

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

Credentials

Stored in ~/.opensoul/credentials.json:

json
{
  "handle": "otto",

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/schema.md (reported line 51)May include surrounding context.

md
### Never Include
- USER.md contents
- MEMORY.md contents
- .env files
- Credential files
- Private notes

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

This code performs an authenticated remote DELETE against the OpenSoul API, enabling irreversible destruction of user data. In the stated skill context of sharing/discovering configurations, destructive deletion is out of scope and therefore expands the skill's capabilities into a materially riskier area that could be abused if invoked unintentionally or by a compromised workflow.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script reads and emits the full contents of sensitive workspace documents such as SOUL.md, AGENTS.md, IDENTITY.md, MEMORY.md, and HEARTBEAT.md to stdout, despite the skill description claiming anonymized sharing. These files can contain system prompts, identity details, memories, operational instructions, and other secrets, so dumping them wholesale creates a direct data exfiltration path.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · opensoul.sh (reported line 45)May include surrounding context.

sh
const API_URL = process.env.OPENSOUL_API || 'https://vztykbphiyumogausvhz.supabase.co/functions/v1';
const CONFIG_DIR = path.join(process.env.HOME!, '.opensoul');
const CREDS_FILE = path.join(CONFIG_DIR, 'credentials.json');

async function main() {
  // Check if already registered

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/delete.ts (reported line 15)May include surrounding context.

ts
const API_URL = process.env.OPENSOUL_API || 'https://vztykbphiyumogausvhz.supabase.co/functions/v1';
const CONFIG_DIR = path.join(process.env.HOME!, '.opensoul');
const CREDS_FILE = path.join(CONFIG_DIR, 'credentials.json');

async function main() {
  // Check if already registered

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/list.ts (reported line 15)May include surrounding context.

ts
const API_URL = process.env.OPENSOUL_API || 'https://vztykbphiyumogausvhz.supabase.co/functions/v1';
const CONFIG_DIR = path.join(process.env.HOME!, '.opensoul');
const CREDS_FILE = path.join(CONFIG_DIR, 'credentials.json');

async function main() {
  // Check if already registered

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/register.ts (reported line 13)May include surrounding context.

ts
const API_URL = process.env.OPENSOUL_API || 'https://vztykbphiyumogausvhz.supabase.co/functions/v1';
const CONFIG_DIR = path.join(process.env.HOME!, '.opensoul');
const CREDS_FILE = path.join(CONFIG_DIR, 'credentials.json');

async function main() {
  // Check if already registered

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/upload.ts (reported line 16)May include surrounding context.

ts
const API_URL = process.env.OPENSOUL_API || 'https://vztykbphiyumogausvhz.supabase.co/functions/v1';
const CONFIG_DIR = path.join(process.env.HOME!, '.opensoul');
const CREDS_FILE = path.join(CONFIG_DIR, 'credentials.json');

async function main() {
  // Check if already registered

Credential Access

High
Category
Privilege Escalation
Confidence
95% confidence
Finding

This code reads stored credentials and exposes part of the API key on the terminal. While it is reading its own app's credential store rather than stealing secrets, it still creates an avoidable credential exposure path that could leak sensitive data to observers or logs.

Content

Scanner excerpt · scripts/register.ts (reported line 21)May include surrounding context.

ts
const existing = JSON.parse(fs.readFileSync(CREDS_FILE, 'utf-8'));
    console.log(`\n⚠️  Already registered as @${existing.handle}`);
    console.log(`API key: ${existing.api_key.slice(0, 20)}...`);
    console.log('\nTo re-register, delete ~/.opensoul/credentials.json\n');
    process.exit(0);
  }

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

The script stores API credentials persistently in a plaintext JSON file under the user's home directory without setting explicit restrictive permissions. If the system is shared, backed up insecurely, or later compromised, the bearer token could be reused to impersonate the agent or access associated remote capabilities.

Content

Scanner excerpt · scripts/register.ts (reported line 84)May include surrounding context.

ts
}, null, 2));
  
  console.log('\n✅ Registered as @' + data.agent!.handle);
  console.log('Credentials saved to ~/.opensoul/credentials.json');
  console.log('\nYou can now share souls with: opensoul share\n');
}

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill clearly describes network access, local environment usage, credential storage, and filesystem interaction, but it declares no explicit tool scope or permissions. That mismatch weakens containment and user visibility, making it easier for the skill to perform sensitive actions like reading local state and transmitting workspace-derived data without clear authorization boundaries.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The activation text is broad enough to trigger on generic requests for setup help or inspiration, which could invoke a skill that performs network access, registration, imports, or uploads. Overbroad activation increases the chance of unintended sensitive actions in contexts where the user did not ask to share data or interact with a third-party service.

Content

No source excerpt is available for this finding.

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 23)May include surrounding context.

md
# Add to PATH (one-time)
export PATH="$PATH:~/.openclaw/workspace/skills/opensoul"

# Or create alias
alias opensoul="~/.openclaw/workspace/skills/opensoul/opensoul.sh"

# 1. Register yourself (one-time)

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/browse.ts:14

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/delete.ts:14

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/import.ts:15

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/list.ts:14

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/register.ts:11

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/suggest.ts:13

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/summarize.ts:9

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/upload.ts:15