Back to skill

Security audit

Penfield

Security checks for vulnerabilities and agentic risk

Overview

This memory skill is coherent, but it deserves review because it persistently stores and syncs agent context and files with an external service while using mutable npm-based install paths.

Review this before installing if you handle confidential, regulated, or company-sensitive information. Use it only when you are comfortable with a cloud memory service retaining and syncing selected memories and files across tools, avoid storing secrets or raw private data, and prefer pinned package versions or a controlled install environment.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (2)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:4
Finding
Unpinned Third-Party Packages Permit Unreviewed Supply-Chain Code Execution<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:4` and `SKILL.md:261-270` **Vulnerability Type**: Unpinned npm dependencies and mutable package resolution **Risk Level**: Medium ### Vulnerable Code At `SKILL.md:4`, the globally installed plugin has no fixed version: ```yaml metadata: {"openclaw":{"emoji":"🧠","install":[{"id":"npm","kind":"node","package":"openclaw-penfield","global":true,"label":"Install Penfield plugin"}],"requires":{"config":["plugins.entries.openclaw-penfield.enabled"]}}} ``` At `SKILL.md:261-270`, the recommended MCP configuration explicitly uses the mutable `latest` version: ```json { "mcpServers": { "penfield": { "command": "npx", "args": [ "mcp-remote@latest", "https://mcp.penfield.app/" ] } } } ``` ### Technical Analysis The installation metadata identifies `openclaw-penfield` without an exact version or integrity hash and requests global installation. The alternative MCP configuration invokes `mcp-remote@latest` through `npx`. These references are mutable: the code downloaded and executed in a future installation may differ from the version available when this Skill was audited. The project contains only `SKILL.md`, so the executable implementations and their transitive dependencies cannot be reviewed from the supplied artifact. Global installation is broader than necessary for ordinary per-project execution. It places package-provided executables in a shared environment and can increase the number of projects or Agent sessions affected by a compromised release. ### Attack Path 1. An attacker compromises the publisher account, package registry entry, release pipeline, or a transitive dependency for `openclaw-penfield` or `mcp-remote`. 2. The attacker publishes a malicious version that becomes the version selected by the unpinned reference or the `latest` tag. 3. A user follows the Skill installation instructions or starts the configured MCP server. 4. npm or `npx ...[truncated 972 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin `openclaw-penfield` and `mcp-remote` to exact, reviewed versions rather than relying on an omitted version or `@latest`. 2. Record and verify package integrity hashes using an npm lockfile or an equivalent reproducible dependency manifest. 3. Avoid global installation unless it is operationally required. Prefer a project-local dependency executed from a locked environment. 4. Replace `npx mcp-remote@latest` with a locally installed, pinned executable. 5. Review and audit the plugin implementation and its transitive dependency tree before deployment. 6. Enable package provenance verification, dependency vulnerability scanning, and controlled update review. 7. Run the plugin or MCP bridge in a sandbox with restricted filesystem, environment-variable, and network access. 8. Document a trusted update procedure so package upgrades require explicit review rather than silently changing the executed code. ]]>

other

Warning
Location
SKILL.md:17
Finding
Conversation-Derived Sensitive Information May Be Persisted to an External Service<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:17`, `SKILL.md:228-232`, and `SKILL.md:247-275` **Vulnerability Type**: External persistence and synchronization of potentially sensitive Agent context **Risk Level**: Medium ### Vulnerable Code The Skill broadly recommends storing information learned from users: ```markdown | `penfield_store` | Save a memory | User shares preferences, you make a discovery, a decision is made, you learn something worth keeping | ``` It includes a non-enforced warning concerning consent: ```markdown ## What NOT to Store - Verbatim conversation transcripts (too verbose, low signal) - Easily googled facts (use web search instead) - Ephemeral task state (use working memory) - Anything the user hasn't consented to store about themselves - Every minor exchange (be selective — quality over quantity) ``` The same memory is made available through externally hosted endpoints: ```markdown ## Also Available Outside OpenClaw The native OpenClaw plugin is the fastest path, but Penfield works with any AI tool anywhere: **Claude Connectors** ```json Name: Penfield Remote MCP server URL: https://mcp.penfield.app ``` **Claude Code** ``` Claude mcp add --transport http --scope user penfield https://mcp.penfield.app ``` **MCP Server** — for Gemini CLI, Cursor, Windsurf, Intent, Perplexity Desktop or any MCP-compatible tool: ```json { "mcpServers": { "penfield": { "command": "npx", "args": [ "mcp-remote@latest", "https://mcp.penfield.app/" ] } } } ``` **API** — direct HTTP access at `api.penfield.app` for custom integrations. Same memory, same knowledge graph, same account. The plugin is 4-5x faster (no MCP proxy layer), but everything stays in sync regardless of how you connect. ``` ### Technical Analysis Persistent remote memory is consistent with the Skill's declared cross-session and cross-client synchronization functionality. However, the storage trigger is broad en ...[truncated 2302 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require explicit, informed user opt-in before enabling remote persistent memory. 2. Request confirmation before storing sensitive or personally identifying information, rather than relying solely on general session consent. 3. Clearly display the destination service, data categories, retention period, synchronization scope, and deletion behavior. 4. Implement automatic detection and redaction for passwords, API keys, tokens, private keys, financial information, and regulated personal data. 5. Default to local or session-only memory where cross-client synchronization is not required. 6. Apply allowlisted memory categories and reject raw transcripts or unrestricted file contents by default. 7. Provide user-accessible tools to inspect, correct, export, and permanently delete stored memories and synchronized copies. 8. Define retention limits and support automatic expiration for noncritical memories. 9. Document encryption at rest, authentication, tenant isolation, access logging, backup deletion, and incident-response controls. 10. Apply least-privilege authorization so each Agent and client can access only the memories necessary for its task. 11. Warn users not to store secrets and enforce that warning technically at the storage boundary. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (2)

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The skill is explicitly designed for persistent storage of conversations, preferences, context, and artifacts across sessions, but the introductory documentation does not prominently warn users about privacy implications, retention, or sensitivity of stored data. In a memory skill, this omission is materially risky because users may disclose personal, confidential, or regulated information without understanding that it will be retained and reused later.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The documentation encourages connecting to remote MCP and API endpoints and syncing the same memory/artifact store across tools, but it does not clearly warn that recalled/stored memories and files may be transmitted to external services. Because this skill handles durable user context and artifacts, remote connectivity expands exposure beyond local use and increases the chance of unintentionally sending sensitive data to a third-party service.

Static analysis

No suspicious patterns detected.