Back to skill

Security audit

PaperPod

Security checks for vulnerabilities and agentic risk

Overview

PaperPod is a coherent remote sandbox/runtime skill, but it asks users to install a mutable global CLI and use broad code execution, persistent memory, background processes, and public port exposure with limited safety guidance.

Install only if you trust PaperPod and are comfortable sending work to its hosted service. Treat PaperPod tokens as secrets, avoid storing credentials or private data in persistent memory, expose only non-sensitive services, clean up background processes and memory when done, and prefer a pinned CLI version or reviewed installation path rather than unrestricted global npm install/update.

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 (1)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:18
Finding
Unpinned Global Installation of a Third-Party CLI## Vulnerability Details **File Location**: `SKILL.md`, line 18 **Vulnerability Type**: `T08: Insecure Dependencies` **Risk Level**: Medium **Vulnerable Code**: ```bash npm install -g @paperpod/cli ``` A related unsafe update instruction appears at `SKILL.md`, line 83: ```bash npm update -g @paperpod/cli ``` ### Technical Analysis The installation command does not pin `@paperpod/cli` to a reviewed version or verify its integrity. It therefore installs whichever package version the npm registry resolves at execution time. The update instruction similarly permits future, unaudited package content to replace the installed CLI. npm packages can define lifecycle scripts that execute during installation with the permissions of the invoking user. Consequently, compromise of the package, its publisher account, or its distribution channel could convert this documented installation step into arbitrary local code execution. Global installation increases exposure because it modifies the user's shared npm environment and makes the CLI available system-wide within that user's installation scope. The audited project does not itself contain a malicious payload, and no compromise of the named package was established. The issue is the mutable and unverified dependency acquisition process. ### Attack Path 1. An attacker compromises the npm package, its publisher account, or another relevant supply-chain component. 2. The attacker publishes a malicious release under the expected package name. 3. A user follows the documented `npm install -g @paperpod/cli` or `npm update -g @paperpod/cli` instruction. 4. npm resolves and downloads the attacker-controlled release because no reviewed version or integrity value is specified. 5. Malicious package code or lifecycle scripts execute locally with the invoking user's permissions. 6. The attacker can access or modify resources available to that user and can alter the globally installed CLI. ### Impact Assessment Successful exploi ...[truncated 482 chars]
Remediation
## Remediation Suggestions 1. Pin the CLI to a specific, reviewed version, for example: ```bash npm install -g @paperpod/cli@2.0.3 ``` 2. Verify the selected release and document its expected registry source and integrity digest. 3. Avoid instructing users to run an unrestricted `npm update -g`; instead, specify an explicitly reviewed target version. 4. Prefer a project-local dependency with a committed lockfile over a global installation where operationally feasible. 5. Publish and verify signed release artifacts or package provenance. 6. Review required npm lifecycle scripts and use `--ignore-scripts` when installation scripts are unnecessary. 7. Document a controlled upgrade process that requires security review before changing the pinned version.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (25)

Tool Parameter Abuse

High
Category
Tool Misuse
Content
```python
import subprocess
result = subprocess.run("git --version", shell=True, capture_output=True, text=True)
print(result.stdout)
```
Confidence
95% confidence
Finding
The Python example uses subprocess.run with shell=True, which is dangerous because any future interpolation of user-controlled input into that command string can lead to shell injection. In a skill explicitly designed for code execution and shell tooling, this pattern is more hazardous because users are likely to copy it into real workflows involving variable input.

External Transmission

Medium
Category
Data Exfiltration
Content
## Quick Start

```bash
curl -X POST https://paperpod.dev/login -d '{"email":"you@email.com"}'  # Verify and get token
npm install -g @paperpod/cli
ppod login <token> && ppod help
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The documentation instructs users to place bearer tokens in environment variables and HTTP headers but does not emphasize that these tokens are credentials that must be protected from logs, shell history, screenshots, and process inspection. In practice, agents and users often echo commands or persist environment state, which increases the chance of credential leakage.

Session Persistence

Medium
Category
Rogue Agent
Content
| | `ppod write <path> [file]` | Write file (stdin if no file) |
| | `ppod read <path>` | Read file |
| | `ppod ls <path>` | List directory |
| **Processes** | `ppod start <cmd>` | Start background process |
| | `ppod ps` | List processes |
| | `ppod kill <id>` | Stop process |
| **Ports** | `ppod expose <port>` | Get public URL (-q for URL only) |
Confidence
70% 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.

Session Persistence

Medium
Category
Rogue Agent
Content
| | `ppod write <path> [file]` | Write file (stdin if no file) |
| | `ppod read <path>` | Read file |
| | `ppod ls <path>` | List directory |
| **Processes** | `ppod start <cmd>` | Start background process |
| | `ppod ps` | List processes |
| | `ppod kill <id>` | Stop process |
| **Ports** | `ppod expose <port>` | Get public URL (-q for URL only) |
Confidence
70% 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.

Session Persistence

Medium
Category
Rogue Agent
Content
| | `ppod ai:models` | List available AI models |
| **Code** | `ppod interpret <code>` | Rich output (charts) |
| **Memory** | `ppod mem:write <path>` | Persist data |
| | `ppod mem:read <path>` | Read persisted data |
| | `ppod mem:ls` | List memory files |
| | `ppod mem:rm <path>` | Delete from memory |
| | `ppod mem:usage` | Check quota |
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.

Session Persistence

Medium
Category
Rogue Agent
Content
| | `ppod ai:models` | List available AI models |
| **Code** | `ppod interpret <code>` | Rich output (charts) |
| **Memory** | `ppod mem:write <path>` | Persist data |
| | `ppod mem:read <path>` | Read persisted data |
| | `ppod mem:ls` | List memory files |
| | `ppod mem:rm <path>` | Delete from memory |
| | `ppod mem:usage` | Check quota |
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.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill explicitly advertises persistent memory and public port exposure but does not clearly warn that stored data may outlive a sandbox session or that exposed services become reachable from the public internet. In an agent context, this can lead to accidental publication of sensitive files, debug endpoints, or stateful secrets when users assume the environment is temporary and private.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# 1. Request magic link
curl -X POST https://paperpod.dev/login \
  -H "Content-Type: application/json" \
  -d '{"email":"you@email.com"}'
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
Tokens expire in **15 days**. Refresh before expiry:

```bash
curl -X POST https://paperpod.dev/auth/refresh \
  -d '{"token":"pp_sess_..."}'
