Back to skill

Security audit

Vercel Sandbox

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent browser-automation guide for Vercel Sandbox, with some install and automation risks users should manage.

Install only if you intend to run browser automation in Vercel Sandbox. Pin package versions, use a lockfile or controlled snapshot build, keep Vercel tokens scoped, and require explicit user approval before submitting forms, authenticating to sites, or scheduling recurring jobs against third-party services.

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:66
Finding
Unpinned Third-Party Packages Are Installed and Executed## Vulnerability Details **File Location**: `SKILL.md`, lines 13, 66–67, and 199–200 **Vulnerability Type**: Supply-chain exposure through unpinned dependencies **Risk Level**: Medium ### Vulnerable Code ```bash pnpm add @vercel/sandbox ``` ```ts await sandbox.runCommand("npm", ["install", "-g", "agent-browser"]); await sandbox.runCommand("npx", ["agent-browser", "install"]); ``` The same installation pattern is used when creating a reusable sandbox snapshot: ```ts await sandbox.runCommand("npm", ["install", "-g", "agent-browser"]); await sandbox.runCommand("npx", ["agent-browser", "install"]); const snapshot = await sandbox.snapshot(); return snapshot.snapshotId; ``` ### Technical Analysis The documented commands do not pin exact versions of `@vercel/sandbox` or `agent-browser`. Package managers can therefore resolve a different release whenever the instructions are followed. The effective code executed by the workflow can change after the Skill has been reviewed, without any corresponding modification to `SKILL.md`. Installing `agent-browser` globally may execute package lifecycle scripts and makes the installed executable available to subsequent sandbox commands. The `npx` invocation then executes package-controlled code and installs browser components. In the snapshot workflow, the resulting software is captured in a reusable VM image, potentially propagating a compromised dependency across later browser-automation runs. This finding concerns unsafe dependency resolution. The audited file contains no evidence that the named packages are currently malicious. ### Attack Path 1. An attacker compromises a package release, maintainer account, transitive dependency, or relevant package-distribution channel. 2. A developer or deployed workflow follows the Skill and installs the package without an exact version or integrity constraint. 3. The package manager resolves the attacker-controlled or compromis ...[truncated 1111 chars]
Remediation
## Remediation Suggestions 1. Pin exact reviewed versions of all packages, including `@vercel/sandbox` and `agent-browser`. 2. Commit and review the appropriate lockfile, and use immutable installation modes such as `pnpm install --frozen-lockfile` or `npm ci`. 3. Replace ambiguous execution commands with explicitly versioned invocations, or invoke a dependency installed from the verified lockfile rather than allowing `npx` to resolve packages dynamically. 4. Verify package provenance and integrity using registry integrity metadata, checksums, signatures, or an approved internal package mirror. 5. Disable unnecessary package lifecycle scripts where operationally possible and review any scripts that must remain enabled. 6. Build production sandbox snapshots only through a controlled CI pipeline using pinned dependencies and reproducible build inputs. 7. Record the exact dependency versions and snapshot build provenance, scan snapshots before publication, and rebuild them promptly when trusted security updates are approved. 8. Apply least privilege and outbound network restrictions to sandbox workloads to reduce the impact of a compromised dependency.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (8)

Chaining Abuse

High
Category
Tool Misuse
Content
if (!snapshotId) {
    await sandbox.runCommand("sh", [
      "-c",
      `sudo dnf clean all 2>&1 && sudo dnf install -y --skip-broken ${CHROMIUM_SYSTEM_DEPS.join(" ")} 2>&1 && sudo ldconfig 2>&1`,
    ]);
    await sandbox.runCommand("npm", ["install", "-g", "agent-browser"]);
    await sandbox.runCommand("npx", ["agent-browser", "install"]);
Confidence
75% confidence
Finding
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Chaining Abuse

High
Category
Tool Misuse
Content
if (!snapshotId) {
    await sandbox.runCommand("sh", [
      "-c",
      `sudo dnf clean all 2>&1 && sudo dnf install -y --skip-broken ${CHROMIUM_SYSTEM_DEPS.join(" ")} 2>&1 && sudo ldconfig 2>&1`,
    ]);
    await sandbox.runCommand("npm", ["install", "-g", "agent-browser"]);
    await sandbox.runCommand("npx", ["agent-browser", "install"]);
Confidence
75% confidence
Finding
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Credential Access

High
Category
Privilege Escalation
Content
| Variable | Required | Description |
|---|---|---|
| `AGENT_BROWSER_SNAPSHOT_ID` | No (but recommended) | Pre-built sandbox snapshot ID for sub-second startup (see above) |
| `VERCEL_TOKEN` | No | Vercel personal access token (for local dev; OIDC is automatic on Vercel) |
| `VERCEL_TEAM_ID` | No | Vercel team ID (for local dev) |
| `VERCEL_PROJECT_ID` | No | Vercel project ID (for local dev) |
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Vague Triggers

Medium
Confidence
96% confidence
Finding
The manifest description includes broad triggers like any task requiring Chrome in a Vercel Sandbox, which can cause the skill to be invoked in overly general situations. In an agent setting, overbroad invocation increases the chance of unnecessary browser automation, form interaction, or external side effects without sufficiently specific user intent.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
if (!snapshotId) {
    await sandbox.runCommand("sh", [
      "-c",
      `sudo dnf clean all 2>&1 && sudo dnf install -y --skip-broken ${CHROMIUM_SYSTEM_DEPS.join(" ")} 2>&1 && sudo ldconfig 2>&1`,
    ]);
    await sandbox.runCommand("npm", ["install", "-g", "agent-browser"]);
    await sandbox.runCommand("npx", ["agent-browser", "install"]);
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
if (!snapshotId) {
    await sandbox.runCommand("sh", [
      "-c",
      `sudo dnf clean all 2>&1 && sudo dnf install -y --skip-broken ${CHROMIUM_SYSTEM_DEPS.join(" ")} 2>&1 && sudo ldconfig 2>&1`,
    ]);
    await sandbox.runCommand("npm", ["install", "-g", "agent-browser"]);
    await sandbox.runCommand("npx", ["agent-browser", "install"]);
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill provides examples for multi-step form submission and scheduled recurring browser actions but does not include a warning that these operations can modify external systems, trigger transactions, or repeatedly hit third-party services. In an automation skill, omission of such guardrails materially raises misuse risk because users or agents may treat the examples as safe defaults.

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.

Static analysis

No suspicious patterns detected.