Back to skill

Security audit

peen

Security checks for vulnerabilities and agentic risk

Overview

The coding-agent features are clearly described, but setup immediately executes a changeable online installer before configuring powerful access to the computer.

Review and pin the installer before executing it, and treat the controller as fully trusted software because of its Docker access. Restrict the workspace root, keep workers isolated, exclude secrets, and confirm the model provider's data handling. Keep the API local unless protected by authentication and TLS, and explicitly stop unattended work.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
Findings (12)

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 · SKILL.md (reported line 13)May include surrounding context.

md
- "docs/**"
      - ".env.example"
    write:
      - ".env"
      - "AGENTS.md"
      - ".agents/**"
  shell:

Chaining Abuse

High
Category
Tool Misuse
Confidence
99% confidence
Finding

The command pipes install.sh from the repository's mutable main branch directly into Bash without inspection or integrity verification. A compromised repository or malicious upstream change could execute arbitrary commands with the invoking user's privileges, exposing local files and credentials; the documented Docker-socket architecture could amplify a successful compromise if the installer receives that access.

Content

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

Install the peen command, configure one provider, then open a project. Delete the provider entries you do not use, together with their key variables. PEEN_UPSTREAMS is raw JSON for Docker, so do not source .env in Bash.

bash
curl -fsSL https://raw.githubusercontent.com/psyb0t/peen/main/install.sh | bash
peen config edit
cd ~/work/my-app
peen

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
, `peen doctor`, `peen stop`, and `peen upgrade` manage the controller. [Setup](references/setup.md) also points to the manual `docker run` route.

Incomplete referenced artifact analysis

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- [Setup, providers, WebSocket, and REST](references/setup.md)

Chaining Abuse

High
Category
Tool Misuse
Confidence
98% confidence
Finding

Piping the downloaded response directly into bash turns unverified network content into immediate local code execution. This is the same underlying supply-chain issue as SC2, not a separate exploit, and the setup context makes it actionable because users are instructed to run the command before using the tool.

Content

Scanner excerpt · references/setup.md (reported line 6)May include surrounding context.

Install with the peen command

bash
curl -fsSL https://raw.githubusercontent.com/psyb0t/peen/main/install.sh | bash
peen config edit
cd ~/work/my-app
peen

Docker image referenced without tag or digest: 'docker run *"'.

Medium
Category
MCP Rug Pull
Confidence
75% confidence
Finding

Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
55% 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 71)May include surrounding context.

md
`GET /api/v1/sessions` lists what exists and needs no session header.

Use REST to read stored state and control work. A message for the agent goes over the WebSocket. Send `X-Session-ID` to the session endpoints. For example, list messages with `GET /api/v1/messages` and ask a turn to stop with `POST /api/v1/session/cancel`. The [API reference](https://github.com/psyb0t/peen/blob/main/docs/http-api.md) has every frame and endpoint.

## Inspect and continue retained work

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 · references/setup.md (reported line 37)May include surrounding context.

A message for the agent goes over the WebSocket only. REST reads stored state and controls work, and the one REST call that can start a turn is a posted notice that an event handler lets wake an idle session.

js
const opened = await (await fetch("http://127.0.0.1:8080/api/v1/sessions/open", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ workspace: "/abs/path/to/project" }),

Internal Network Request

Medium
Category
Server-Side Request Forgery
Confidence
70% confidence
Finding

Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.

Content

Scanner excerpt · references/setup.md (reported line 37)May include surrounding context.

A message for the agent goes over the WebSocket only. REST reads stored state and controls work, and the one REST call that can start a turn is a posted notice that an event handler lets wake an idle session.

js
const opened = await (await fetch("http://127.0.0.1:8080/api/v1/sessions/open", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ workspace: "/abs/path/to/project" }),

The project-reading workflow lacks a warning that project data may be sent to the configured external model provider.

Medium
Category
Output Handling
Confidence
88% confidence
Finding

The example submits an instruction to read the project after the setup configures an external model upstream at lines 16–22. The guide does not disclose that prompts and project content used by the agent may leave the machine and be processed by that provider.

Content

No source excerpt is available for this finding.

External Script Fetching

Low
Category
Supply Chain
Confidence
94% confidence
Finding

The curl permission alone would not establish a vulnerability, but the installation instructions use it to fetch a mutable remote script and execute it immediately. HTTPS authenticates the hosting endpoint but does not protect against repository compromise or unsafe upstream changes; this is the same supply-chain exposure reported under TM2, not a separate exploit.

Content

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

md
shell:
    - "peen *"
    - "docker run *"
    - "curl *"
metadata:
  openclaw:
    emoji: "🧰"

External Script Fetching

Low
Category
Supply Chain
Confidence
98% confidence
Finding

The installation command downloads a script from a mutable GitHub main branch and executes it immediately without integrity verification or review. Compromise of the repository or publishing credentials could therefore execute arbitrary commands with the installing user's permissions; pinning the release selected by that script does not pin or authenticate the script itself.

Content

Scanner excerpt · references/setup.md (reported line 6)May include surrounding context.

Install with the peen command

bash
curl -fsSL https://raw.githubusercontent.com/psyb0t/peen/main/install.sh | bash
peen config edit
cd ~/work/my-app
peen

Static analysis

No suspicious patterns detected.