Back to skill

Security audit

Zepto

Security checks for vulnerabilities and agentic risk

Overview

This Zepto grocery skill is mostly purpose-aligned, but it can make sensitive shopping-account changes and sometimes clears carts without clear consent.

Install only if you are comfortable giving the skill control of an authenticated Zepto browser session and WhatsApp payment-link workflow. Before using it, require explicit confirmation for cart clearing, address changes, checkout/payment-link generation, and history scraping; review payment links and cart contents yourself before paying; and clear the browser session or local order-history file if you no longer want the skill to retain shopping context.

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 (3)

T09 · Insecure Skill Coding Practices

Warning
Location
zepto-agent.js:322
Finding

Unvalidated Adjacent UI References Can Trigger Unintended Browser Actions

Content
View full analysis
`e${parseInt(num) + 1}`); ``` `zepto-ops.js:261-265`: ```js // Calculate ADD button ref (usually product ref + 1) const refNum = parseInt(product.ref.replace('e', '')); const addRef = `e${refNum + 1}`; // Click ADD await click(browserTool, targetId, addRef, 1000); ``` ### Technical Analysis Both implementations assume that the ADD button always has the browser reference immediately following the product reference. Browser references are transient identifiers generated from the current page structure; they are not stable semantic identifiers and do not guarantee adjacency. The parser already extracts a dedicated `addButtonRef` from standalone ADD controls, but the callers ignore this value and instead calculate a new reference arithmetically. If Zepto changes its DOM structure, inserts another interactive control, or serves a different layout, the inferred reference can identify an unrelated action. Verification in `zepto-ops.js` only checks whether the cart contains at least one item after the click. If the cart already changed for another reason, or the wrong control adds a different product, this condition can incorrectly report success. ### Attack Path 1. The user asks the skill to add a particular product. 2. Zepto returns search results in a layout where the element after the product reference is not its ADD button. 3. The parser identifies the product as reference `eN`. 4. The automation constructs `eN+1` without inspecting the referenced element's role, label, or product association. 5. The skill clicks the unrelated element. 6. The weak verification accepts any nonempty cart rather than confirming that the requested product and quantity were ad ...[truncated 557 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
zepto-agent.js:400
Finding

Recommended Shopping Flow Destructively Clears Existing Cart Contents by Default

Content
View full analysis
s.trim()); const clearUnwanted = options.clearUnwanted !== false; // Default true log(`🧠 Smart shopping for: ${targetItems.join(', ')}`); // STEP 1: Check current cart state const cartState = await getCart(); log(`Current cart total: ₹${cartState.parsed.total || 0}`); // STEP 2: If cart has items and clearUnwanted is true, clear it if (cartState.parsed.total > 0) { if (clearUnwanted) { log('Clearing existing cart items...'); await clearCart({ verify: true }); } else { log('Warning: Cart has existing items, will add on top'); } } ``` Relevant instruction in `SKILL.md:76-83`: ```bash # This handles everything: clears unwanted, checks duplicates, adds missing node zepto-agent.js smart-shop "milk, bread, eggs" ``` Relevant post-payment instruction in `SKILL.md:634-650`: ```text Step 3: Auto-clear cart (Post-Payment Behavior) CRITICAL: After payment, cart items persist because Zepto hasn't synced yet! Automatically clear cart without asking (user expects cart to be empty after payment): ``` ### Technical Analysis The documented recommended command invokes `smartShop`, where `clearUnwanted` defaults to true. Consequently, any nonempty cart is cleared before the requested items are added, even when the user only asked to add products and did not authorize deletion. The skill instructions are internally inconsistent. The normal shopping instructions say the user should be asked whether existing items should be kept, while the recommended command silently clears them. The post-payment ...[truncated 1622 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
zepto-agent.js:87
Finding

Authenticated Browser Snapshot Data Is Written to Debug Logs

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 Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (29)

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 · PARSER-USAGE.md (reported line 174)May include surrounding context.

md
---

