Back to skill

Security audit

E.x.O. Installer

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent installer skill, but it deserves review because it runs mutable remote npm, npx, and GitHub code and can persistently change OpenClaw-related tooling.

Install only if you trust the E.x.O. publisher and the referenced npm packages and GitHub repositories. Prefer pinned package versions or an isolated environment, avoid running the installer with elevated privileges, review the exact packages before using --all or update, and inspect any OpenClaw extension or cron changes before enabling them.

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

Error
Location
cli.js:201
Finding
Unpinned Remote Packages and Dependencies Are Retrieved and Executed## Vulnerability Details **File Location**: `cli.js:201-212`, `cli.js:371`, `cli.js:436-450`, `packages.json:8-9`, `SKILL.md:18`, `README.md:9` **Vulnerability Type**: Untrusted dependency retrieval and execution without version or integrity pinning **Risk Level**: High ### Vulnerable Code `cli.js:201-212`: ```javascript // Install via npm runCmd(`npm install -g ${pkg.npm}`, { stdio: 'pipe' }); // Run setup if available if (pkg.npm === 'jasper-recall') { console.log(' Running setup...'); runCmd('npx jasper-recall setup', { stdio: 'inherit' }); } else if (pkg.npm === 'hopeid') { console.log(' Running setup...'); runCmd('npx hopeid setup', { stdio: 'inherit' }); } else if (pkg.npm === 'jasper-context-compactor') { console.log(' Running setup...'); runCmd('npx jasper-context-compactor setup', { stdio: 'inherit' }); } ``` `cli.js:371`: ```javascript runCmd(`npm install -g ${pkg.npm}@latest`, { stdio: 'pipe' }); ``` `cli.js:436-450`: ```javascript runCmd(`git clone https://github.com/E-x-O-Entertainment-Studios-Inc/${repo}.git ${targetDir}`, { stdio: 'inherit' }); success(`Cloned ${name}`); // Install dependencies if package.json exists const pkgJson = path.join(targetDir, 'package.json'); if (fs.existsSync(pkgJson)) { console.log(` Installing ${name} dependencies...`); try { runCmd(`cd ${targetDir} && npm install`, { stdio: 'pipe' }); success(`${name} dependencies installed`); } catch (e) { warn(`${name} npm install had issues`); } } ``` `packages.json:8-9`: ```json "doctorCmd": "npx jasper-recall doctor --json", "versionCmd": "npx jasper-recall --version" ``` The documented installation paths are likewise unpinned: ```bash npx exo-installer install --all npm install -g exo-installer ``` ### Technical Analysis The installer retrieves npm packages by mutable package name or the explicit mutable `latest` tag. It does not pin audited versions, validate expected integrity hashes, enforce provenance, or restrict ...[truncated 2831 chars]
Remediation
## Remediation Suggestions 1. Pin every package to a reviewed, exact version rather than using bare package names or `@latest`. 2. Maintain lockfiles for cloned applications and use `npm ci` instead of `npm install` so dependency resolution cannot silently drift. 3. Pin internal repositories to reviewed commit hashes or signed release tags and verify the checked-out commit before installing dependencies. 4. Verify npm package integrity and provenance against expected values before execution. Where supported, require signed provenance from trusted publishers. 5. Disable lifecycle scripts by default with `--ignore-scripts`, then explicitly invoke only reviewed setup steps when they are genuinely required. 6. Replace `npx` health and version checks with direct invocation of already-installed binaries resolved from trusted paths. Checks must fail closed if the executable is absent rather than downloading it. 7. Avoid global installation where possible. Install into a dedicated, least-privileged directory or isolated environment. 8. Separate update discovery from update execution and require explicit confirmation showing the exact version and verified source. 9. Run package setup and dependency installation in a sandbox with restricted filesystem, network, credential, and environment-variable access. 10. Continuously audit both direct and transitive dependencies and review package ownership changes before accepting updates.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (10)

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The README explicitly promotes Telegram alerting and cron job creation, which involve outbound communications and persistent system modification, but it does not warn users about those side effects or require explicit consent. In an installer/ops context, undocumented notification channels and scheduled tasks can surprise users, weaken informed consent, and create privacy and operational risks if enabled automatically or copied blindly from the docs.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The invocation guidance is broad enough to activate on general questions about the E.x.O. ecosystem, not just explicit install or maintenance requests. In context, this is risky because the skill contains installation and cloning commands, so an over-eager agent could recommend or initiate sensitive package-management actions when the user only asked informational questions.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
The skill instructs users to run `npx exo-installer` without a pinned version, which fetches and executes whatever package version is currently published under that name. This creates a supply-chain execution risk: a compromised maintainer account, malicious update, or package takeover could result in arbitrary code execution on the user's machine at install time.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill states later that installed tools auto-register with OpenClaw, but the earlier install guidance does not clearly warn users that installation changes the host agent configuration by enabling extensions. This lack of up-front disclosure can lead to unintended expansion of agent capabilities and trust boundaries, especially if users believe they are only installing passive utilities.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
The CLI executes `npx jasper-recall setup` after installation without pinning an exact version, so execution can drift to whatever version `npx` resolves at runtime. If the package is compromised, republished, or dependency resolution differs from the installed global version, this can lead to unintended remote code execution during setup.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
The command `npx hopeid setup` runs package code without pinning a specific version, creating a supply-chain execution point. An attacker who controls or influences package resolution could cause arbitrary code to run on the user's machine during installation/setup.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
Using `npx jasper-context-compactor setup` without an exact version means setup execution depends on live package resolution rather than a fixed trusted artifact. In a tool that installs and manages other packages, this increases supply-chain risk because setup commands are executed with user privileges.

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
The generated cron configuration fixes the timezone to 'America/Regina', which imposes a locale-specific schedule regardless of the user's actual region. This is a natural-language policy concern because the skill does not offer any user choice or explain why this locale is required.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
The command uses `npx jasper-recall doctor --json` without pinning an explicit package version, so execution may fetch and run whatever version is current at install time. This creates a supply-chain risk: a compromised upstream package, typosquat, or breaking release could cause unreviewed code execution in the agent environment.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding
The version command `npx jasper-recall --version` is also unpinned, which still requires resolving and potentially downloading executable package content at runtime. Even though it appears low-risk functionally, it can still trigger arbitrary package lifecycle or CLI code from an unexpected or malicious release.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
cli.js:45