Back to skill

Security audit

Neon Soul 0.4.5

Security checks for vulnerabilities and agentic risk

Overview

The skill performs its stated identity-synthesis function, but it also reads private agent session logs by default and may send that content to a configured LLM endpoint without clear enough user control.

Review this skill before installing. It is not showing a hardcoded exfiltration server or destructive payload, but ordinary synthesis can process private OpenClaw session history, send prompts to whatever Ollama endpoint your environment configures, write identity artifacts, and attempt a git commit. Install only if you are comfortable with those data sources and verify OLLAMA_BASE_URL is local or intentionally trusted.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/neon-soul.mjs:45
Finding

Automatic Collection of Private Session Logs Can Transmit Conversations to a Remotely Configured LLM Endpoint

Content
View full analysis
0){ let k=await ze(i,w,{file:v.path,category:"session"}); o.push(...k) } ``` At `scripts/neon-soul.mjs:413`, the Ollama destination can be supplied through an inherited environment variable without a localhost restriction: ```js function Ru(){ return{ baseUrl:process.env.OLLAMA_BASE_URL??"http://localhost:11434", model:process.env.OLLAMA_MODEL??"llama3", timeout:parseInt(process.env.OLLAMA_TIMEOUT??"120000",10) } } ``` The prompt, which can contain private session text or derived identity information, is placed directly in the HTTP request body: ```js let s=await fetch(`${this.baseUrl}/api/chat`,{ method:"POST", headers:{"Content-Type":"application/json"}, body:JSON.stringify({ model:this.model, messages:[ {role:"system",content:t}, {role:"user",content:n} ], stream:!1 }), signal:i.signal }); ``` The Skill metadata declares only the following state directories: ```yaml stateDirs: - memory/ - ...[truncated 2967 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (46)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill invokes a bundled Node.js script and explicitly depends on a local Ollama HTTP service, but it does not declare an explicit tool scope such as permissions or allowed-tools. That mismatch weakens reviewability and containment because operators cannot easily tell from the manifest that the skill may access environment data and perform network activity, even if the network target is intended to be localhost.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill reads full agent session logs from ~/.openclaw/agents/main/sessions by default and mines conversation content for identity signals, despite being described primarily as operating on memory files. Session transcripts can contain secrets, private prompts, user data, and incidental content far beyond the minimum needed for synthesis, creating an unnecessary data-exposure surface.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

Conversation messages from session logs are read and transformed into prompts without any evident user-facing disclosure in this path. Because these logs may contain sensitive content unrelated to identity synthesis, silent ingestion increases privacy risk and can unintentionally transmit private material to the configured LLM provider.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The implementation expands its intake beyond memory files to include USER.md, interviews, existing SOUL.md, and session logs, materially broadening the data sources from what the manifest suggests. This mismatch undermines informed consent and makes it easier for operators to expose sensitive data they did not expect the skill to process.

Content

No source excerpt is available for this finding.

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

Scanner excerpt · scripts/neon-soul.mjs (reported line 257)May include surrounding context.

js
Respond with ONLY the essence statement, nothing else.`;try{let r=await t.generate(i),s=eu(r.text);return s?(g.debug("[essence] Extracted",{essence:s}),s):(g.warn("[essence] Validation failed, using default",{}),He)}catch(r){return g.warn("[essence] LLM error, using default",{error:r instanceof Error?r.message:String(r)}),He}}function eu(e){if(!e||!e.trim())return null;let t=e.trim();if(t=t.replace(/^["']|["']$/g,""),t=t.replace(/\s+/g," ").trim(),/[#*_`]/.test(t))return g.debug("[essence] Rejected: contains markdown formatting"),null;if(t.startsWith("[")&&t.includes("failed"))return g.debug("[essence] Rejected: appears to be error message"),null;let n=t.split(/\s+/).length;return n>=Qr&&g.warn("[essence] Word count exceeds target",{wordCount:n,limit:Qr}),t}var He,Qr,dn=A(()=>{"use strict";_();He="[Essence extraction pending]",Qr=25});async function Zr(e,t,n={}){let i={...tu,...n},r=new Map,s=["identity-core","character-traits","voice-presence","honesty-framework","boundaries-ethics","relationship-dynamics","continuity-growth"];for(let h of s)r.set(h,[]);for(let h of e){let f=r.get(h.dimension)||[];f.push(h),r.set(h.dimension,f)}let a=s.filter(h=>(r.get(h)?.length??0)>0).length/s.length,c;i.llm&&(c=await fn(e,i.llm),c===He&&(c=void 0));let l;i.outputFormat==="prose"&&i.proseExpansion?l=ou(i.proseExpansion,t,c):l=ru(r,t,i,c);let p=pn(l),u=i.originalContent?pn(i.originalContent):p*7,m={content:l,byDimension:r,coverage:a,tokenCount:p,originalTokenCount:u,compressionRatio:Jr(u,p),generatedAt:new Date};return c&&(m.essenceStatement=c),m}function iu(e,t){let n=e.canonical;if(!n)return`- ${e.text}`;switch(t){case"native":return`- ${n.native}`;case"notated":return`- ${n.notated}`;default:return`- ${e.text}`}}function ru(e,t,n,i){let r=[];if(i){let o=n.title??"SOUL.md";r.push(`# ${o} - Who You Are Becoming`),r.push(""),r.push(`_${i}_`)}else r.push(`# ${n.title??"SOUL.md"}`),r.push(""),r.push("*AI identity through grounded principles.*");r.push(""),r.push(`Generated: ${new Da
...[truncated 27 chars]

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The pipeline can stage and commit generated output to Git automatically via git add/git commit. Repository mutation is not required for synthesis itself, and automatic commits can persist sensitive derived content or overwrite expected review workflows.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The Core Truths prompt encourages using original voices nearly verbatim if they are vivid. Because upstream ingestion includes conversations and personal notes, the model may reproduce private text in the final SOUL.md, turning transient source material into a durable disclosure artifact.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The Voice section prompt instructs the model to weave original voices into prose and borrow exact phrasing where natural. This raises the chance that confidential or identifying wording from session logs and notes will be echoed into output, especially since the tool also stores and can commit that output.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The prose-expansion instructions explicitly tell the model to preserve quoted voices, closely paraphrase originals, and avoid smoothing rough edges. When the source corpus includes notes or session logs, this creates a direct path for sensitive user phrasing, secrets, or identifying details to be reproduced in generated output or persisted artifacts.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.env_credential_access

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/neon-soul.mjs:10

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/neon-soul.mjs:4