```
Confidence
74% confidence
Finding
The refresh example places a live-style session token directly in the request body, which encourages patterns that can leak tokens through shell history, logs, clipboard reuse, or copied examples. Because the token is long-lived and grants authenticated access, poor handling can lead to account compromise if reused carelessly.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
This markdown file describes endpoints that execute Python/JavaScript/shell code and start background processes, but it does not include any user warning about the risks of running arbitrary code or commands. For markdown files, SQP-2 applies when the description omits warnings about behaviors that could affect system integrity.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The file documents /files/write, /memory/write, and /memory/delete operations, but it does not warn users that these actions can overwrite or remove stored data. In markdown documentation, omission of warnings for behaviors affecting user data matches the missing-user-warnings rule.

External Transmission

Medium
Category
Data Exfiltration
Content
### POST /files/write

```bash
curl -X POST https://paperpod.dev/files/write \
  -H "Authorization: Bearer $PAPERPOD_TOKEN" \
  -d '{"path": "/workspace/app.py", "content": "print(\"hello\")"}'
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Session Persistence

Medium
Category
Rogue Agent
Content
### POST /process/start

Start a background process.

```bash
curl -X POST https://paperpod.dev/process/start \
Confidence
72% confidence
Finding
Background process support creates persistence within the runtime and can be combined with port exposure, file writes, and code execution to maintain long-running services or unwanted tasks beyond a single request. In this skill context, that expands the window for abuse, covert activity, and unintended resource consumption if users are not clearly warned or constrained.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The `/expose` endpoint makes a local service publicly reachable and the documentation provides usage guidance without any security warning about unauthenticated access, accidental data exposure, or internet-facing attack surface. In a tool that also supports process start and file operations, exposing arbitrary ports can easily publish admin panels, dev servers, or sensitive application state.

External Transmission

Medium
Category
Data Exfiltration
Content
Expose a port and get a public URL.

```bash
curl -X POST https://paperpod.dev/expose \
  -H "Authorization: Bearer $PAPERPOD_TOKEN" \
  -d '{"port": 8080}'
```
Confidence
82% confidence
Finding
Calling `/expose` sends a request that results in a publicly reachable URL, effectively transmitting local service availability and potentially whatever data that service exposes to the internet. In the context of a runtime that can start arbitrary processes, this materially increases risk of unintended public data disclosure or remote interaction with development services.

External Transmission

Medium
Category
Data Exfiltration
Content
### POST /browser/screenshot

```bash
curl -X POST https://paperpod.dev/browser/screenshot \
  -H "Authorization: Bearer $PAPERPOD_TOKEN" \
  -d '{"url": "https://example.com"}' \
  --output screenshot.png
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
### POST /browser/pdf

```bash
curl -X POST https://paperpod.dev/browser/pdf \
  -H "Authorization: Bearer $PAPERPOD_TOKEN" \
  -d '{"url": "https://example.com", "format": "A4"}' \
  --output page.pdf
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
Scrape elements by CSS selector.

```bash
curl -X POST https://paperpod.dev/browser/scrape \
  -H "Authorization: Bearer $PAPERPOD_TOKEN" \
  -d '{"url": "https://example.com", "selector": "h1, h2, p"}'
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
Generate text embeddings.

```bash
curl -X POST https://paperpod.dev/ai/embed \
  -H "Authorization: Bearer $PAPERPOD_TOKEN" \
  -d '{"text": "Hello world"}'
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
Transcribe audio to text.

```bash
curl -X POST https://paperpod.dev/ai/transcribe \
  -H "Authorization: Bearer $PAPERPOD_TOKEN" \
  -d '{"audio": "<base64-encoded-audio>"}'
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
This markdown file documents commands that execute shell operations, make HTTP requests, clone repositories, and create or modify local files and databases. Under the markdown-file criteria, the description should warn users that these examples may change files, access networks, or interact with system state, but no such warning is present.

External Transmission

Medium
Category
Data Exfiltration
Content
Use `language: "shell"` with `/execute`:

```bash
curl -X POST https://paperpod.dev/execute \
  -H "Authorization: Bearer $PAPERPOD_TOKEN" \
  -d '{"code": "git clone https://github.com/user/repo", "language": "shell"}'
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
Use `language: "shell"` with `/execute`:

```bash
curl -X POST https://paperpod.dev/execute \
  -H "Authorization: Bearer $PAPERPOD_TOKEN" \
  -d '{"code": "git clone https://github.com/user/repo", "language": "shell"}'
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
ppod exec "cat data.json | jq '.users[].name'"

# API response processing
ppod exec "curl -s https://api.example.com/data | jq '.results | length'"
```

### ffmpeg
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

No suspicious patterns detected.