Back to skill

Security audit

Intel Search — News, Earthquakes, Iran, Tech

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent local news-search helper, but users should be aware it installs Playwright, fetches live web data, and stores captured feed data locally.

Install only if you are comfortable with a Node/Playwright skill that downloads a browser, fetches public World Monitor-related feeds, and keeps a local cache under ~/.openclaw/intel-data. Treat returned headlines, Telegram snippets, market text, and links as untrusted source data, not instructions to follow.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/fetch.mjs:90
Finding

Untrusted Remote Feed Content Is Passed to Agent-Facing Output Without Sanitization

Content
View full analysis
{ const link = item.link ? ` [原文](${item.link})` : ''; lines.push(`- **${item.title}** (${item.source})${link}`); }); lines.push(''); } } ``` ```javascript // scripts/fetch.mjs:117-131 const telegram = d['/api/telegram-feed?limit=50']; if (telegram?.data?.items?.length) { lines.push('## Telegram OSINT\n'); telegram.data.items.slice(0, 10).forEach((item) => { const raw = (item.text || item.content || '').replace(/\s+/g, ' ').trim(); const text = raw.slice(0, 120); const channel = item.channel ? `[@${item.channel}] ` : ''; const url = item.url ? ` [原文](${item.url})` : ''; if (text) lines.push(`- ${channel}${text}${url}`); }); lines.push(''); } ``` ```javascript // scripts/fetch.mjs:145-160 if (Array.isArray(first) && first[0]) { lines.push('## Polymarket 预测市场\n'); first.slice(0, 5).forEach((e) => { const q = e.question || e.title || e.markets?.[0]?.question; const slug = e.slug || e.markets?.[0]?.slug; const url = slug ? ` [市场](https://polymarket.com/event/${slug})` : ''; const desc = (e.description || e.markets?.[0]?.description || '').slice(0, 80); const hint = desc ? ` — ${desc.replace(/\n/g, ' ')}...` : ''; if (q) lines.push(`- ${q}${url}${hint}`); }); lines.push(''); } const briefPath = path.join(dataDir, 'intel-brief.md'); fs.writeFileSync(briefPath, lines.join('\n'), 'utf-8'); ``` ```javascript // scripts/query.mjs:221-226 for (const s of sections) { const sho ...[truncated 2938 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
package.json:10
Finding

Dependency and Browser Installation Is Not Reproducibly Locked

Content
View full analysis
Remediation
View remediation
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 Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (25)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/fetch.mjs

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/query.mjs [query] [time]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/query.mjs [query] [time]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/query.mjs [query] [time]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/query.mjs [query] [time]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/query.mjs [query] [time]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node scripts/query.mjs [query] [time]

Lp1

High
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The script reads environment variables to determine its output directory, including HOME/USERPROFILE and INTEL_DATA_DIR, but the capability is not declared. Undeclared access to environment-derived filesystem locations weakens permission transparency and can cause the skill to read from or write to sensitive user-controlled paths without explicit consent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This markdown file includes a natural-language instruction that the agent should translate for Chinese users, which imposes a locale/language behavior on a subset of users without describing opt-in or offering alternatives. Under the policy rules, forcing or presuming a language/locale preference without user choice is a reportable natural-language policy concern.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill advertises very broad trigger phrases like "what's new" and general topics, which can cause it to activate for ordinary user requests that may not actually require this capability. Overbroad activation increases the chance of unnecessary tool execution, including network fetch/update behavior and package installation steps, expanding exposure to operational and supply-chain risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file directs the skill to output LANG: zh or LANG: en based on the user's query language and to translate content to Chinese automatically for Chinese queries. This imposes a language/locale behavior without offering the user a choice or opt-in, which is a natural-language policy concern under the language preference rule.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

Claiming the skill should be used for "any keyword" makes activation boundaries unclear and effectively turns it into a catch-all search tool. In context, that is risky because the skill's documented workflow includes fetching/updating data first, so ambiguous activation can lead to unintended command execution and excessive access for routine conversations.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

