Back to skill

Security audit

OpenClaw Ecosystem Monitor

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed public-metadata monitor with local reports, but users should note some imperfect permission and source-policy documentation.

Install only if you are comfortable with a local tool making unauthenticated requests to the listed public services and writing local snapshots, reports, and optional logs. Treat generated reports as drafts because public metadata is not fully Markdown-sanitized and the hard-coded PR commentary is not verified from the snapshot.

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

Note
Location
scripts/render-demo-report.mjs:10
Finding

Untrusted External Metadata Is Rendered Without Sufficient Markdown Sanitization

Content
View full analysis
"---").join(" | ")} |`; const body = rows.map((row) => `| ${headers.map((headerName) => String(row[headerName] ?? "").replace(/\|/g, "\\|")).join(" | ")} |`); return [header, sep, ...body].join("\n"); } ``` The affected function is used with remotely controlled GitHub and npm metadata: ```js ${table(docIssues.slice(0, 7).map((issue) => ({ title: issue.title, labels: issue.labels.length > 0 ? issue.labels.join(", ") : "-", comments: issue.comments, source: issue.html_url, })))} ``` ```js ${table(npmPackages.slice(0, 8).map((pkg) => ({ package: pkg.name, version: pkg.version, weekly_downloads: compactNumber(pkg.downloads_weekly), monthly_downloads: compactNumber(pkg.downloads_monthly), updated: pkg.date, source: pkg.links?.npm ?? pkg.links?.repository ?? "", })))} ``` ### Technical Analysis The table renderer treats metadata obtained from GitHub and the npm registry as trusted Markdown. It escapes only the pipe character used as a table-column delimiter. It does not neutralize: - Markdown link or image syntax; - embedded HTML; - carriage returns and line feeds; - other Markdown control characters; - unsafe or unexpected URL schemes; - excessively long values. An attacker who controls an issue title, label, package metadata field, or package link could supply content interpreted by a Markdown renderer rather than displayed as plain text. Depending on the Markdown viewer, this could produce deceptive links, remote tracking images ...[truncated 1605 chars]
Remediation
View remediation
]*>/g, "") .slice(0, maxLength) .replace(/([\\`*_{}\[\]()#+.!|>-])/g, "\\$1"); } function safeHttpsUrl(value) { try { const url = new URL(String(value)); return url.protocol === "https:" ? url.href : ""; } catch { return ""; } } ``` Apply context-specific encoding separately to display text and URLs. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/collect-openclaw-ecosystem.mjs:160
Finding

Declared HTTP and Robots Pause Controls Are Not Enforced Before Collection Continues

Content
View full analysis
Remediation
View remediation

other

Note
Location
trust/permission-manifest.md:12
Finding

Permission Manifest Omits Report and Persistent Log Writes

Content
View full analysis
> "${LOG_DIR}/earn-money-openclaw-monitor.log" 2>&1 ``` ### Technical Analysis The manifest's statement that no other filesystem writes are required is inconsistent with normal documented operation. The renderer writes to `reports/`, while the wrapper creates a directory under the user's home directory and persistently appends command output to a log. These writes are not malicious and are consistent with the documented functionality elsewhere in the project. The issue is inaccurate permission documentation rather than unauthorized privilege acquisition. ### Attack Path No direct exploitation path was identified. The concern arises during deployment or sandboxing: 1. An operator grants filesystem access based on the permission manifest. 2. The operator expects writes to be limited to the dated snapshot path. 3. The renderer attempts to write under `reports/`. 4. The wrapper creates and writes under `~/.openclaw/logs/`. 5. The undeclared writes either fail in a strict sandbox or o ...[truncated 458 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (12)

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

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

md
- Use official APIs when available.
- Store only normalized metadata, short summaries, hashes, timestamps, and canonical source URLs.
- Do not store secrets, cookies, access tokens, account IDs, or private user data.
- Do not bulk mirror package tarballs, docs pages, README files, or issue bodies.
- Stop on 403, 429, robots disallow, DMCA/abuse signal, or platform warning.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/collect-openclaw-ecosystem.mjs

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The collector fetches full response bodies into memory and preserves excerpts/text-derived data even though the skill claims metadata-only collection. This creates a policy/implementation mismatch that can retain more third-party content than intended, increasing compliance, privacy, and data-handling risk if stored outputs are redistributed or later expanded.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/collect-openclaw-ecosystem.mjs (reported line 160)May include surrounding context.

js
async function main() {
  await mkdir(outputDir, { recursive: true });

  const githubRepo = await fetchJson("github_repo_openclaw", "https://api.github.com/repos/openclaw/openclaw");
  const githubIssues = await fetchJson(
    "github_issues_openclaw_good_first",
    "https://api.github.com/search/issues?q=repo%3Aopenclaw%2Fopenclaw+is%3Aissue+state%3Aopen+label%3A%22good+first+issue%22&per_page=10"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/collect-openclaw-ecosystem.mjs (reported line 163)May include surrounding context.

js
async function main() {
  await mkdir(outputDir, { recursive: true });

  const githubRepo = await fetchJson("github_repo_openclaw", "https://api.github.com/repos/openclaw/openclaw");
  const githubIssues = await fetchJson(
    "github_issues_openclaw_good_first",
    "https://api.github.com/search/issues?q=repo%3Aopenclaw%2Fopenclaw+is%3Aissue+state%3Aopen+label%3A%22good+first+issue%22&per_page=10"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/collect-openclaw-ecosystem.mjs (reported line 167)May include surrounding context.

js
async function main() {
  await mkdir(outputDir, { recursive: true });

  const githubRepo = await fetchJson("github_repo_openclaw", "https://api.github.com/repos/openclaw/openclaw");
  const githubIssues = await fetchJson(
    "github_issues_openclaw_good_first",
    "https://api.github.com/search/issues?q=repo%3Aopenclaw%2Fopenclaw+is%3Aissue+state%3Aopen+label%3A%22good+first+issue%22&per_page=10"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/collect-openclaw-ecosystem.mjs (reported line 171)May include surrounding context.

js
async function main() {
  await mkdir(outputDir, { recursive: true });

  const githubRepo = await fetchJson("github_repo_openclaw", "https://api.github.com/repos/openclaw/openclaw");
  const githubIssues = await fetchJson(
    "github_issues_openclaw_good_first",
    "https://api.github.com/search/issues?q=repo%3Aopenclaw%2Fopenclaw+is%3Aissue+state%3Aopen+label%3A%22good+first+issue%22&per_page=10"

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/collect-openclaw-ecosystem.mjs (reported line 175)May include surrounding context.

js
async function main() {
  await mkdir(outputDir, { recursive: true });

  const githubRepo = await fetchJson("github_repo_openclaw", "https://api.github.com/repos/openclaw/openclaw");
  const githubIssues = await fetchJson(
    "github_issues_openclaw_good_first",
    "https://api.github.com/search/issues?q=repo%3Aopenclaw%2Fopenclaw+is%3Aissue+state%3Aopen+label%3A%22good+first+issue%22&per_page=10"

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The declared source policy says the skill should store only metadata and avoid mirroring full source content, but the implementation collects full response text for every fetched source before summarization. Even if only portions are written for some records, the design still processes and temporarily holds complete upstream content, making accidental persistence or future misuse more likely.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The generated report makes a trust/assertion claim about an "active first P1 candidate" PR and states that no public mutation is performed, but that PR status is hard-coded and not derived from the snapshot input. In a monitoring/reporting skill, injecting unsupported operational claims undermines integrity and can mislead operators into suppressing legitimate actions or believing external state changes occurred when they did not.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This markdown file describes a destructive operation: deleting generated snapshots under a date-based data directory. The file does not warn that this step may permanently remove stored data or advise the user to verify backups or retention needs before proceeding.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

The report formatting uses new Intl.NumberFormat("en-US"), which forces a specific locale in generated output. This is a natural-language/locale policy concern because the skill does not offer any user choice or document why US English formatting is required.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.