Back to skill

Security audit

Reddit Spy

Security checks for vulnerabilities and agentic risk

Overview

This read-only Reddit research skill is coherent, but it uses stealth scraping, Tor rotation, Reddit credentials, persistent cookies, third-party archives, and user profiling with weak controls.

Install only if you intentionally want a stealth Reddit scraping and analysis tool. Use a dedicated low-privilege environment, avoid supplying your main Reddit password, disable or control Tor/proxy/PullPush use for sensitive research, and regularly clear the .reddit-spy cache if session persistence is not desired.

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/lib/tor_client.py:19
Finding
Predictable Fallback Password for the Tor Control Interface## Vulnerability Details **File Location**: `scripts/lib/tor_client.py:19-47` **Vulnerability Type**: Hardcoded secret and insecure authentication fallback **Risk Level**: Medium ```python TOR_CONTROL_PORT = 9051 TOR_CONTROL_PASS = os.getenv("TOR_CONTROL_PASS", "openclaw_tor") def _rotate_circuit() -> None: try: from stem import Signal from stem.control import Controller with Controller.from_port(port=TOR_CONTROL_PORT) as c: c.authenticate(password=TOR_CONTROL_PASS) c.signal(Signal.NEWNYM) time.sleep(CIRCUIT_COOLDOWN) except Exception: time.sleep(CIRCUIT_COOLDOWN) ``` ### Technical Analysis When the `TOR_CONTROL_PASS` environment variable is absent, the code authenticates to the local Tor control interface using the predictable password `openclaw_tor`. Because this fallback is embedded in publicly inspectable source code, it does not provide meaningful secrecy. Circuit rotation is related to the declared network-fetching functionality, but control-port access is more privileged than ordinary SOCKS proxy access. Secure Tor deployments should use an explicitly provisioned secret or cookie authentication rather than a shared default password. Exploitation requires access to the Tor control endpoint, which is configured here as local port `9051`. The issue therefore primarily affects environments where an attacker already has local code execution, shares the host with untrusted processes, or where the control port is exposed beyond the expected boundary. ### Attack Path 1. The operator runs Tor with password authentication enabled and configures it to accept the fallback password. 2. `TOR_CONTROL_PASS` is not set, causing the Skill to use `openclaw_tor`. 3. An attacker with access to `127.0.0.1:9051`, or to an inadvertently exposed control port, obtains the fallback password from the Skill source. 4. The attacker authenticates directly ...[truncated 697 chars]
Remediation
## Remediation Suggestions - Remove the hardcoded fallback and require `TOR_CONTROL_PASS` to be explicitly configured when password authentication is used. - Prefer Tor cookie authentication, with the authentication cookie readable only by the Skill's dedicated operating-system account. - Fail closed when secure control authentication is unavailable rather than silently attempting a public default. - Run the Skill and Tor under separate, least-privileged service accounts where practical. - Ensure the Tor control port binds only to localhost or a protected Unix socket and is blocked by host firewall rules. - Do not share one control-enabled Tor instance between mutually untrusted workloads. - Log circuit-rotation failures without disclosing authentication material.

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding
Third-Party Dependencies Are Not Reproducibly Pinned## Vulnerability Details **File Location**: `requirements.txt:1-4` **Vulnerability Type**: Unbounded dependency resolution and supply-chain exposure **Risk Level**: Low ```text requests>=2.31.0 playwright-stealth>=1.0.6 playwright>=1.40.0 curl_cffi>=0.14.0 ``` ### Technical Analysis Every dependency uses a minimum-only version constraint. A future installation may therefore resolve to package versions that were not included in this audit. Python packages can execute code during installation and import, while Playwright-related components also possess broad browser, filesystem, and network capabilities. No malicious package or currently compromised version was established during this audit. The vulnerability is the absence of reproducible dependency controls, which expands the trusted code base to arbitrary future releases. The declared `curl_cffi` dependency also appears unused by the reviewed source code, unnecessarily increasing the supply-chain attack surface. ### Attack Path 1. A listed dependency or its publishing account is compromised, or a future release introduces malicious installation or import behavior. 2. A user installs the Skill using the minimum-only requirements. 3. The package resolver selects the compromised release because no exact upper bound, lock file, or hash restricts it. 4. Malicious package code executes during installation or when imported. 5. That code operates with the privileges of the user or service installing or running the Skill. ### Impact Assessment A compromised dependency could access the Skill process's environment variables, including Reddit credentials and proxy configuration; read or modify files available to the process; make arbitrary network requests; or execute local commands. The obtainable privileges are limited to those of the installation or runtime account. The practical impact could nevertheless be high if installation occurs as root, as suggested ...[truncated 199 chars]
Remediation
## Remediation Suggestions - Pin every direct and transitive dependency to reviewed versions through a lock file. - Require package hashes, such as with `pip install --require-hashes`, to prevent substitution of unreviewed artifacts. - Use a controlled dependency-update process with security review, automated vulnerability scanning, and regression testing. - Remove `curl_cffi` unless a verified runtime path requires it. - Install dependencies in an isolated virtual environment under a non-root account. - Pin and separately verify Playwright browser artifacts where the browser fallback is enabled. - Maintain explicit upper bounds if exact pins cannot be adopted immediately.
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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (37)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The documentation emphasizes avoiding blocks and using multiple stealth/fallback access layers, but those behaviors are not substantiated by the analyzed code behavior. In security terms, this creates operational risk: users may believe the tool provides anonymity or resilient access and expose themselves, their infrastructure, or their accounts based on inaccurate claims.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The documentation emphasizes avoiding blocks and using multiple stealth/fallback access layers, but those behaviors are not substantiated by the analyzed code behavior. In security terms, this creates operational risk: users may believe the tool provides anonymity or resilient access and expose themselves, their infrastructure, or their accounts based on inaccurate claims.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The documentation emphasizes avoiding blocks and using multiple stealth/fallback access layers, but those behaviors are not substantiated by the analyzed code behavior. In security terms, this creates operational risk: users may believe the tool provides anonymity or resilient access and expose themselves, their infrastructure, or their accounts based on inaccurate claims.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill advertises and documents capabilities that require environment access, filesystem interaction, and outbound network use, but it declares no explicit tool scope or permission boundaries. In an agent setting, missing scope declarations reduce transparency and can permit broader-than-expected execution, making review and policy enforcement harder.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill description does not prominently warn users that it uses Tor and stealth/fallback techniques to evade blocking while collecting subreddit and user-profile data. In this context, omission is risky because the skill is explicitly framed around covert access and profiling; users may unknowingly trigger policy, legal, reputational, or monitoring concerns.

