T09 · Insecure Skill Coding Practices
- Location
assets/main_handler.js:8- Finding
Unrestricted User-Controlled URL Navigation Enables Server-Side Request Forgery
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This appears to be a real web-scraping skill, but it can browse and return data from arbitrary URLs without enough safeguards against internal or unintended targets.
Install only if you are comfortable with a Dockerized browser scraper that can contact arbitrary third-party sites and print retrieved content. Use it with explicit public URLs only, avoid authenticated/private/internal targets, block container access to local networks and metadata services, and rebuild from reviewed, pinned dependencies and image provenance before using it in a sensitive environment.
assets/main_handler.js:8Unrestricted User-Controlled URL Navigation Enables Server-Side Request Forgery
assets/amazon_handler.js:3Amazon Handler Does Not Enforce an Amazon Destination and Permits SSRF
assets/youtube_handler.js:3Standalone YouTube Handler Navigates to an Unvalidated User-Supplied URL
Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.
async requestHandler({ page, log }) {
log.info(`Deep-Scraper starting in ${mode} mode for: ${targetUrl}`);
// Clear context to ensure a fresh session (avoid cache leakage)
const context = page.context();
await context.clearCookies();
The skill clearly instructs use of network-capable Dockerized scraping, but it declares no explicit tool scope or permissions boundaries. That creates a governance gap where an agent may invoke broad network access without transparent authorization, increasing the risk of unintended scraping, policy violations, or misuse against arbitrary targets.
The trigger list is extremely broad and includes common terms like 'extract', 'fetch data', 'search results', and generic website-content phrases, making accidental invocation likely. In an agent setting, overbroad routing can cause unintended network access, scraping of user-supplied or discovered sites, and collection of third-party data outside user expectations or policy boundaries.
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.
The generic-mode activation condition effectively routes any non-Amazon, non-YouTube URL or broad 'social media' scraping request into a networked scraper. That ambiguity increases the chance of the agent being used against arbitrary websites, which raises SSRF-like governance concerns, privacy issues, and unauthorized scraping risk even if the skill is intended for legitimate data collection.
The skill describes scraping arbitrary websites and social-media content but does not clearly warn about the implications of network access, site terms, privacy-sensitive data collection, or restrictions on authenticated/private content. In context, this omission is more dangerous because the skill is expressly designed for broad scraping and anti-bot evasion, so users and orchestrators may underestimate the operational and compliance risk.
The code sets the Accept-Language header to 'en-US,en;q=0.9', which imposes a specific language/locale on all requests. This is a natural-language policy concern because users are given no opt-in, override, or justification for the locale restriction.
The script prints a full JSON payload containing scraped product and page metadata to stdout, which can expose collected site content and URLs to downstream logs or calling systems. While the script logs progress, there is no explicit comment, prompt, or user-facing disclosure in this file warning that retrieved page data will be collected and emitted.
The YouTube path listens to browser network requests, extracts a transcript API URL, and then fetches transcript data from that remote endpoint. While this behavior is central to scraping, the file's visible documentation only shows a target URL argument and does not warn users that network traffic will be monitored and additional remote requests will be made to collect transcript content.
In generic mode, the script performs a network navigation to an arbitrary user-supplied URL, which can transmit request metadata and potentially expose the execution environment's IP or other system context. Although the file logs that scraping is starting, there is no clear disclosure in comments, prompts, or usage text that the script will contact third-party sites and retrieve their content.
The code emits Chinese log/output strings and relies on Chinese UI text such as '转录稿'/'转录' when interacting with the page. This enforces a specific language/locale behavior without user opt-in or configuration, which fits the language/locale policy violation category.
The script visits a user-supplied YouTube URL, monitors network requests, and fetches transcript data, but only emits internal progress logs and no user-facing warning about transmitting data to YouTube or collecting page/transcript content. Under the code-file criteria, network/HTTP operations that transmit or retrieve user/system data should have some visible disclosure unless clearly documented elsewhere, which is not present in this file.
When transcript capture fails, the code silently pivots to collecting and returning the video's visible description instead. That expands data collection beyond the apparent transcript-only purpose, creating a scope-creep/privacy issue and increasing the chance of returning content the caller did not explicitly request or expect.
The fallback rule instructing the agent to first search for a URL and then scrape it expands the skill from user-directed extraction into autonomous target discovery plus scraping. That broadens the blast radius because the agent may select and access third-party sites the user did not explicitly authorize, increasing the chance of policy, privacy, or compliance violations.
The dependency uses a caret range, which allows newer minor/patch releases to be installed over time instead of a single audited version. In a security-sensitive scraping skill that drives browsers and fetches remote content, this weakens supply-chain reproducibility and can silently introduce vulnerable or malicious updates.
"author": "Joseph",
"license": "MIT",
"dependencies": {
"crawlee": "^3.0.0",
"playwright": "^1.40.0"
},
"openclaw": {
The Playwright dependency is not pinned to an exact version, so builds may resolve to different releases over time. This is more concerning here because Playwright executes browser automation and may download browser binaries, increasing supply-chain and environment compromise risk if a bad release or vulnerable version is pulled.
"license": "MIT",
"dependencies": {
"crawlee": "^3.0.0",
"playwright": "^1.40.0"
},
"openclaw": {
"requires": {
The manifest references Playwright with a non-exact version, and Playwright has a cited advisory related to downloading/installing browsers without verifying authenticity. Because the version is not pinned, it is not possible to prove this skill avoids affected releases, which is risky in a containerized scraper that relies on automated browser setup.
No suspicious patterns detected.