Back to skill

Security audit

Openrouter Free Helper

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly does what it claims, but it can automatically start Chrome with remote debugging and run a browser automation dependency, which deserves user review before installation.

Review this before installing if you are not comfortable with a skill that may start Chrome with DevTools debugging on port 9222 and invoke bb-browser. Prefer running with API-only behavior if possible, pin dependencies, avoid global installs, and confirm Feishu notifications may include model names, links, and check timestamps.

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
package.json:22
Finding

Unbounded Dependency Versions Permit Unreviewed Supply-Chain Updates

Content
View full analysis

Vulnerability Details

File Location: package.json, lines 22–27
Vulnerability Type: Unpinned third-party dependencies
Risk Level: Medium

json
"dependencies": {
  "bb-browser": ">=0.11.0"
},
"pythonDependencies": {
  "requests": ">=2.31.0"
},

Technical Analysis

The project specifies bb-browser and requests using open-ended minimum-version constraints. No dependency lockfile is present in the audited project. Consequently, a future installation may resolve to a version that was not reviewed with this release.

The risk is particularly relevant for bb-browser because the skill invokes its executable locally and allows it to interact with a Chrome debugging endpoint. Documentation also recommends installing it globally with npm install -g bb-browser. A compromised, malicious, or unexpectedly incompatible future release could therefore execute with the installing user's privileges.

This finding does not establish that either currently published package is malicious. The vulnerability is the absence of reproducible, integrity-controlled dependency resolution.

Attack Path

  1. An attacker compromises a dependency maintainer account, package registry publication process, or another upstream distribution component.
  2. The attacker publishes a malicious version newer than the declared minimum.
  3. A user installs or updates the skill without a lockfile or exact version constraint.
  4. The package manager resolves the dependency to the malicious release.
  5. The dependency executes during installation or when the skill invokes bb-browser.
  6. The payload runs under the user's account and may access files, network resources, environment data, or the locally exposed Chrome debugging interface available to that process.

Impact Assessment

Successful exploitation could provide code execution with the privileges of the user installing or running the skill. The resulting scope may inclu ...[truncated 423 chars]

Remediation
View remediation

Remediation Suggestions

  1. Pin dependencies to exact reviewed versions, for example:
    json
    "dependencies": {
      "bb-browser": "0.11.0"
    },
    "pythonDependencies": {
      "requests": "2.31.0"
    }
    
  2. Commit the appropriate lockfile, such as package-lock.json, and use reproducible installation commands such as npm ci.
  3. Manage Python dependencies through a locked requirements or environment-management file containing hashes, such as:
    text
    requests==2.31.0 --hash=sha256:<verified-package-hash>
    
  4. Avoid global package installation where possible. Install bb-browser in a project-scoped environment and invoke the locked local binary.
  5. Configure automated dependency review and vulnerability scanning, but update versions only through reviewed pull requests.
  6. Verify package provenance and registry integrity before installation, and run browser-related dependencies with the minimum filesystem and network permissions required.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (21)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

声明描述的是一个完整的监控与通知技能,核心能力应包括:访问 OpenRouter 相关页面或 API、识别免费模型及其到期状态、比较变化以发现新模型、按日自动执行,以及向飞书发送通知。但提供的代码块仅实现了一个底层抓取工具函数 fetch_page(url),通过 requests 和 urllib 获取任意网页 HTML 内容,没有任何与 OpenRouter 业务规则、模型解析、状态比较、调度执行、消息推送相关的实现。虽然网页抓取可能是该技能的支持性组件,但从当前代码块本身看,其实际行为与声明的主要目的存在明显差异,因此应判定为不匹配。

Content

No source excerpt is available for this finding.

Lp1

High
Category
MCP Least Privilege
Confidence
96% confidence
Finding

The skill performs multiple outbound network requests to OpenRouter and may send Feishu notifications, but the network capability is apparently undeclared. Undeclared network access is high risk because it enables data exfiltration or unexpected communications without clear permission boundaries.

Content

No source excerpt is available for this finding.

Lp1

High
Category
MCP Least Privilege
Confidence
96% confidence
Finding

The skill performs multiple outbound network requests to OpenRouter and may send Feishu notifications, but the network capability is apparently undeclared. Undeclared network access is high risk because it enables data exfiltration or unexpected communications without clear permission boundaries.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

Automatically launching Chrome with remote debugging enabled can materially expand local attack surface because DevTools endpoints may allow browser control, cookie/session access, and page inspection if exposed or misused. Although the doc mentions auto-start behavior, it does not present it as a prominent security warning with risks, scope, and safe defaults, which is important for informed user consent.

Content

No source excerpt is available for this finding.

File System Enumeration

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code scans file system directories looking for sensitive files. This could be reconnaissance for credential theft.

Content

Scanner excerpt · README.md (reported line 244)May include surrounding context.