**Next:** Update SKILL.md to use zepto-parser.js instead of manual parsing

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description presents a user-facing grocery ordering skill with payment-link and preference-memory features. The supplied code chunk instead acts as a developer test script for zepto-ops.js, listing internal operations such as getCartState, clearCart, searchProduct, addItem, and shop. Its primary purpose is testing/documenting those operations, especially clearCart, not providing the described end-user ordering experience. This is a material description-versus-behavior mismatch for the provided code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The code does relate to Zepto grocery ordering, but the declared description materially misrepresents what is actually implemented. The code is an autonomous browser automation/CLI agent that can open Zepto, inspect the cart, add items, clear the cart, perform shopping workflows, and enumerate/select saved addresses. These are significant capabilities not mentioned in the description, especially cart manipulation and address switching. Conversely, key described features are absent: there is no WhatsApp integration, no payment-link generation/sending, and no persistence or memory of usual items. Therefore the description is not an accurate representation of the supplied code’s behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code does relate to ordering groceries on Zepto: it can search items, add them to the cart, inspect the cart, and shop for multiple items. However, the declared description specifically promises a user flow involving a WhatsApp payment link and remembering usual items, neither of which appears in this code. Instead, the code exposes operational browser-automation functions, including clearing the cart, clicking/type actions, snapshot parsing, and cart-state inspection. The undeclared cart-clearing capability is materially significant, and the declared key features (WhatsApp payment link, memory of usual items) are absent from the supplied code chunk. Therefore the description does not accurately represent the actual behavior of this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description presents a full grocery-ordering skill with WhatsApp payment flow and memory of usual items. The supplied code only parses textual browser snapshots for Zepto page elements and product/cart data. While this parser could be a supporting component inside a larger ordering system, on its own its actual behavior is materially narrower and different from the declared end-user capability. No evidence of WhatsApp integration, payment handling, ordering, delivery-area logic, or persistence is present.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The module comment explicitly states 'Uses OpenClaw browser tool API directly (no CLI spawning).' Yet the implementation imports spawnSync and calls it to run zepto-parser.js, which is active process spawning. This is a direct contradiction between documentation and code behavior.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The example workflow performs a real add-to-cart action on Zepto without any warning, simulation note, or requirement for explicit user confirmation. In an agent skill context, this normalizes state-changing actions against a live commerce site and increases the risk of unintended purchases or manipulation of a user's cart, especially when reused as implementation guidance in automation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The opening description emphasizes speed and convenience but does not upfront warn that the workflow sends payment links over WhatsApp and relies on phone-number plus OTP-based account login. Those steps involve sensitive channels and credentials, so omitting them from the primary description can mislead users about the security-sensitive nature of the skill until later in the flow.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The trigger examples are generic shopping phrases such as ordering milk, bread, or vegetables, which can overlap with ordinary user requests and cause the skill to activate without clear user intent to use Zepto automation. Because this skill can initiate cart actions, handle checkout flow, and send payment links, ambiguous activation increases the risk of unintended commerce actions and privacy exposure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The README says the skill remembers usual orders and automatically picks frequently ordered brands, but it does not warn users that purchase history or preference data is being retained. In a grocery-ordering context, persistent memory can reveal behavioral patterns and household preferences, creating privacy risk if users are not clearly informed and given control over retention.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The privacy section claims there are no persistent background jobs, yet the workflow later instructs setting up a background status check. This is dangerous because users may consent under false assumptions about ongoing monitoring and message handling, especially in a skill that processes order history, addresses, phone numbers, and payment-adjacent events.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill instructs the agent to scrape delivered orders and build a local profile of purchase history to infer 'usuals.' This is sensitive behavioral data, and collecting it programmatically from prior orders increases privacy risk by creating a persistent profile of user habits without a clearly bounded retention policy, minimization strategy, or explicit opt-in for historical scraping.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill includes broad activation patterns such as exploration and generic shopping-style requests that may overlap with ordinary conversation. In a browser-enabled commerce skill, over-broad triggering is dangerous because it can start account-affecting actions like browsing, cart inspection, item selection, or checkout preparation without sufficiently clear user intent.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
82% confidence
Finding

