Back to skill

Security audit

gt-core-skill

Security checks for vulnerabilities and agentic risk

Overview

This Gumtree skill is not clearly malicious, but it needs review because it gives a local bridge broad control of an authenticated Chrome session without authentication and handles passwords unsafely.

Install only if you are comfortable granting a local Chrome extension and bridge access to your logged-in Gumtree session. Use a dedicated browser profile, avoid passing real passwords on the command line, stop the bridge when finished, and treat message sending, favouriting, logout, and post-ad navigation as real account actions.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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 (3)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/bridge_server.py:24
Finding

Unauthenticated Local WebSocket Channel Permits Arbitrary Gumtree Page Control

Content
View full analysis
None: try: raw = await asyncio.wait_for(ws.recv(), timeout=10) except (asyncio.TimeoutError, Exception) as exc: logger.warning("握手超时或失败: %s", exc) return try: msg = json.loads(raw) except json.JSONDecodeError: return role = msg.get("role") if role == "extension": await self._handle_extension(ws) elif role == "cli": await self._handle_cli(ws, msg) else: logger.warning("未知 role: %s", role) ``` ```python async def _handle_cli(self, ws: ServerConnection, msg: dict[str, Any]) -> None: if msg.get("method") == "ping_server": await ws.send( json.dumps( {"result": {"extension_connected": self._extension_ws is not None}}, ensure_ascii=False, ) ) return if not self._extension_ws: await ws.send( json.dumps( {"error": "Extension 未连接,请确认浏览器已安装并启用 Gumtree Bridge 扩展"}, ensure_ascii=False, ) ) return msg_id = str(uuid.uuid4()) msg["id"] = msg_id loop = asyncio.get_event_loop() future: asyncio.Future[Any] = loop.create_future() self._pending[msg_id] = future await self._extension_ws.send(json.dumps(msg, ensure_ascii=False)) ``` The extension accepts the forwarded command and exposes arbitrary JavaScript evaluation in the page's main execution world: ```javascript async function handleCommand(msg) { const { method, params = {} } = msg; switch (method) { case "navigate": return await cmdNavigate(params); case "wait_for_load": return aw ...[truncated 3362 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
extension/manifest.json:6
Finding

Chrome Extension Requests Unused Cookie and Debugger Privileges

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
gumtree_skills/cli.py:179
Finding

Gumtree Password Is Accepted Through Plaintext Command-Line Arguments

Content
View full analysis
" --password ""` ``` The documentation recognizes the exposure but does not provide a secure input method: ```text Credential arguments appear in shell history; avoid unnecessary repetition in summaries. ``` ### Technical Analysis Command-line arguments are not an appropriate transport for passwords. Depending on the operating system and terminal environment, argument values may be exposed through: - Shell history files. - Process listings and process inspection APIs. - Terminal session recording. - Command auditing and endpoint monitoring. - CI logs, wrapper scripts, or debugging output. - Synchronized shell-history services. Avoiding repetition in summaries does not prevent the original credential from being recorded when the command is invoked. Because `--password` is mandatory, users following the documented workflow cannot avoid this exposure. ### Attack Path 1. A user follows the documented login command and enters the Gumtree password after `--password`. 2. The shell records the complete command in its history, or the operating system exposes it in process metadata while the command runs. 3. Another local user, administrative monitoring agent, terminal logger, backup process, or history synchronization service reads the recorded arg ...[truncated 808 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (50)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The documented behavior understates the effective capability of a local CLI plus WebSocket-connected Chrome extension bridge. If the bridge supports arbitrary JavaScript evaluation or generic browser control beyond the listed Gumtree flows, the skill grants a much broader browser-automation surface than users are told, enabling data access or actions outside intended scope.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented behavior understates the effective capability of a local CLI plus WebSocket-connected Chrome extension bridge. If the bridge supports arbitrary JavaScript evaluation or generic browser control beyond the listed Gumtree flows, the skill grants a much broader browser-automation surface than users are told, enabling data access or actions outside intended scope.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The documented behavior understates the effective capability of a local CLI plus WebSocket-connected Chrome extension bridge. If the bridge supports arbitrary JavaScript evaluation or generic browser control beyond the listed Gumtree flows, the skill grants a much broader browser-automation surface than users are told, enabling data access or actions outside intended scope.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Work from the directory that contains `SKILL.md`, `pyproject.toml`, `uv.lock`, `scripts/`, and `extension/`.

Instruction Override

High
Category
Prompt Injection
Confidence
70% confidence
Finding

This pattern attempts to override system instructions or ignore safety constraints. Without LLM analysis, manual review is recommended.

Content

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

md
1. Run `uv sync`.
2. Open `chrome://extensions/`.
3. Enable Developer Mode.
4. Load the unpacked extension from `extension/`.
5. Confirm `Gumtree Bridge` is enabled.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
94% confidence
Finding

The extension silently maintains a localhost WebSocket control channel and executes inbound commands with no user-visible disclosure, prompt, or permission gating. This means browser actions can be remotely triggered by the local bridge or another local process without the user's awareness, including navigation and subsequent scripted interaction with authenticated Gumtree pages.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The background script accepts commands from a localhost WebSocket and dispatches them to navigation and page-execution handlers without meaningful trust validation. Combined with the evaluate path, this creates a remote-control primitive for the browser extension from any local process that can connect to the bridge, which exceeds the declared user-facing Gumtree workflow. Because the skill is meant for routine site automation, this broad command surface is more dangerous, not less justified.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

Dynamic evaluation in the page context is performed without any warning or consent, allowing hidden execution of arbitrary page-level JavaScript. On an authenticated marketplace site, that can expose personal data, messages, and account actions while leaving the user unaware that code is being run inside the page.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The extension executes attacker-controlled JavaScript in the page's MAIN world via Function(...${params.expression}...). Any process able to speak to the local WebSocket bridge can run arbitrary code in the Gumtree tab, access page data and user session state, and perform actions as the logged-in user. In this skill context, the stated purpose is narrow Gumtree automation, so a general-purpose eval primitive is unnecessary and materially increases risk.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill metadata says messages can be read, but this CLI also supports sending Gumtree messages via --message in both messages and detail-message. That capability mismatch is dangerous because an orchestrator or user may authorize the skill based on incomplete disclosures, resulting in unintended outbound communication on the user's account.

Content

No source excerpt is available for this finding.

Memory Manipulation

High
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Content

Scanner excerpt · scripts/gumtree/browser_messages.py (reported line 263)May include surrounding context.

python
const controlTexts = new Set([
    "Hide",
    "More options",
    "Delete conversation",
    "Upload Image",
    "Make an offer",
  ]);

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The file exposes message-sending capability through the optional message parameter and the _SEND_MESSAGE_JS path, while the stated manifest/description emphasizes reading messages. This creates a privilege/behavior mismatch: a caller expecting read-only access could trigger external side effects by supplying input, causing unauthorized contact with third parties from the user's authenticated Gumtree account.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The documentation explicitly shows passing a username and password on the command line, which can expose credentials through shell history, process listings, terminal logs, or CI telemetry. In a browser-automation skill that performs real account login, this is more dangerous because users are likely to paste live credentials exactly as shown.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README documents capabilities that can change account state and send messages to other users, but it does not prominently warn that these actions are side-effecting or require explicit user confirmation before execution. In an agent context, this increases the risk of unintended favourites, outbound contact, or other account actions being triggered from ambiguous prompts, leading to privacy, spam, or reputation harm.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill explicitly instructs running local shell commands and using a browser bridge, but it declares no tool/permission scope. That omission weakens policy enforcement and user awareness because the skill can invoke shell and network-capable components without an explicit allowlist boundary.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill instructs users to pass Gumtree credentials directly on the command line, which can expose secrets in shell history, process listings, logs, telemetry, and agent transcripts. Although it briefly notes shell-history risk, it still promotes an unsafe input pattern without offering a safer default.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The extension requests the powerful Chrome debugger permission even though the stated purpose is Gumtree automation via content scripts and a local bridge. This permission can inspect and control browser tabs at a much deeper level, potentially exposing page data, authentication material, network activity, and user interactions beyond what is necessary for the declared workflow; combined with localhost WebSocket access, it increases the blast radius if the extension or local bridge is compromised.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The login command accepts a password through a standard CLI argument, which is commonly exposed in shell history, process listings, logs, and telemetry. In a skill that automates a real browser session tied to a user account, this creates unnecessary credential exposure risk even if authentication itself is legitimate.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

Several commands perform account-affecting operations such as login, logout, favouriting, messaging, and initiating posting flow without explicit warnings or confirmations. In an agentic/browser-automation context, lack of friction around state-changing actions increases the chance of unauthorized or unintended actions on the user's marketplace account.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The messaging-related commands can transmit arbitrary user-provided content without any explicit disclosure or confirmation at the point of action. Because this skill operates a real Gumtree account, accidental invocation or prompt confusion could cause unintended messages to be sent to third parties.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
81% confidence
Finding

The manifest narrowly states 'start the post-ad category flow', which suggests only entering the initial category-selection step. The CLI help text says '发布二手物品(选择类目)' ('post second-hand item'), which presents a broader intent and can mislead users about the action being performed.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This code emits natural-language status and error messages in Chinese, beginning with the warning at L028 and continuing throughout the file. Because the skill does not offer any language/locale opt-in or indicate that it is intentionally China/Chinese-specific, it violates the language-choice policy for natural-language content.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This code contains user-visible error text in Chinese, and similar Chinese-only status/error messages appear throughout the file. For a general-purpose bridge client, forcing a single language without user opt-in or documented regional scope is a natural-language policy concern.

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/gumtree/bridge.py (reported line 86)May include surrounding context.

python
]
    for path in candidates:
        if os.path.exists(path):
            subprocess.Popen([path])
            return

    for cmd in [["open", "-a", "Google Chrome"], ["google-chrome"], ["chromium-browser"]]:

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/gumtree/bridge.py (reported line 91)May include surrounding context.

python
for cmd in [["open", "-a", "Google Chrome"], ["google-chrome"], ["chromium-browser"]]:
        try:
            subprocess.Popen(cmd)
            return
        except FileNotFoundError:
            continue

Static analysis

Detected: suspicious.secret_argv_exposure

Instructions pass high-value credentials through process argv.

Critical
Code
suspicious.secret_argv_exposure
Location
CLAUDE.md:26

Instructions pass high-value credentials through process argv.

Critical
Code
suspicious.secret_argv_exposure
Location
README.md:70

Instructions pass high-value credentials through process argv.

Critical
Code
suspicious.secret_argv_exposure
Location
SKILL.md:66