Back to skill

Security audit

Wahlu — Social media automation, scheduling, publishing, and API for Instagram, TikTok, LinkedIn, Facebook, YouTube

Security checks for vulnerabilities and agentic risk

Overview

This social media automation skill is purpose-aligned, but it relies on an unpinned npm CLI that can publish or schedule public content using a Wahlu API key.

Review this skill before installing in production automation. Use a narrowly scoped, revocable Wahlu API key; pin and review the @wahlu/cli version instead of running unpinned npx commands; run it in a constrained environment with access only to intended media files; and keep explicit user approval for any publish, schedule, queue, or account-context changes.

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:5
Finding
Unpinned Third-Party CLI Is Downloaded and Executed Through npx<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:5`, `SKILL.md:29`, `SKILL.md:35-41`, `SKILL.md:77-87` **Vulnerability Type**: Unpinned third-party dependency execution **Risk Level**: Medium ### Vulnerable Code ```yaml metadata: {"openclaw":{"emoji":"🦐","requires":{"env":["WAHLU_API_KEY"]},"primaryEnv":"WAHLU_API_KEY","install":[{"id":"npm","kind":"node","pkg":"@wahlu/cli","bins":["wahlu"],"label":"Install Wahlu CLI"}]}} ``` ```markdown No global install needed — use `npx @wahlu/cli` to run any command. ``` ```bash 1. **List brands** — `npx @wahlu/cli brand list` 2. **Switch to a brand** — `npx @wahlu/cli brand switch <brand-id>` 3. **List integrations** — `npx @wahlu/cli integration list` (get integration IDs for scheduling) 4. **Create a post** — `npx @wahlu/cli post create --name "Title" --instagram '{"description":"Caption","post_type":"grid_post"}'` 5. **Schedule it** — `npx @wahlu/cli schedule create <content-item-id> --at 2026-03-15T14:00:00Z --integrations <id>` 6. **Upload media** — `npx @wahlu/cli media upload ./photo.jpg` (returns a media ID) 7. **Check publications** — `npx @wahlu/cli publication list` ``` ```bash npx @wahlu/cli media upload ./photo.jpg npx @wahlu/cli post create --name "New product launch" \ --instagram '{"description":"Just launched!","post_type":"grid_post","media_ids":["mid-abc123"]}' \ --tiktok '{"description":"Just launched!","post_type":"image","media_ids":["mid-abc123"]}' \ --linkedin '{"description":"Just launched!","post_type":"li_image","media_ids":["mid-abc123"]}' npx @wahlu/cli schedule create <content-item-id> \ --at 2026-03-15T09:00:00Z \ --integrations int-123 int-456 int-789 ``` ### Technical Analysis The package reference `@wahlu/cli` has no exact version or integrity constraint. Every documented `npx @wahlu/cli` invocation can therefore resolve to a package version selected by the npm registry at execution time rather than to the version reviewed when this skill was audited. A ...[truncated 1939 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin the dependency to a reviewed exact version in skill metadata, for example: ```json { "id": "npm", "kind": "node", "pkg": "@wahlu/cli@X.Y.Z", "bins": ["wahlu"], "label": "Install Wahlu CLI" } ``` 2. Update every documented invocation to use the same exact version: ```bash npx --yes @wahlu/cli@X.Y.Z brand list ``` 3. Prefer a project-local installation governed by a committed lockfile rather than downloading executable code on each invocation: ```bash npm install --save-exact @wahlu/cli@X.Y.Z npm ci ``` 4. Commit `package-lock.json` and enforce its integrity metadata in deployment or CI. Review package provenance, publisher identity, release signatures where available, transitive dependencies, and lifecycle scripts before approving upgrades. 5. Upgrade only through a controlled review process. Test and audit each new version before changing the pinned version and lockfile. 6. Execute the CLI with least privilege: - Provide only the required environment variables. - Use a narrowly scoped and revocable API key. - Restrict filesystem access to required media files. - Restrict outbound network access where practical. - Run inside an isolated container or sandbox without host credentials. 7. Rotate `WAHLU_API_KEY` and review account activity immediately if an unexpected package version has previously been executed. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (13)

Unrestricted Tool Access

Medium
Category
Excessive Agency
Content
export WAHLU_API_KEY=wahlu_live_...
```

No global install needed — use `npx @wahlu/cli` to run any command.

---
Confidence
80% confidence
Finding
Skill grants unrestricted tool access without appropriate constraints. An agent with unfettered tool access can perform arbitrary actions including file modification, network requests, and code execution.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The skill repeatedly instructs agents to invoke `npx @wahlu/cli` without pinning an exact package version. `npx` resolves and executes the latest published package at runtime, so a malicious update, dependency compromise, or typosquatted package resolution event could result in arbitrary code execution in the agent environment with access to `WAHLU_API_KEY` and local files.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
This command example uses `npx @wahlu/cli` without a pinned version, which means execution depends on whatever package version npm serves at runtime. In an agent context, that creates a supply-chain execution path that could expose API keys, alter scheduled posts, or execute arbitrary code on the host if the package or its dependencies are compromised.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The skill tells the agent to switch brands using an unpinned `npx` package execution. Because the package version is not fixed, a compromised upstream release could run attacker-controlled code before or during the brand-switch operation, potentially stealing credentials or manipulating account context.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
Listing integrations via `npx @wahlu/cli` without version pinning creates an avoidable remote-code-execution risk through the npm supply chain. Since this command is used to discover account integration IDs, compromise could also expose sensitive account metadata and operational details.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The post creation example executes an unpinned npm package and accepts rich JSON arguments that may include media identifiers and publish content. If the package resolution is compromised, the attacker gains a high-value execution point in a workflow that can create external-facing content and access the configured API key.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The scheduling command uses unpinned `npx`, allowing runtime retrieval of whatever package version is current. In this skill's context, compromise could lead not just to host-side code execution but also to unauthorized scheduling or tampering with social media publication workflows.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
Uploading media through `npx @wahlu/cli` without version pinning exposes the system to supply-chain risks while handling local files. A malicious package release could exfiltrate uploaded media, scan the filesystem, or misuse the API key during an operation that inherently touches local content.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The subcommand help example also relies on unpinned `npx`, which exposes the same npm supply-chain execution risk as operational commands. Because users often treat help commands as safe, this pattern may increase the chance of casual execution without scrutiny.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The quick example for media upload executes the package via unpinned `npx`, combining supply-chain risk with access to a local file path. In the context of an agent skill that automates publishing, this can facilitate both host compromise and unauthorized use of connected social accounts.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The cross-platform post creation example again relies on unpinned runtime package execution. A malicious upstream change could alter content, harvest media IDs and credentials, or execute arbitrary code while appearing to perform a normal post creation operation.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
This scheduling example uses the latest resolved npm package at execution time instead of a vetted fixed version. That is dangerous in a social media automation skill because compromise directly affects outward-facing publication timing and can execute code in the environment holding the API key.

Rp1

Medium
Category
MCP Rug Pull
Confidence
97% confidence
Finding
The rule telling agents to use `npx @wahlu/cli integration list` normalizes unpinned package execution as expected behavior. That increases the likelihood of repeated unsafe execution in production automation where the package can access secrets and modify connected social publishing configurations.