Back to skill

Security audit

Chrome CDP Browser Operator

Security checks for vulnerabilities and agentic risk

Overview

This skill is an X/Twitter browser automation tool that can use a logged-in Chrome profile, collect contact details from posts, send notifications, and post replies when enabled, with important privacy and account-action risks under-disclosed.

Review this carefully before installing. Use only a dedicated low-privilege Chrome profile, keep CDP bound to localhost, avoid enabling Telegram unless you understand exactly what post data will be sent, and do not enable allowPublicReply or --apply unless you have reviewed drafts and accept automated public replies from the logged-in account.

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/browser_operator.py:347
Finding

Personal Contact Data Is Collected, Stored in Plaintext, and Optionally Relayed to Telegram

Content
View full analysis
list[str]: return sorted(set(match.group(0).strip() for match in CONTACT_RE.finditer(text or ''))) ``` ```python def notify(cfg: dict[str, Any], text: str) -> None: telegram = cfg.get('telegram') or {} if not telegram.get('enabled'): return target = str(telegram.get('target') or '').strip() if not target: return cmd = ['openclaw', 'message', 'send', '--channel', str(telegram.get('channel') or 'telegram'), '--target', target, '-m', text] account = str(telegram.get('account') or '').strip() if account: cmd.extend(['--account', account]) subprocess.run(cmd, check=False, capture_output=True, text=True, timeout=30) ``` ```python item['score'] = score_candidate(item['text']) item['contactSignals'] = detect_contacts(item['text']) item['replyText'] = build_public_reply(item['text'], website_url) drafts.append(item) drafts.sort(key=lambda row: (row.get('score') or 0, row.get('tweetId') or ''), reverse=True) for item in drafts[:max_replies]: if item['contactSignals']: notify(cfg, f'☎️ Browser contact signal: {item["url"]} | {", ".join(item["contactSignals"][:3])}') if apply and allow_public_reply: item['sendResult'] = post_reply(session, item['url'], item['replyText']) item['applied'] = True applied.append(item['tweetId']) state.mark_replied(item['tweetId']) ...[truncated 2496 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Playwright Dependency Is Not Version-Pinned

Content
View full analysis
Remediation
View remediation
`. 2. Generate and commit a lock file containing hashes using a dependency-management tool such as `pip-compile`. 3. Install dependencies with hash verification, for example `pip install --require-hashes -r requirements.txt`. 4. Use only a trusted package index and disable unapproved supplemental indexes. 5. Add automated dependency vulnerability and provenance scanning to the release process. 6. Review and deliberately update the pinned version on a controlled schedule rather than accepting updates implicitly. 7. Pin and verify any separately installed browser binaries where the deployment process permits it. ]]>
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
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (14)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill is presented as a generic Chrome CDP operator, but it appears to generate configuration and scaffolding for a specific social-media monitoring and public-reply workflow. This mismatch obscures the actual operational purpose and can mislead users or automated systems into granting broad browser and filesystem access to a tool that is materially narrower, riskier, and capable of automating public actions from a logged-in account.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The skill is presented as a generic Chrome CDP operator, but it appears to generate configuration and scaffolding for a specific social-media monitoring and public-reply workflow. This mismatch obscures the actual operational purpose and can mislead users or automated systems into granting broad browser and filesystem access to a tool that is materially narrower, riskier, and capable of automating public actions from a logged-in account.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The code extracts phone numbers and email addresses from tweet text and uses them as contact signals, which constitutes contact harvesting unrelated to the stated browser-operator purpose. In the context of a skill attached to a real logged-in Chrome profile, this increases privacy and abuse risk because personal data can be mass-collected from social content without clear disclosure or necessity.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The file materially exceeds the advertised scope of a general Chrome/CDP browser operator by implementing X/Twitter-specific search, lead scoring, and automated public reply workflows. This mismatch is dangerous because users may grant browser/profile access expecting generic automation, while the skill can instead perform reputation-affecting social-media actions from a logged-in account.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill manifest declares no explicit tool scope even though the skill behavior implies file read, file write, and shell access. That omission weakens least-privilege controls and prevents reviewers or calling agents from understanding the true execution boundary, increasing the chance of unsafe invocation or abuse.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The documentation instructs users to expose Chrome's remote debugging port and keep the browser profile logged in, but it does not warn that anyone with access to that port can inspect tabs, execute browser actions, and potentially access authenticated sessions. In the context of a skill explicitly designed to attach to a real logged-in Chrome profile, this omission materially increases the chance of account takeover or privacy compromise if the port is exposed beyond the local machine or if local malware/users can connect.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill invokes an external messaging utility to send Telegram notifications, extending the skill from browser automation into outbound data transmission. This is risky because data derived from browser activity, including possible contact details, can be exfiltrated to a third-party messaging destination configured outside the immediate browser workflow.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Contact details extracted from tweets are included in Telegram notifications and sent externally without any visible disclosure in this code path. This is dangerous because it silently propagates third-party personal data beyond the social platform into another service, creating privacy, compliance, and abuse concerns.

Content

No source excerpt is available for this finding.

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/browser_operator.py (reported line 119)May include surrounding context.

python
account = str(telegram.get('account') or '').strip()
    if account:
        cmd.extend(['--account', account])
    subprocess.run(cmd, check=False, capture_output=True, text=True, timeout=30)


def import_playwright():

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

When run with apply enabled and configuration allowing public replies, the code posts replies automatically from the attached X account without an interactive confirmation step or user-facing warning. In a skill that attaches to an existing logged-in browser profile, this can cause unauthorized public statements, spam, or reputational harm if triggered unexpectedly or misconfigured.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The installer generates a configuration that is explicitly tailored for X/Twitter monitoring and reply automation, including a fixed base URL, keyword harvesting, rate limits, cooldowns, and reply controls, while the skill metadata describes a generic Chrome/CDP browser operator. This mismatch is dangerous because it conceals the real operational behavior of the skill, increasing the chance that users enable browser automation against a logged-in social-media session without informed consent or adequate review.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
92% confidence
Finding

The dependency is unpinned, so installs may pull different Playwright versions over time, reducing reproducibility and potentially introducing vulnerable or breaking upstream changes without review. In a browser-automation skill that can drive a real logged-in Chrome session, unexpected dependency changes increase supply-chain and operational risk more than in a trivial utility.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
playwright

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The argparse description claims the script installs generic workspace files, but the produced configuration and helper outputs are specialized for an X.com engagement workflow. This is a transparency and trust issue: understated installer purpose can cause operators to run tooling that prepares social-media automation against an authenticated browser profile without realizing the specific scope.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

This code creates directories and writes two files, including a JSON configuration and a PowerShell launcher, under a path supplied by the user. Although the final printout shows resulting paths after the fact, there is no preceding comment, docstring, or explicit user-facing warning that the script will modify the filesystem.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.