The skill runs npx playwright install chromium without pinning a specific package version, which means execution behavior depends on whatever version resolves at runtime. This creates a supply-chain risk: a compromised, typosquatted, or unexpectedly updated package could execute unreviewed code during installation in the user's environment.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The package description claims data sources beyond the manifest-stated World Monitor source, specifically Telegram OSINT and Polymarket. This discrepancy expands the skill's apparent trust boundary and can mislead reviewers and users about what external content is being consumed, which is especially relevant for an intel/news skill where unvetted sources may introduce manipulation, privacy, or policy risks.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The setup script invokes npx playwright install chromium, which can resolve and execute a package version that is not explicitly pinned in the command path. Even though playwright is also listed as a dependency, relying on npx without a fully pinned package/version increases supply-chain risk and reduces reproducibility if package resolution behavior changes or if the command is run outside the expected dependency context.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The file's natural-language comments and generated output are written in Chinese, including the summary headings and descriptions, with no indication that language is configurable or chosen by the user. This can violate language/locale policy because it imposes a specific language without opt-in or documented justification.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill captures JSON API responses from a live website and persists them to disk as captured-data.json without a clear user-facing disclosure of what data is being stored, how much, or for how long. Because the capture logic broadly matches multiple endpoints and stores raw response bodies, sensitive or unexpected third-party data could be retained locally and exposed to other local processes or later misuse.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The header comment says '查什么都可以' and presents the script as a simplified general search with arbitrary time, but the code only reads two local files and searches within parsed sections and specific captured endpoints. This materially overstates the behavior compared with the actual implementation, which is a bounded local query over previously fetched intel/news data rather than general search.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The manifest describes a simplified search skill focused on a specific set of topics, but the topic map and downstream filtering include additional categories such as Telegram OSINT, politics, government, crisis, think tanks, strategic risk, Polymarket, and regional geographies. Those extra capabilities expand the semantic scope of the skill beyond the manifest's described focus areas.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script auto-detects language by checking whether the query contains Chinese characters and then emits a directive telling the agent to respond in Chinese or English accordingly. This enforces a language choice without presenting the user an explicit option or documenting a justified locale restriction.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The phrase "README.md (English first)" is a natural-language locale requirement in a markdown file. The file does not indicate that authors may choose another language or that this constraint is narrowly justified as a region-specific requirement, which matches the policy's language/locale violation criterion.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The tagline and description specify the skill as bilingual "EN/中文," which is a language/locale behavior stated in natural language without clarifying that the user can choose their preferred language. This may be interpreted as forcing or defaulting to specific languages without explicit opt-in.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

The manifest description describes broad capabilities like "Search locally captured World Monitor data like a simplified Google" and lists topics/keywords, but it does not define specific activation phrases, constraints, or exclusion conditions. This can make it unclear when the skill should activate versus when a general search request should be handled by something else.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
87% confidence
Finding

The dependency playwright is specified with a caret range (^1.49.0), allowing installation of newer compatible releases. This weakens build reproducibility and can unexpectedly pull in changed code or newly introduced vulnerabilities, which matters because Playwright also downloads and manages browser binaries as part of setup.

Content

Scanner excerpt · package.json (reported line 12)May include surrounding context.

json
"query": "node scripts/query.mjs"
  },
  "dependencies": {
    "playwright": "^1.49.0"
  }
}

Unverifiable Dependency: playwright has 1 known advisory(ies) (CVE-2025-59288 (Playwright downloads and installs browsers without verifying the authenticity of)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
81% confidence
Finding

The manifest uses an unpinned playwright version while the package family has a known advisory related to browser download authenticity verification. Because the installed release is not fixed to a known-safe version, it is not possible to verify from this manifest alone whether deployments are exposed, creating avoidable supply-chain uncertainty in a package that fetches executable browser components.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.