Vague Triggers

Medium
Confidence
84% confidence
Finding
The description promises broad 'stealth Reddit intelligence' and the ability to browse and analyze 'any subreddit without getting blocked,' which is ambiguous and unconstrained activation language. In a security context, this framing encourages unrestricted scraping or evasive behavior and provides no guardrails on when the skill should be invoked, making misuse more likely and making operator intent harder to verify.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The manifest explicitly declares access to highly sensitive Reddit credentials, including username and password, without any accompanying disclosure, justification, or limitation on how those secrets are used. In the context of a skill marketed for 'stealth' browsing and avoiding blocking, this increases the risk that operators may supply powerful account credentials without understanding that the skill can authenticate, impersonate, or act through their Reddit account.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The manifest describes a Reddit intelligence skill focused on browsing, reading, analyzing, and using fallback access methods. This module additionally creates a cache directory under the user's home directory and stores browser state/cookies there, which is a persistent local data-storage behavior not implied by the manifest description.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The code persists full Playwright storage state to disk via context.storage_state(), which can include cookies and other session artifacts. In a stealth scraping tool, this creates a local privacy and token-handling risk because session material may survive across runs without clear disclosure, increasing the chance of unintended reuse, leakage, or misuse if the host is shared or compromised.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
Writing browser session state to a local file without user-facing warning is risky because it silently creates durable authentication and tracking artifacts on disk. In this skill, the stealth/bypass positioning makes the behavior more concerning, as persisted state can be reused for continued access and may expose sensitive session data if discovered locally.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The module transparently cascades requests across OAuth, Tor, stealth HTTP, browser automation, and PullPush archival services, which can send user-supplied targets and queries to multiple external systems without explicit caller consent at the point of use. In the context of a 'stealth' Reddit intelligence skill, this increases privacy, compliance, and operational risk because users may not realize their searches or URLs are being retried through anonymization, browser, or third-party archive layers.

External Transmission

Medium
Category
Data Exfiltration
Content
import requests

BASE_URL = "https://api.pullpush.io/reddit"
REQUEST_TIMEOUT = 20
MIN_DELAY = 1.5
_last_request: float = 0.0
Confidence
76% confidence
Finding
The hardcoded external endpoint is not inherently unsafe, but here it confirms that the skill is designed to transmit data to a non-Reddit third-party service. Given the skill's stated purpose of stealth browsing and fallback access, this increases the chance that sensitive research terms, target usernames, or subreddit interests are sent off-platform without users appreciating the exposure.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The client sends user-controlled subreddit names, search queries, and usernames to PullPush, a third-party service, with no indication in this file of consent, minimization, or disclosure. In a 'stealth' intelligence skill, this creates a real privacy and operational-security risk because user interests, targets, or investigative subjects may be exposed to an external archive provider.

