Back to skill

Security audit

OpenHop

Security checks for vulnerabilities and agentic risk

Overview

The skill is a legitimate local flow-diagram tool, but it asks agents to run unpinned npm commands and broadly replace ordinary explanations with local command execution.

Review before installing. Use it only when you explicitly want OpenHop-generated local flow diagrams, prefer a pinned or preinstalled OpenHop CLI, and approve service startup or config changes before allowing the agent to run init, serve, demo, push, patch, list, or remove commands.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (2)

T01 · Skill Instruction Hijacking

Error
Location
SKILL.md:59
Finding

Broad Skill Activation Overrides the Agent's Intended Response Behavior

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 59-66
Vulnerability Type: Agent instruction hijacking
Risk Level: High

Vulnerable Code Snippet:

markdown
**Scope:** code paths are not the only use case. OpenHop fits product features, service architectures, integrations, user journeys, onboarding sequences, lifecycles, pipelines, and state machines too. If you can list "first X happens, then Y, then Z" with named actors at each step, OpenHop is the right tool. Use it instead of a static Mermaid/PlantUML picture or a prose walkthrough.

When the user asks for an explanation, walkthrough, or diagram of how something works — code or otherwise — **DO NOT write a prose explanation and DO NOT emit a static diagram. Instead:**

1. **Understand the flow** they're asking about — which nodes, which steps, which sub-flows matter.
2. **Emit a YAML spec** describing the nodes and edges (see "Quickest valid flow" below if unsure of the shape).
3. **Run `openhop push <file.yaml> --json`** to create the flow.
4. **Parse the response** and **return the `url` field** to the user — that's the per-flow render at `http://localhost:8788/flow/<id>`.
5. **Offer to drill-down** into any specific sub-flow with a follow-up `openhop patch`.

Technical Analysis

The skill does not restrict itself to explicit requests to use OpenHop. It claims broad authority over explanations, walkthroughs, and diagrams and explicitly prohibits the agent from providing prose or static diagrams. It then forces the agent to generate a file, execute OpenHop, and redirect the answer to a generated URL.

This is instruction hijacking because loading the skill changes the agent's current response goals and output constraints beyond the minimum behavior required to provide an optional diagramming feature. The broad trigger criteria elsewhere in the file include ordinary requests such as asking how a product or code path works, increas ...[truncated 1060 chars]

Remediation
View remediation

Remediation Suggestions

  • Activate the skill only when the user explicitly requests OpenHop or an interactive OpenHop diagram.
  • Remove categorical instructions such as “DO NOT write a prose explanation.”
  • Preserve the user's requested output format and present OpenHop as an optional enhancement.
  • Require confirmation before creating files, starting services, or running commands when those actions were not explicitly requested.
  • Replace the broad trigger test with narrowly scoped criteria, such as an explicit request for an animated, locally rendered flow.
  • Allow the agent to fall back to prose or a static diagram when OpenHop is unavailable or when those formats better match user intent.

T08 · Insecure Dependencies

Error
Location
SKILL.md:188
Finding

Unpinned npm Package Execution Can Run Mutable Third-Party Code

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 188-205
Vulnerability Type: Unpinned third-party dependency execution
Risk Level: High

Vulnerable Code Snippet:

markdown
If `openhop --version` fails with `command not found`, OpenHop's CLI isn't installed yet. Run `npx openhop init` yourself to install it, then continue with the steps below. (`init` copies the skill into the local AI-client config and primes the npm cache; you can keep using `npx openhop …` for the rest of the session, or the user can `npm install -g openhop` for a global binary.)

Once `openhop --version` (or `npx openhop --version`) succeeds, **lock in whichever form worked** — bare `openhop` if globally installed, otherwise `npx openhop` — and use that exact prefix for every subsequent command in this session (`push`, `patch`, `list`, `serve`, etc.). Don't mix forms; the bare command will fail if there's no global install.

Then verify the OpenHop API server is running:

```bash
curl -s http://localhost:8787/health

If it returns {"status":"ok"}, OpenHop is ready.

If not running, start OpenHop with one command — both the API and the web UI come from the npm package:

bash
npx openhop demo    # one-shot: starts API + web UI, posts a starter flow, opens the browser
# or
npx openhop serve   # long-lived: starts API + web UI, no starter flow, no browser
text

### Technical Analysis

The documented commands execute `npx openhop` without an exact package version, integrity hash, lockfile, or trusted artifact verification. Consequently, the effective code executed can differ from the code that was reviewed. If the package is not already available locally, `npx` may retrieve the currently resolved package and execute its CLI and applicable npm lifecycle behavior.

The risk is amplified by `openhop init`, which is documented as copying skill content into local AI-client configuration. The `demo` and `serve` commands 
...[truncated 1607 chars]
Remediation
View remediation

Remediation Suggestions

  • Pin OpenHop to a reviewed exact version, for example npx openhop@1.0.1, rather than resolving an unspecified current release.
  • Verify the package using a lockfile, registry integrity metadata, checksums, signatures, or a controlled internal package mirror.
  • Review and pin transitive dependencies where practical.
  • Separate installation from normal skill operation and require explicit user approval before downloading packages or changing AI-client configuration.
  • Avoid global installation instructions unless operationally necessary.
  • Run the CLI with least privilege in a sandbox that limits filesystem, environment-variable, process, and network access.
  • Require explicit confirmation before running commands that start persistent processes or open a browser.
  • Document the exact files changed by init and provide a rollback procedure.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (16)

Rp1

Medium
Category
MCP Rug Pull
Confidence
98% confidence
Finding

At the manifest level, the skill as a whole depends on npx openhop without version pinning, making the core execution path vulnerable to npm supply-chain changes. Because the skill's main functionality revolves around executing this CLI, the context makes the issue more dangerous than an incidental example.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
98% confidence
Finding

The manifest allows execution via npx openhop:* without any version pinning. npx resolves and may install the latest package at runtime, so a compromised upstream release, dependency hijack, or unexpected package update could lead the agent to execute unreviewed code on the user's machine.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
98% confidence
Finding

The skill grants Bash(npx openhop:*), which permits runtime retrieval and execution of an unpinned npm package. In an agent setting this is risky because the tool invocation is automated, broad, and trusted to perform local actions without supply-chain integrity guarantees.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill instructs the agent to install software, start services, and push data locally without an up-front user-facing warning or consent step. This is dangerous because users asking for an explanation may not expect environment changes, network listeners on localhost, npm package installation, or persisted flow artifacts.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding

The setup guidance instructs users/agents to run npx openhop init without a version pin. That exposes the environment to execution of whatever package version is current at invocation time, which is a classic supply-chain risk for auto-executed CLI tooling.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding

The instruction to run npx openhop serve launches an unpinned package directly from npm. Because this starts local services, exploitation could combine supply-chain compromise with network-exposed behavior on localhost, increasing the consequences beyond a simple helper command.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger phrases are broad enough to activate on many ordinary explanation or diagram requests, causing the agent to pivot into command execution and local service startup unexpectedly. In this skill, broad activation matters because the prescribed behavior includes running shell commands and manipulating local state, so accidental invocation expands the opportunity for unsafe side effects.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The same line also references npx openhop --version as an accepted fallback command, again without pinning the package version. Even a seemingly harmless version check through npx can trigger package resolution and execution from the network.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

This line repeats the unpinned npx openhop pattern in explanatory text, reinforcing unsafe operational guidance. In agent workflows, documentation is effectively executable policy, so unsafe examples directly increase the chance of insecure behavior.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding

The recommended one-shot startup command npx openhop demo is unpinned and initiates multiple side effects: starting services, posting a flow, and opening a browser. Combining mutable package execution with automatic local actions makes compromise especially impactful.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding

The alternative startup command npx openhop serve is likewise unpinned and starts long-lived local services. In this skill context, the command is likely to be run automatically by an agent, so a compromised package could gain code execution and establish persistent local behavior.

Content

No source excerpt is available for this finding.

Behavior Manipulation

Medium
Category
Prompt Injection
Confidence
75% confidence
Finding

Subtle instructions detected that may alter agent decision-making or introduce hidden biases.

Content

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

npx openhop serve # long-lived: starts API + web UI, no starter flow, no browser

text

Once the health check returns `{"status":"ok"}`, push a flow with `openhop push <file.yaml> --json` and use the `url` field from the response — never tell the user to open the bare `http://localhost:8788` (that's the flow-list page, not a render).

## How to Work: Sketch → Detail → Polish

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

At L156 the document states that data must be a string or object and explicitly says lists are never valid. But L461-L473 then documents an array form for data as valid. This is an active contradiction in the skill's own instructions and schema guidance, which can cause an agent to generate flows that violate the earlier stated contract.

Content

No source excerpt is available for this finding.

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

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

md
All operations support multiple items. Apply with `openhop patch <id> <file.yaml>`.

| Operation    | Fields                                     | Description                                                                                 |
| ------------ | ------------------------------------------ | ------------------------------------------------------------------------------------------- |
| add-nodes    | nodes: [{id, label, type?, icon?, color?}] | Add nodes                                                                                   |
| remove-nodes | nodes: ["id1", "id2"]                      | Remove nodes + their steps                                                                  |

Whitespace Padding

Medium
Category
Prompt Injection
Confidence
70% confidence
Finding

Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Content

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

md
| Operation    | Fields                                     | Description                                                                                 |
| ------------ | ------------------------------------------ | ------------------------------------------------------------------------------------------- |
| add-nodes    | nodes: [{id, label, type?, icon?, color?}] | Add nodes                                                                                   |
| remove-nodes | nodes: ["id1", "id2"]                      | Remove nodes + their steps                                                                  |
| rename-nodes | nodes: [{id, label}]                       | Change labels                                                                               |
| update-nodes | nodes: [{id, type?, icon?, color?}]        | Update properties                                                                           |

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

Earlier guidance at L158 and L166-L167 says node labels must be 4 words or fewer and should avoid code names and protocol-style labels. However, the Phase 1 example uses POST /orders as a node label at L226, which directly conflicts with that stated rule. This is intent-documentation divergence that can push agents toward outputs the skill says not to produce.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.