The skill authorizes autonomous retries and auto-selection logic during item addition based on prior history and popularity. In a purchasing context, this is dangerous because the agent can make binding product choices and repeated account actions without fresh user confirmation, increasing the chance of ordering unwanted variants or quantities.

Content

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

md
- If verification fails: Retry up to 3 times
2. **Then show final cart summary** with all items and total

**CRITICAL:** Never batch-add without verification! Page refs change after each add.

**Item Selection Logic:**
- Check order-history.json first

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
95% confidence
Finding

Automatically clearing the cart without asking after a payment-related event is a destructive autonomous action. In context, the skill operates on a real consumer account, and misreading order state or acting on the wrong session could delete intended future purchases and materially alter the user's shopping state without consent.

Content

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

🚨 CRITICAL: After payment, cart items persist because Zepto hasn't synced yet!

Automatically clear cart without asking (user expects cart to be empty after payment):

bash
# Open cart

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill gives conflicting instructions about post-payment cart clearing: one path says clear automatically without asking, another says ask the user first. In a shopping skill, inconsistent state-changing rules can lead to unintended deletion of cart contents or accidental loss of items the user wanted to keep, especially if a payment confirmation was misdetected.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
95% confidence
Finding

This repeats the instruction to auto-clear the cart without asking, reinforcing a destructive workflow. Because the skill also handles address switching, payment-link generation, and order-state inference, an autonomous cart wipe in the wrong state could cause immediate user harm through loss of selected goods or confusion leading to duplicate orders.

Content

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

2. Look for "Your order is on the way" or "Arriving in X mins"

3. Open cart and AUTO-CLEAR without asking

bash
# Open cart
browser act profile=openclaw request='{"kind":"click","ref":"{cart_button_ref}"}'

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill says 'Never click Pay' but elsewhere instructs the agent to click a payment button to generate the payment link. Contradictory payment-handling rules in a commerce skill are dangerous because they can cause the agent to take a financially sensitive action the user was told would never happen, undermining informed consent and increasing the risk of accidental checkout progression.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill collects highly sensitive authentication and location data—phone number, OTP, and address—and explicitly states that the browser session remains logged in, but it does not clearly disclose retention, session persistence, or privacy implications before collection. In this context, OTPs are especially sensitive because they enable account access, and persistent login cookies increase the risk of unauthorized future ordering or account misuse if the session is shared or compromised.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill includes saved-address discovery and address switching, which expands its authority beyond simply adding groceries and retrieving a payment flow. Enumerating and changing delivery addresses affects account state and exposes private location labels, creating unnecessary privacy and integrity risk if the agent is triggered without clear user consent.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The code injects and executes custom in-page JavaScript via the browser automation layer to traverse the DOM, extract saved addresses, dismiss modals, and click elements. That capability is more powerful than needed for grocery ordering and creates a broad primitive for inspecting account data and performing hidden UI actions, especially if later reused with untrusted inputs.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill logs the list of saved address names to stderr, which can expose sensitive personal information such as home/work labels or locality names in agent logs. Users are not warned that private account metadata will be enumerated and emitted, so routine execution may leak data to operators, telemetry systems, or shared logs.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill can switch the active delivery address through browser automation without an explicit warning in the skill’s user-facing contract. Changing account state can redirect future orders, alter availability, and affect pricing or delivery outcomes, making this a meaningful integrity risk when invoked unexpectedly or through ambiguous fuzzy matching.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The manifest describes a skill for ordering groceries from Zepto and receiving a payment link, which would reasonably involve browser automation against Zepto. However, this file imports child_process and later invokes spawnSync to execute another local script, introducing process-execution capability that is not an obvious requirement of grocery ordering itself.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

clearCart performs a destructive action that removes all items from the user's shopping cart without any built-in confirmation, warning, or caller-provided consent gate. In a commerce skill, this can cause unauthorized state changes, loss of user selections, and denial of intended purchases if invoked accidentally or by a compromised calling flow.

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
zepto-agent.js:64

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
zepto-ops.js:37