Back to skill

Security audit

lock-me-in

Security checks for vulnerabilities and agentic risk

Overview

This skill does what it says, but it exposes a logged-in browser through an unauthenticated public link and stores reusable login sessions in ways that need careful review.

Only install this if you are comfortable with a temporary public, unauthenticated URL controlling a browser that may contain live accounts. Do not use it for high-value accounts unless the tunnel is protected, the /eval endpoint is removed or strongly authenticated, typed secrets are not sent in URLs, and saved session files are restricted, encrypted, and easy to delete.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (7)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/browser-login.mjs:369
Finding

Unauthenticated Public Control of a Privileged Browser Session

Content
View full analysis
{ console.log(`🖥️ Server on port ${proxyPort}`); }); // --- Cloudflared Tunnel --- console.log('🚇 Starting tunnel...'); const tunnel = spawn( CLOUDFLARED, ['tunnel', '--url', `http://localhost:${proxyPort}`], { stdio: ['ignore', 'pipe', 'pipe'] } ); let tunnelUrl = null; const onData = (data) => { const m = data.toString().match(/(https:\/\/[a-z0-9-]+\.trycloudflare\.com)/); if (m && !tunnelUrl) { tunnelUrl = m[1]; console.log(`\n🔗 LOGIN URL: ${tunnelUrl}\n`); } }; ``` ### Technical Analysis The HTTP server listens on every local interface and is then exposed through a public Cloudflare tunnel. No endpoint requires authentication or authorization. The implementation also lacks request-origin validation, CSRF defenses, session-bound capability tokens, and rate limiting. The tunnel hostname is random, but possession or discovery of a URL is not a sufficient substitute for authentication. The URL can leak through chat history, process logs, terminal output, shell-management systems, browser history, screenshots, or monitoring infrastructure. This exceeds the minimum privileges needed to facilitate remote login because every person who can reach the URL receives the same browser-control privileges as the intended user. ### Attack Path 1. The Skill launches the local HTTP service and publishes it through Cloudflare. 2. The tunnel URL is exposed through logs or the messaging channel used to send it to the user. 3. An unauthorized party obtains the URL. 4. The party requests `/screenshot` to inspect the browser's current state. 5. The party invokes endpoints such as `/click`, `/type`, `/navigate`, `/save`, or `/done`. 6. The pa ...[truncated 469 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/browser-login.mjs:332
Finding

Undocumented Arbitrary JavaScript Execution in the Active Browser Page

Content
View full analysis
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/browser-login.mjs:316
Finding

Unrestricted Navigation Enables Browser-Based SSRF

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/browser-login.mjs:223
Finding

Passwords and MFA Codes Are Transmitted in URL Query Strings and Echoed

Content
View full analysis
`. 3. The complete URL traverses the Cloudflare tunnel and reaches the local server. 4. Any intermediary or local component that records request URLs stores the secret. 5. The server echoes the value in its response and the UI displays it. 6. A party with access to logs, diagnostics, browser history, or the active tunnel recovers the secret. ### Impact Assessment Exposed credentials can enable direct account compromise. MFA-code exposure may permit real-time login takeover, while password disclosure can affect other accou ...[truncated 144 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/browser-login.mjs:275
Finding

Reusable Authentication State Is Persisted Without Restrictive File Permissions

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/browser-login.mjs:96
Finding

Unvalidated Session Name Allows Path Traversal Outside the Session Directory

Content
View full analysis
a.startsWith('http')) || 'https://example.com'; const sessionName = args.find(a => !a.startsWith('http') && !a.startsWith('--')) || 'default'; const portArg = args.find(a => a.startsWith('--port=')); const timeoutArg = args.find(a => a.startsWith('--timeout=')); const proxyPort = portArg ? parseInt(portArg.split('=')[1]) : DEFAULT_PORT; const timeout = timeoutArg ? parseInt(timeoutArg.split('=')[1]) * 1000 : DEFAULT_TIMEOUT; const sessionDir = path.join(SESSIONS_DIR, sessionName); const storageFile = path.join(sessionDir, 'storage.json'); const metaFile = path.join(sessionDir, 'meta.json'); ``` ### Technical Analysis The session name is accepted directly from a command-line argument and joined to the configured session root without validation. Values containing `..` path components or path separators can cause the normalized destination to escape the intended directory. The Skill later creates the resulting directory and writes Chromium profile data, `storage.json`, and `meta.json` beneath it. Exploitation requires influence over process arguments, but this may occur when an agent constructs the command from user-supplied session names. The attacker cannot choose arbitrary file contents or arbitrary filenames through this issue alone, but can redirect predictable Skill-generated files to unintended locations where the process has write permission. ### Attack Path 1. An attacker supplies a session name containing traversal components, such as `../../chosen-directory`. 2. The invoking agent passes the value to the script without sanitization. 3. `path.join` normalizes the traversal outside `SESSIONS_DIR`. 4. The Skill creates a Chromium profile and writes session files in the unintended director ...[truncated 488 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:71
Finding

