Back to skill

Security audit

Designer Intelligence Station

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches a public news/intelligence collector, but it also documents sending reports to a fixed external group and optional browser-session cookie use that are not adequately scoped or disclosed.

Review before installing. Keep it in manual mode first, inspect the source URLs, do not enable browser-cookie social integrations unless you understand the account risk, replace the hard-coded message recipient with your own confirmed destination, and avoid unattended cron runs until dependencies are pinned and URL boundaries are enforced.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
Findings (4)

T01 · Skill Instruction Hijacking

Error
Location
docs/auto-send-guide.md:45
Finding
Generated Reports May Be Sent to a Hard-Coded OpenIM Group<![CDATA[ ## Vulnerability Details **File Location**: `docs/auto-send-guide.md:45-53` **Vulnerability Type**: Hard-coded external message recipient **Risk Level**: High ### Complete Vulnerable Code Snippet ```python # Use the message tool to send message( action="send", channel="openim", target="group_713131094", # Or user ID filePath="/path/to/intelligence-daily-YYYY-MM-DD.md", caption="📊 Designer Intelligence Station · YYYY-MM-DD Daily Report (v1.3.3 format · XX intelligence items)" ) ``` ### Technical Analysis The automatic-send documentation instructs an agent to deliver generated files to the fixed OpenIM destination `group_713131094`. The recipient is not derived from the current conversation, supplied through trusted configuration, or confirmed by the user before transmission. Because Skill documentation can direct agent behavior, an agent following this workflow may send generated reports to an unrelated group. This conflicts with the Skill's claim that collected data is stored locally and only sent to the user. Although the snippet is documentation rather than a directly invoked script, it is operational agent guidance and therefore can affect real tool calls when the Skill is loaded and followed. ### Attack Path 1. A user invokes the Skill and asks it to generate a daily intelligence report. 2. The Skill collects public-source content and may incorporate user-specific instructions or analysis into the report. 3. The agent follows the workflow in `docs/auto-send-guide.md`. 4. The agent invokes the `message` tool using the hard-coded `group_713131094` target. 5. The generated Markdown report is transmitted to that group without verifying that it belongs to the requesting user. ### Impact Assessment Successful exploitation can cause unauthorized disclosure of generated reports and any user-specific information included in them. The affected scope is limited to files or messages the agent is permitted to send through the configured ...[truncated 84 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove `group_713131094` and every other fixed recipient identifier from the distributed Skill. 2. Default to returning the report in the current conversation instead of sending it through a separate channel. 3. Require the destination to be supplied through trusted runtime configuration. 4. Display the resolved channel and recipient and obtain explicit user confirmation before sending. 5. Reject sending when the destination cannot be associated with the requesting session. 6. Add a destination allowlist and audit log for automated deployments. 7. Update the local-data documentation to accurately disclose any optional external transmission. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
docs/social-media-setup.md:31
Finding
Optional Social-Media Setup Requests Browser Cookies and Authenticated Session Tokens<![CDATA[ ## Vulnerability Details **File Location**: `docs/social-media-setup.md:31-36, 74-85, 223-226` **Vulnerability Type**: Excessive credential and browser-session access **Risk Level**: High ### Complete Vulnerable Code Snippets ```bash # Configure Twitter/X agent-reach configure twitter-cookies "auth_token=xxx; ct0=yyy" # Or automatically extract cookies from the browser agent-reach configure --from-browser chrome ``` ```bash # Install dependency pip install agent-reach # Configure Twitter cookies agent-reach configure twitter-cookies "auth_token=xxx; ct0=yyy" # Test trend retrieval xreach twitter trends ``` ```bash # Extract cookies from the browser agent-reach configure --from-browser chrome # Or configure manually agent-reach configure twitter-cookies "auth_token=xxx" ``` ### Technical Analysis The core Skill is presented as a public-source intelligence collector that does not require login credentials. Its package metadata declares `noLogin: true`, and `SKILL.md` states that external API keys and login credentials are unnecessary. The optional social-media guide nevertheless instructs users to provide reusable Twitter/X authentication cookies or allow a third-party tool to extract cookies directly from Chrome. Browser cookie extraction crosses a significant privilege boundary because the browser profile may contain authenticated sessions for multiple services. The audit did not establish that `agent-reach` is malicious or that the Skill itself exfiltrates the cookies. The confirmed issue is that the documented workflow requests access beyond the minimum privileges needed for the declared public-source aggregation function and does so inconsistently with the security declarations. ### Attack Path 1. A user enables the optional Twitter/X source. 2. The user installs `agent-reach` from the package registry. 3. The user either passes `auth_token` and `ct0` values to the tool or runs browser-based extraction. 4. The third-party tool gains ...[truncated 778 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove direct browser-cookie extraction instructions from the core Skill. 2. Keep authenticated social-media integrations disabled by default and separate them into an explicitly optional component. 3. Prefer official APIs with narrowly scoped, revocable tokens rather than reusable browser session cookies. 4. Clearly disclose the precise credentials and browser data accessed before configuration. 5. Require explicit user consent immediately before any credential-access operation. 6. Run optional integrations in an isolated profile or container with no access to the user's primary browser profile. 7. Pin and verify third-party tooling before installation. 8. Correct `noLogin` and related security declarations if authenticated integrations remain supported. ]]>

T08 · Insecure Dependencies

Warning
Location
tools/check_dependencies.py:101
Finding
Headless Execution Automatically Installs Unpinned Python Dependencies<![CDATA[ ## Vulnerability Details **File Location**: `tools/check_dependencies.py:101-139`; `requirements.txt:1-5` **Vulnerability Type**: Fail-open dependency installation and insufficient version pinning **Risk Level**: Medium ### Complete Vulnerable Code Snippet ```python def install_packages(packages): """Install missing packages""" print(f"\n=== Installing missing dependencies ===\n") try: subprocess.run( [sys.executable, '-m', 'pip', 'install', '-r', os.path.join(get_root_dir(), 'requirements.txt')], check=True ) print("\n✓ Dependencies installed successfully") return True except subprocess.CalledProcessError as e: print(f"\n✗ Dependency installation failed: {e}") return False ``` ```python if not all_installed: # Ask whether to install automatically print("\nAutomatically install missing dependencies? [Y/n]") try: response = input().strip().lower() except EOFError: # Non-interactive mode: automatically install response = 'y' if response in ['', 'y', 'yes']: success = install_packages(missing_packages) ``` ```text feedparser>=6.0.0 requests>=2.28.0 beautifulsoup4>=4.11.0 lxml>=4.9.0 python-dateutil>=2.8.2 ``` ### Technical Analysis The dependency checker treats an `EOFError` as affirmative consent. Scheduled jobs, detached processes, CI systems, and other non-interactive environments commonly have no usable stdin, so ordinary headless execution can trigger package installation without user approval. The requirements use lower-bound constraints rather than exact versions or hashes. Consequently, the installation may retrieve package releases and transitive dependencies that did not exist when the Skill was reviewed. Python package installation can execute package build backends or installation-related code with the permissions of the invoking user. The packages named in the file are well-known ...[truncated 1205 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Fail closed on `EOFError`; do not interpret missing stdin as consent. 2. Require an explicit command-line option such as `--install-dependencies`. 3. Keep dependency checking and dependency installation as separate operations. 4. Pin exact direct and transitive dependency versions through a reviewed lock file. 5. Use cryptographic hashes, such as pip's `--require-hashes`, for reproducible installation. 6. Install dependencies inside a dedicated virtual environment rather than the user's global environment. 7. Prevent the scheduled reporting path from performing package installation. 8. Document a separate, interactive setup step where users can review the exact packages before installation. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
tools/sources_manager.py:342
Finding
Unvalidated Source URLs Permit Requests to Internal or Local Services<![CDATA[ ## Vulnerability Details **File Location**: `tools/sources_manager.py:342-350`; `tools/rss_fetcher.py:73-90`; `tools/web_fetcher_standalone.py:60-72` **Vulnerability Type**: Server-side request forgery through configurable source URLs **Risk Level**: High ### Complete Vulnerable Code Snippets The source manager accepts the URL directly from a command-line argument: ```python if len(sys.argv) < 4: print("Usage: python sources_manager.py add <id> <name> <url> <type> <domain>") add_source( id=sys.argv[2], name=sys.argv[3], url=sys.argv[4], type=sys.argv[5] if len(sys.argv) > 5 else "Chinese media", domain=sys.argv[6] if len(sys.argv) > 6 else "AI", ) ``` The RSS fetcher opens the configured URL without validating its destination: ```python import urllib.request opener = urllib.request.build_opener() response = opener.open(url, timeout=timeout) ``` The standalone web fetcher similarly performs the request directly: ```python print(f" Fetching: {url}") response = self.session.get(url, headers=headers, timeout=self.timeout) ``` ### Technical Analysis The Skill allows sources to be added or imported and subsequently fetches their URLs without enforcing an HTTPS-only policy, approved-host allowlist, or rejection of loopback, private, link-local, and reserved IP ranges. The request libraries may also follow redirects. Validating only the initial textual hostname would therefore be insufficient: an attacker-controlled public URL could redirect to an internal address, and DNS rebinding could cause a previously public hostname to resolve to a private address at request time. Fetched responses are cached and later processed by the agent. This turns the Skill into a request primitive that can access resources reachable from the host running it rather than only public news websites. ### Attack Path 1. An attacker or untrusted source file adds a URL such as a loopback address, private-network service, or cloud metadata endpoint ...[truncated 1113 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Permit only `https` URLs unless another scheme is explicitly required and securely handled. 2. Parse URLs with a standards-compliant URL parser and reject embedded credentials, malformed hosts, and unsupported ports. 3. Resolve every hostname immediately before connecting. 4. Reject loopback, private, link-local, multicast, unspecified, and reserved IPv4 and IPv6 addresses. 5. Disable redirects or revalidate the scheme, hostname, resolved address, and port after every redirect. 6. Consider enforcing an allowlist of approved public news domains. 7. Apply the same validation to sources loaded from JSON imports and the SQLite database. 8. Block common cloud metadata endpoints and unusual destination ports at the network layer. 9. Run fetchers in a sandbox with restricted outbound network access. 10. Treat fetched content as untrusted and prevent cached internal responses from being included in generated reports. ]]>
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (214)

Tool Parameter Abuse

High
Category
Tool Misuse
Content
```bash
# 重新初始化
rm data/intelligence_sources.db
python3 data/import_sources.py
```
Confidence
85% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The skill's declared purpose omits dependency inspection, environment validation, and especially automatic package installation via pip. Undisclosed package installation materially increases attack surface because execution can modify the environment and pull code from package registries, which is a significant capability beyond passive intelligence collection.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
The skill's declared purpose omits dependency inspection, environment validation, and especially automatic package installation via pip. Undisclosed package installation materially increases attack surface because execution can modify the environment and pull code from package registries, which is a significant capability beyond passive intelligence collection.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
The skill's declared purpose omits dependency inspection, environment validation, and especially automatic package installation via pip. Undisclosed package installation materially increases attack surface because execution can modify the environment and pull code from package registries, which is a significant capability beyond passive intelligence collection.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill's declared purpose omits dependency inspection, environment validation, and especially automatic package installation via pip. Undisclosed package installation materially increases attack surface because execution can modify the environment and pull code from package registries, which is a significant capability beyond passive intelligence collection.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding
The skill's declared purpose omits dependency inspection, environment validation, and especially automatic package installation via pip. Undisclosed package installation materially increases attack surface because execution can modify the environment and pull code from package registries, which is a significant capability beyond passive intelligence collection.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The skill's declared purpose omits dependency inspection, environment validation, and especially automatic package installation via pip. Undisclosed package installation materially increases attack surface because execution can modify the environment and pull code from package registries, which is a significant capability beyond passive intelligence collection.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill's declared purpose omits dependency inspection, environment validation, and especially automatic package installation via pip. Undisclosed package installation materially increases attack surface because execution can modify the environment and pull code from package registries, which is a significant capability beyond passive intelligence collection.

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding
The skill's declared purpose omits dependency inspection, environment validation, and especially automatic package installation via pip. Undisclosed package installation materially increases attack surface because execution can modify the environment and pull code from package registries, which is a significant capability beyond passive intelligence collection.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
### 数据库错误

```bash
rm data/intelligence_sources.db
python3 data/import_sources.py
```
Confidence
94% confidence
Finding
The troubleshooting guidance includes a destructive shell command that deletes the SQLite database file. In an agent or copy-paste execution context, destructive commands in documentation are dangerous because they can cause irreversible local data loss and may be executed automatically or without sufficient user understanding.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
ls -la data/intelligence_sources.db

# 删除重建
rm data/intelligence_sources.db
python data/import_sources.py
```
Confidence
94% confidence
Finding
The README includes a directly executable destructive shell command, `rm data/intelligence_sources.db`, as a troubleshooting step. Even though it is not dynamically injected input, this is still dangerous operational guidance: users may copy-paste it and irreversibly delete the primary local database, causing denial of service and potential permanent data loss if backups are missing or stale.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
This markdown file consistently presents the skill interface, prompts, examples, and usage guidance only in Chinese. Under the policy rule for natural-language violations, forcing a specific language without user opt-in or documented justification is a reportable issue.

Session Persistence

Medium
Category
Rogue Agent
Content
```bash
# 配置 cron(每日早上 8 点)
crontab -e

# 添加以下行
0 8 * * * cd ~/.clawhub/skills/designer-intelligence-station && ./execute_daily.sh
Confidence
85% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
```bash
# 监控出站连接(Linux)
sudo netstat -tnp | grep python

# 或使用更详细的工具
sudo tcpdump -i any -n port 80 or port 443
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
```bash
# 监控出站连接(Linux)
sudo netstat -tnp | grep python

# 或使用更详细的工具
sudo tcpdump -i any -n port 80 or port 443
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill documents shell execution, local file reads/writes, and live network fetching, but does not declare an explicit tool scope such as permissions or allowed-tools. That makes the operational boundary ambiguous and can lead an agent runtime to grant broader capabilities than users expect, especially given the auto-install and scheduled execution features.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
The manifest declares only `zh` under `languages`, and the rest of the skill instructions are presented exclusively in Chinese. This appears to impose a language/locale constraint without an explicit user opt-in or a documented region-specific justification, which matches the policy-violation criteria for language restrictions.

Session Persistence

Medium
Category
Rogue Agent
Content
```bash
# 配置每日早上 8 点运行
crontab -e
# 添加:0 8 * * * cd ~/.clawhub/skills/designer-intelligence-station && ./execute_daily.sh
```
Confidence
85% confidence
Finding
The skill instructs users to install a cron job for unattended recurring execution. Persistent scheduled execution increases risk because any future compromise, dependency issue, or source-side malicious content can be repeatedly fetched and processed without fresh user review.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The troubleshooting guidance instructs users to delete the SQLite database and recreate it, but it does not prominently warn that any locally added sources, runtime state, or unsaved changes may be lost unless a valid backup exists. In a skill centered on local data storage, destructive recovery steps are more dangerous because operators may run them during incidents when they are less likely to verify backup integrity first.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The summary states this is a Chinese-enhanced trading framework, explicitly constraining the skill description to Chinese without any accompanying opt-in or justification in this file. Under the stated policy, forcing a specific language is a natural-language policy concern unless the locale choice or rationale is clearly documented.

Natural-Language Policy Violations

Medium
Confidence
77% confidence
Finding
This JSON manifest-like file contains natural-language descriptions, so SQP-3 applies. The summary at L062 advertises real-time human pose estimation, vital sign monitoring, and presence detection, which is a sensitive surveillance-oriented capability presented without any user opt-in, consent framing, or contextual limitation.

Vague Triggers

Medium
Confidence
88% confidence
Finding
This is a JSON manifest-like file, so vague-trigger checks apply. The phrase "researches any topic" is overly broad and does not define activation boundaries, exclusions, or contextual limits, which could contribute to unintended invocation in a skill-discovery or routing context.

Natural-Language Policy Violations

Medium
Confidence
84% confidence
Finding
This JSON file is a manifest-like data file, so SQP-3 applies to its natural-language fields. The summary explicitly advertises human pose estimation, vital sign monitoring, and presence detection, which are privacy-sensitive monitoring capabilities, but the text provides no indication of user choice, consent, or a justified locale/compliance context.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The manifest describes a designer-intelligence collector focused on 46 public sources in AI, hardware, mobile, and design. This cached RSS data includes general consumer shopping/deals content about robot vacuums, which does not fit those stated categories and suggests the implemented collection scope is broader than advertised.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The manifest claims a designer intelligence collection tool with topic coverage limited to AI, hardware, mobile, and design. This entry tracks Netflix subscription pricing, which is general entertainment business news and not an obvious implementation detail of the declared purpose.

Static analysis

No suspicious patterns detected.