检查:

bash
# 查看适配器是否存在
ls -la ~/.bb-browser/sites/openrouter/

# 测试适配器
bb-browser site openrouter/free-models --json --openclaw

File System Enumeration

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code scans file system directories looking for sensitive files. This could be reconnaissance for credential theft.

Content

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

检查:

bash
# 查看适配器是否存在
ls -la ~/.bb-browser/sites/openrouter/

# 测试适配器
bb-browser site openrouter/free-models --json --openclaw

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

L299 说明“本地 Python 脚本不再伪装调用 OpenClaw 工具…不应在脚本里用 subprocess 硬模拟”,但紧接着 L303 又把 bb-browser site openrouter/free-models --json --openclaw 作为优先链路。若脚本实际按该说明实现,就需要调用外部命令,这与前述文档意图直接冲突。

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 operational instructions are entirely in Chinese and require a fixed output format, effectively constraining the skill to a specific language/locale. Under the policy, forcing a specific language without offering user choice or documenting a justified regional requirement is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

Starting Chrome in remote-debug mode and then driving an external browser tool is broader than needed for simple monitoring and meaningfully increases the local attack surface. Remote-debugging access can expose page contents, authenticated browser state, and powerful automation primitives if another local actor connects.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
89% confidence
Finding

The script launches a local Chrome instance with remote debugging enabled on port 9222. Chrome DevTools remote debugging can expose powerful browser-control capabilities, and if the port is reachable by other local processes or misconfigured networking, it can allow session inspection or browser automation beyond the stated monitoring purpose.

Content

Scanner excerpt · scripts/check-models.py (reported line 274)May include surrounding context.

python
profile_dir = "/tmp/openclaw-chrome-debug"
        
        # Start Chrome with debug port and isolated profile
        subprocess.Popen(
            [chrome_path, "--remote-debugging-port=9222", "--no-first-run", 
             "--no-default-browser-check", f"--user-data-dir={profile_dir}"],
            stdout=subprocess.DEVNULL,

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
80% confidence
Finding

The script executes an external browser automation tool, bb-browser, to scrape model data when the API path fails. Although arguments are fixed, invoking a broad external automation tool increases attack surface, relies on ambient local trust, and performs actions more powerful than simple model monitoring requires.

Content

Scanner excerpt · scripts/check-models.py (reported line 345)May include surrounding context.

python
if ensure_chrome_debug_mode(verbose):
        try:
            result = subprocess.run(
                ["bb-browser", "site", "openrouter/free-models", "--json", "--openclaw"],
                capture_output=True,
                text=True,

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/check-models.py (reported line 394)May include surrounding context.

python
"--message", message
        ]
        
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
        
        if result.returncode == 0:
            print("✓ Notification sent via Feishu")

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This script emits multiple natural-language strings in Chinese for alerts and summaries, which effectively forces a specific language/locale on users. The file does not offer any language selection or explain that the tool is intentionally region-specific, so it 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
73% confidence
Finding

The document is explicitly structured around Chinese and English sections, but it does not state whether users can choose language output or whether the bilingual constraint is intentional for a specific audience. Under the policy rule, forcing a specific language or locale without opt-in can be a natural-language policy concern.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The skill description states that daily automated checks send notifications through Feishu, which is an external service, but it does not explicitly warn users that model-monitoring results and related metadata will be transmitted off-system. For a markdown file, this qualifies as a missing user warning about behavior that could affect privacy or data handling.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

The features section documents 'bb-browser first, OpenRouter API fallback' and says Chrome is used only for enhanced discovery. However, the changelog explicitly says the discovery order was changed to 'API-first, bb-browser fallback,' which is a direct contradiction in the same documentation file about what the skill currently does.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
94% confidence
Finding

The technical implementation states the skill first tries bb-browser and only falls back to the OpenRouter internal API. But the v1.0.9 changelog says discovery order was switched to API-first with bb-browser fallback, creating an active documentation contradiction about runtime intent.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The cron example hard-codes the timezone to Asia/Shanghai, and the feature list later says all time calculations are based on Asia/Shanghai. This is a locale-specific constraint presented as a default behavior without user opt-in or explanation that the skill is region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

This line explicitly enforces a specific locale/timezone policy for all time calculations. Because the documentation does not offer a user choice here or frame the skill as region-limited, it conflicts with the requirement to avoid forcing a locale without opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The user-facing natural-language fields in the manifest are written entirely in Chinese, including the description and listed features. This can indicate a language-specific skill presentation without any explicit opt-in, alternative locale, or justification that the skill is intended only for a Chinese-speaking audience.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The document explicitly encodes support for English and Chinese expiration notice formats, but it does not explain how locale handling is selected or whether other languages are supported. Because SQP-3 covers language/locale policy issues, hard-coding specific locales without user opt-in or documented justification can be a policy concern.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.