Context-Inappropriate Capability

Medium
Confidence
91% confidence
Finding
The code requires highly sensitive Reddit account credentials, including a username and password, and uses the OAuth password grant flow to obtain tokens for a skill whose stated purpose is subreddit browsing and analysis. This expands the blast radius from anonymous/public data access to full account-scoped access and creates unnecessary credential handling risk if the environment, logs, or downstream code are compromised.

Description-Behavior Mismatch

Medium
Confidence
90% confidence
Finding
The fetch_user function accesses user-specific submission history, which goes beyond the declared subreddit-focused browsing capability and enables targeted profiling of individual Reddit users. In the context of a 'stealth' intelligence tool, this capability materially increases surveillance potential and can be used to collect or correlate personal behavioral data beyond the advertised scope.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The client persists all session cookies to a predictable file in the user's home directory without any notice, consent, or file-permission hardening. Stored cookies can reveal browsing state or be reused by other local processes/users, which is more concerning here because the skill is explicitly built for stealthy access and persistence across sessions.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
The manifest describes a Reddit browsing/analysis skill with fallback transport layers, but this module also pulls runtime configuration from the process environment via REDDIT_PROXY_URL. Accessing environment-supplied network routing is not an obvious requirement of subreddit reading itself and introduces a capability to consume externally provided sensitive network settings.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The function performs outbound network requests and sends request metadata such as headers, cookies, query parameters, and possibly searched content to old.reddit.com. In this file there is no confirmation, logging, or explanatory warning to disclose that user/system data may be transmitted over the network.

Missing User Warnings

Medium
Confidence
98% confidence
Finding
The Tor control password falls back to a hardcoded default value ('openclaw_tor'), which creates a predictable credential for a sensitive local control interface. If the Tor control port is enabled and reachable, local malware, a co-tenant, or misconfiguration could allow unauthorized circuit control and broader manipulation of the user's Tor process.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The code actively controls Tor's control port to issue NEWNYM and rotate exit circuits in response to 429/403 responses, which goes beyond ordinary content retrieval and is specifically designed to evade rate limiting or blocking. In the context of a 'stealth Reddit intelligence' skill, this increases abuse potential by automating access persistence despite service defenses.

Description-Behavior Mismatch

Medium
Confidence
94% confidence
Finding
The script's declared purpose is subreddit intelligence, but it also includes a user-intel command that profiles an individual user's posting behavior across subreddits. That scope expansion creates a real privacy and surveillance risk because operators can use the tool for person-focused monitoring without any explicit limitation, disclosure, or consent controls.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The user-intel command aggregates a person's posts, subreddit participation, and inferred patterns without presenting any privacy notice or warning to the operator. Even though the data may be public, packaging it into a profiling workflow materially increases surveillance capability and the risk of targeted harassment, doxxing, or other misuse.

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.31.0
playwright-stealth>=1.0.6
playwright>=1.40.0
curl_cffi>=0.14.0
Confidence
95% confidence
Finding
The dependency uses a lower-bound specifier (requests>=2.31.0) rather than pinning to an exact version, which makes builds non-reproducible and can pull in unexpected future releases with new vulnerabilities or breaking changes. In a security-sensitive scraping skill, dependency drift increases supply-chain risk because network-facing libraries may change behavior or introduce exploitable issues without review.

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
88% confidence
Finding
The manifest does not pin requests, so it is impossible to verify whether installation will select a version affected by known advisories such as credential leakage or TLS-related issues. This is dangerous because requests is a core HTTP client library, and the skill's network-heavy behavior increases exposure if a vulnerable release is pulled in.

Unpinned Dependencies

Low
Category
Supply Chain
Content
requests>=2.31.0
playwright-stealth>=1.0.6
playwright>=1.40.0
curl_cffi>=0.14.0
Confidence
95% confidence
Finding
playwright-stealth is unpinned and will resolve to whatever latest compatible version is available at install time, creating supply-chain and reproducibility risk. Because this package directly affects browser automation and stealth behavior, an unsafe or compromised release could materially alter runtime behavior in a tool explicitly designed to evade detection.

Static analysis

No suspicious patterns detected.