Installation Instructions Execute Unpinned and Unverified Dependencies

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (11)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill prominently describes creating a temporary public URL for interactive login but does not place a clear up-front warning in the description that this exposes live authenticated browser access over a publicly reachable tunnel with no authentication by default. In this context, missing consent and risk signaling is especially dangerous because compromise of the URL can enable account takeover or leakage of sensitive authenticated data during the session.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill creates a public cloudflared URL to a live browser-control interface and persists resulting session state to disk, but it does not provide an explicit security warning or visible access-control mechanism. Because the interface exposes screenshots, input, navigation, and save operations for authenticated sessions, accidental sharing or interception of the URL can lead to session hijacking and privacy compromise.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill documents environment-variable use, network tunneling, and browser/session handling but declares no explicit tool scope or permissions boundary. In an agent ecosystem, that mismatch can lead to over-broad invocation and execution with capabilities the user or orchestrator did not clearly approve, increasing the chance of unintended network exposure and credential handling.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The description includes broad triggers such as 'log me in' and generic authenticated browsing needs, which could cause the agent to invoke a high-risk skill in situations where the user did not fully intend remote browser sharing or session persistence. Because this skill exposes authenticated browser control through a public tunnel and stores session state, accidental invocation materially increases security risk.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
94% confidence
Finding

Persisting cookies and localStorage to disk for future automated reuse creates durable bearer credentials that can be stolen or misused by any process or user with filesystem access. In this skill's context, the stored data represents authenticated sessions for third-party services, so exposure can directly enable unauthorized account access without re-entering credentials or MFA.

Content

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

md
3. Cloudflared creates a temporary public tunnel URL
4. User opens the link, clicks/types to log in
5. Session (cookies + localStorage) saved to disk
6. Future Playwright sessions load the saved state

## Quick Start

Session Persistence

Medium
Category
Rogue Agent
Confidence
83% confidence
Finding

Running the login process under nohup and writing the tunnel URL to a predictable log file in /tmp increases the chance that other local users or processes can discover the public login link while the session is active. Given that the tunnel has no authentication by default, disclosure of that URL can grant live interactive access to the browser during login and session establishment.

Content

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

Run in background with nohup, capture the tunnel URL from stdout:

bash
nohup node <skill-dir>/scripts/browser-login.mjs <url> <name> > /tmp/lock-me-in.log 2>&1 &
# Wait for URL:
grep -m1 'LOGIN URL' /tmp/lock-me-in.log

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.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The injected stealth script hard-codes navigator.languages to ['en-US', 'en', 'de'], which forces a specific locale presentation regardless of user preference. This is a natural-language policy issue because the skill does not offer locale choice or document a justified region-specific requirement.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
99% confidence
Finding

The browser is launched with locale 'en-US' and '--lang=en-US,en', imposing a specific language/locale configuration. The file provides no user opt-in or documented justification for this constraint, so it conflicts with the stated language/locale policy.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The /eval endpoint allows anyone who can reach the exposed HTTP service to execute arbitrary JavaScript inside the authenticated browser context. In this skill, that context is specifically intended to hold live login sessions and persisted cookies, so arbitrary script execution can drive account actions, read page data, and abuse the session far beyond simple user-assisted login.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

The manifest centers on an interactive visual login flow through screenshots, clicks, typing, and session persistence. Adding a semantic automation endpoint that locates and clicks elements by text turns the skill into a more general remote web automation interface rather than just a login handoff mechanism.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.env_credential_access

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/browser-login.mjs:419

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/browser-login.mjs:69