Back to skill

Security audit

Oto Sessions

Security checks for vulnerabilities and agentic risk

Overview

This skill is coherent but should be reviewed carefully because it stores reusable logged-in browser sessions and installs/runs unpinned external code that would handle those sessions.

Install only if you are comfortable treating saved sessions as sensitive credentials. Pin and review the Oto commit and npm dependency tree before use, keep session files out of shared or synced folders, restrict OTO_PATH to a trusted directory, and require explicit user approval before creating or reusing sessions for high-value accounts.

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:29
Finding

Unpinned External Repository and Dependency Execution

Content
View full analysis
=1.40.0" }, "installation": { "steps": [ "git clone https://github.com/mbahar/oto.git ~/oto", "cd ~/oto && npm install", "cp -r oto-sessions ~/.openclaw/skills/" ], "verification": "node ~/oto/scripts/list-sessions.js" } ``` The downloaded implementation is subsequently loaded by `scripts/launch-session.js:21-25`: ```js const { launchSession, hasSession } = require( process.env.OTO_PATH ? `${process.env.OTO_PATH}/lib/session-manager` : `${require('path').join(require('os').homedir(), 'oto/lib/session-manager')}` ); ``` The same external module-loading pattern appears in `scripts/check-session.js:18-22`. ### Technical Analysis The installation procedure clones the current default branch of an external Git repository without selecting a reviewed commit, signed tag, or immutable release. It then runs `npm install` without a lockfile or documented integrity verification. Consequently, the code and dependency graph installed by users may differ from the versions examined when this skill was reviewed. The semver range `">=1.40.0"` also has no upper bound and permits future Playwright releases to be selected. Running `npm install` can execute package lifecycle scripts. After installation, the local wrappers directly load and execute the external Oto session manager. That component operates on authenticated browser contexts and saved ses ...[truncated 1949 chars]
Remediation
View remediation
``` 2. Prefer a signed release and verify its signature or published SHA-256 checksum before installation. 3. Include and maintain a reviewed lockfile for every npm dependency tree. Use: ```bash npm ci ``` rather than unconstrained `npm install`. 4. Replace open-ended dependency ranges with exact reviewed versions, for example: ```json { "dependencies": { "playwright": "1.x.y" } } ``` 5. Review npm lifecycle scripts before installation. Where compatible with the dependency set, install using: ```bash npm ci --ignore-scripts ``` and explicitly run only the required, reviewed setup operations afterward. 6. Vendor the security-critical session manager into the audited distribution, or publish it as a versioned package with integrity metadata, so that the code handling browser sessions is included in the review boundary. 7. Add automated dependency auditing, provenance verification, and update review procedures. Dependency updates should require security review before changing the pinned commit or lockfile. 8. Validate `OTO_PATH` against an explicitly trusted directory before loading modules from it, and document that an untrusted environment value results in arbitrary local JavaScript execution. ]]>
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
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (23)

Self-Modification

High
Category
Rogue Agent
Confidence
85% confidence
Finding

Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Content

Scanner excerpt · VALIDATION.md (reported line 196)May include surrounding context.

md
- Or install with: `openclaw skill install oto-sessions.skill`

3. **For Maintenance:**
   - Update SKILL.md when adding new patterns
   - Keep references/ in sync with SKILL.md
   - Test all scripts after Oto framework updates

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The delivery document promotes saving and reusing authenticated browser sessions across arbitrary websites, but it does not clearly warn users that stored session artifacts may grant full account access to anyone who can read them. In this skill context, session persistence is the core feature, which makes omission of an explicit privacy/account-takeover warning more dangerous because users may underestimate the sensitivity of cookies and local browser state.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
89% confidence
Finding

The skill explicitly supports creating, storing, and reusing authenticated sessions, which means persistent browser state can function as reusable bearer credentials. In this context, the behavior is intentional and central to the skill, but it still creates a real security risk: theft, unintended sharing, or misuse of session files could allow unauthorized access to user accounts across multiple platforms.

Content

Scanner excerpt · DELIVERY.md (reported line 50)May include surrounding context.

md
- Wrapper for Oto CLI

2. **save-session.sh** (1.5KB)
   - Create new sessions interactively
   - Open browser for manual login
   - Parameters: platform, url, [account]

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · DELIVERY.md (reported line 121)May include surrounding context.

md
✅ **Platform-Agnostic** — Works with any website (Amazon, TikTok, eBay, etc.)
✅ **Multi-Account Support** — Save personal, business, work accounts separately
✅ **Persistent Sessions** — Log in once, reuse forever
✅ **Secure Storage** — Local-only, chmod 600, never committed to git
✅ **CLI Wrappers** — 5 executable scripts for common operations
✅ **Comprehensive Documentation** — 1,382 lines across 4 documents
✅ **Code Examples** — 5+ complete integration patterns

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · references/SETUP.md (reported line 184)May include surrounding context.

md
✅ **Platform-Agnostic** — Works with any website (Amazon, TikTok, eBay, etc.)
✅ **Multi-Account Support** — Save personal, business, work accounts separately
✅ **Persistent Sessions** — Log in once, reuse forever
✅ **Secure Storage** — Local-only, chmod 600, never committed to git
✅ **CLI Wrappers** — 5 executable scripts for common operations
✅ **Comprehensive Documentation** — 1,382 lines across 4 documents
✅ **Code Examples** — 5+ complete integration patterns

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% 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 · MANIFEST.txt (reported line 30)May include surrounding context.

text
4. scripts/ (5 executable scripts)
   ├── list-sessions.sh (711B) - Display saved sessions
   ├── save-session.sh (1.5KB) - Create new session
   ├── delete-session.sh (834B) - Remove session
   ├── launch-session.js (1.9KB) - Start automation
   └── check-session.js (1.0KB) - Verify session exists

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README promotes saving and reusing authenticated browser sessions and emphasizes persistent login, but it does not clearly warn that these session artifacts are effectively bearer tokens for user accounts. In an agent-automation context, stored browser profiles, cookies, and local storage can grant immediate access to sensitive accounts if copied, shared between agents, or stored on multi-user systems.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · README.md (reported line 90)May include surrounding context.

md
- ✅ **Any Website** — Platform-agnostic session management
- ✅ **Multiple Accounts** — Personal, business, work accounts on same site
- ✅ **Persistent Login** — Save once, reuse forever
- ✅ **Secure** — Local storage, never committed to git, chmod 600
- ✅ **Multi-Agent** — Share sessions across agents and scripts

## Requirements

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

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

md
- ✅ **Any Website** — Platform-agnostic session management
- ✅ **Multiple Accounts** — Personal, business, work accounts on same site
- ✅ **Persistent Login** — Save once, reuse forever
- ✅ **Secure** — Local storage, never committed to git, chmod 600
- ✅ **Multi-Agent** — Share sessions across agents and scripts

## Requirements

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · references/SETUP.md (reported line 247)May include surrounding context.

md
- ✅ **Any Website** — Platform-agnostic session management
- ✅ **Multiple Accounts** — Personal, business, work accounts on same site
- ✅ **Persistent Login** — Save once, reuse forever
- ✅ **Secure** — Local storage, never committed to git, chmod 600
- ✅ **Multi-Agent** — Share sessions across agents and scripts

## Requirements

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger description is excessively broad and includes catch-all language like 'any task requiring authenticated browser access,' which can cause the skill to activate in situations the user did not explicitly intend. In this context, the skill manages reusable authenticated sessions across arbitrary websites, so over-triggering increases the chance of unintended access to sensitive accounts or data.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill description emphasizes convenience and reuse of logged-in sessions but does not clearly warn that these sessions can grant persistent access to account data and actions across websites. Because the skill is platform-agnostic and supports multi-account automation, users may underestimate the sensitivity of stored session state and the risk of misuse by an agent or another local process.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
96% confidence
Finding

The skill explicitly instructs persistent storage of authenticated browser sessions in a local directory for later reuse. Even if stored locally and described as encrypted, persistent session artifacts are highly sensitive because compromise of the host, local user account, debug browser connection, or downstream automation can result in unauthorized access to websites without re-authentication.

Content

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

cd ~/oto && npm install

text

Oto will create `~/oto/sessions/` (local, git-ignored) to store encrypted sessions.

### 2. Install this skill

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% 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 · VALIDATION.md (reported line 61)May include surrounding context.

md
- Wrapper for `node ~/oto/scripts/list-sessions.js`
   - No parameters required

2. **save-session.sh** — Create a new session interactively
   - Parameters: `<platform> <url> [account]`
   - Opens browser for manual login

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

This markdown file describes a delete-session.sh script that removes saved sessions, but it does not include any user warning about data loss or irreversible deletion. Under the markdown-file criteria, skills should disclose behaviors that could affect user data or system integrity.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
84% confidence
Finding

The integration pattern normalizes creation and reuse of long-lived authenticated sessions, which is effectively session persistence. In this skill context, that is expected functionality, but it still creates a real security risk because saved sessions can be replayed if stolen and may outlive the user's awareness or intent.

Content

Scanner excerpt · references/INTEGRATION.md (reported line 22)May include surrounding context.

md
// Prompt user to save a session
  return {
    type: 'user-action',
    message: 'Need to create a session first. Run:',
    command: 'node ~/oto/scripts/save-session.js amazon https://www.amazon.com work'
  };
}

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The examples repeatedly call save() to persist authenticated browser state to disk without warning that this stores reusable authentication artifacts. If those session files are readable by other local users, committed accidentally, backed up insecurely, or exfiltrated, an attacker may be able to hijack authenticated accounts.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The guide instructs users to inspect raw session files on disk with cat ... | jq, but does not warn that these files may contain cookies, tokens, or other authenticated browser storage. Exposing or casually inspecting such files increases the risk of credential leakage through terminal history, screen sharing, logs, or copy/paste into unsafe locations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The setup guide instructs users to save sessions without explicitly warning that this captures highly sensitive authenticated material such as cookies, localStorage, and sessionStorage for third-party accounts. Users may unknowingly create reusable bearer-style credentials that, if copied or mishandled, could enable account takeover or unauthorized access.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
65% confidence
Finding

The description says the skill manages authenticated browser sessions for 'any website,' which implies use across many locales, but this file provides no indication of language or locale selection behavior. If the underlying skill assumes a fixed language or locale during automation, that would conflict with the policy requiring user choice or documented justification.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: playwright has 1 known advisory(ies) (CVE-2025-59288 (Playwright downloads and installs browsers without verifying the authenticity of)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
83% confidence
Finding

The manifest declares Playwright as ">=1.40.0" rather than pinning to a vetted version, so installs may resolve to an affected release if the advisory applies. In this skill's context, Playwright is used for browser automation and may download browser binaries during setup, increasing supply-chain risk because authenticity verification weaknesses could expose users to tampered binaries or unreviewed upstream changes.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

The security note asserts a broad safety property about locality and lack of cloud syncing. However, elsewhere in the same file the skill is explicitly positioned for authenticated automation against external services such as Amazon, Shopify, PayPal, and others, so the note can be read as implying a stronger no-network/no-remote-interaction guarantee than the skill actually provides.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

This code prints a JSON object containing the full session file path, which reveals user filesystem layout derived from the home directory or OTO_PATH. Although the file header describes the output format, it does not warn that environment-derived local path information will be exposed to stdout.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/launch-session.js:13