Back to skill

Security audit

Deno Deploy

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to deploy web apps as advertised, but it can publish code publicly using persistent plaintext Deno credentials with broad activation instructions and no clear confirmation step.

Review carefully before installing. This is not evidence of malware, but installing it gives an agent a path to reuse a Deno deployment token and publish code to a public URL. Use only scoped/revocable Deno credentials, store them with restrictive permissions or a secret manager, and require explicit approval before each deployment.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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)

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:27
Finding

Deno API bearer token stored without restrictive file permissions

Content
View full analysis
~/.config/deno-deploy/access_token echo "your_org_id_here" > ~/.config/deno-deploy/org_id ``` `scripts/deploy.py:21-35`: ```python def get_credentials(): token_path = os.path.join(CONFIG_DIR, "access_token") org_id_path = os.path.join(CONFIG_DIR, "org_id") if not os.path.exists(token_path) or not os.path.exists(org_id_path): print("ERROR: Deno Deploy credentials not found.") print() print("1. Create a Deno Subhosting org at: https://dash.deno.com/subhosting/new_auto") print("2. Copy the org ID and access token from the org dashboard") print("3. Save them:") print(f" mkdir -p {CONFIG_DIR}") print(f' echo "your_token_here" > {token_path}') print(f' echo "your_org_id_here" > {org_id_path}') sys.exit(1) token = open(token_path).read().strip() org_id = open(org_id_path).read().strip() return token, org_id ``` ### Technical Analysis The documented credential setup writes a Deno API bearer token to a plaintext file without explicitly restricting the permissions of either the configuration directory or its files. The script repeats the same unsafe setup instructions when credentials are absent. With a typical permissive `022` umask, the directory may be created as mode `0755` and files as mode `0644`. If the user's home directory is traversable by other local accounts, the bearer token can consequently be read by an unprivileged local user. The actual exposure depends on the host's umask and parent-directory permissions, but the setup does not establish a secure baseline. The script also reads the credential paths without verifying that they: ...[truncated 2063 chars]
Remediation
View remediation
~/.config/deno-deploy/access_token printf '%s\n' "your_org_id_here" > ~/.config/deno-deploy/org_id chmod 600 ~/.config/deno-deploy/access_token chmod 600 ~/.config/deno-deploy/org_id ``` 2. Update both the documentation and runtime error instructions so they never recommend plain `mkdir` and `echo` without a restrictive umask. 3. Before reading credentials, use `os.lstat()` and reject: - Symbolic links. - Non-regular files. - Files not owned by the effective user. - Files with group or other permission bits. - A configuration directory not owned by the user or accessible by group/others. 4. Open credential files defensively, avoiding symlink traversal where the platform supports `O_NOFOLLOW`. 5. Prefer an operating-system credential store or secret manager when available. 6. Use a Deno token restricted to the minimum organization and deployment permissions required by this Skill. Document token rotation and immediate revocation procedures for suspected exposure. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
Findings (9)

Vague Triggers

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger text is overly broad, matching generic requests like making something 'shareable', 'hosted', or even building a web page, which can cause the skill to activate in contexts where the user did not clearly request public deployment. In this skill, mistaken activation is especially dangerous because the end result is uploading user-created content to an external public hosting service.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
88% confidence
Finding

The skill explicitly instructs the user to retrieve an access token and configure it for use by the deployment script, which is credential handling with the ability to create and publish deployments. In context this is functional rather than overtly malicious, but it still enables a high-value secret to be introduced into the agent workflow, where it could be mishandled, exposed, or used for unintended deployments.

Content

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

md
Before deploying, the user must create a **Deno Subhosting organization** and retrieve their credentials:

1. Go to [dash.deno.com/subhosting/new_auto](https://dash.deno.com/subhosting/new_auto) and create a new subhosting org
2. From the org dashboard, copy the **org ID** and **access token**

Then save them as config files under `~/.config/deno-deploy/`:

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/deploy.py (reported line 29)May include surrounding context.

python
print("ERROR: Deno Deploy credentials not found.")
        print()
        print("1. Create a Deno Subhosting org at: https://dash.deno.com/subhosting/new_auto")
        print("2. Copy the org ID and access token from the org dashboard")
        print("3. Save them:")
        print(f"   mkdir -p {CONFIG_DIR}")
        print(f'   echo "your_token_here" > {token_path}')

Tainted flow: 'req' from open (line 47, file read) → urllib.request.urlopen (network output)

High
Category
Data Flow
Confidence
80% confidence
Finding

File contents flow to a network sink. This may indicate data exfiltration of sensitive files.

Content

Scanner excerpt · scripts/deploy.py (reported line 49)May include surrounding context.

python
data = json.dumps(body).encode() if body else None
    req = urllib.request.Request(url, data=data, headers=headers, method=method)
    try:
        with urllib.request.urlopen(req) as resp:
            return json.loads(resp.read())
    except urllib.error.HTTPError as e:
        error_body = e.read().decode()

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill performs networked deployment actions but does not declare an explicit tool scope or permissions boundary. That increases the chance the agent invokes external network operations without clear policy gating or user awareness, which is risky for a skill that uploads code to a third-party service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill description does not clearly warn that using it uploads code to an external Deno service and makes the result publicly accessible online. This omission undermines informed consent and can lead to accidental disclosure of proprietary, sensitive, or internal content through deployment.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
84% confidence
Finding

The skill establishes persistent local state by having users create a Deno organization and store reusable credentials in a config directory for future runs. Persistent session state is risky because future invocations can silently reuse these credentials to deploy content externally, potentially beyond the user's immediate awareness.

Content

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

md
## Credentials Setup (First Time)

Before deploying, the user must create a **Deno Subhosting organization** and retrieve their credentials:

1. Go to [dash.deno.com/subhosting/new_auto](https://dash.deno.com/subhosting/new_auto) and create a new subhosting org
2. From the org dashboard, copy the **org ID** and **access token**

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The credential setup instructions tell users to store a sensitive access token in plaintext files under the home directory without any warning about local exposure. Plaintext token storage increases the risk of credential theft by other local users, malware, backups, logs, or accidental inclusion in support bundles and dotfile sync tools.

Content

No source excerpt is available for this finding.

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 · scripts/deploy.py (reported line 18)May include surrounding context.

python
import urllib.request
import urllib.error

API = "https://api.deno.com/v1"
CONFIG_DIR = os.path.expanduser("~/.config/deno-deploy")

Static analysis

No suspicious patterns detected.