T09 · Insecure Skill Coding Practices
- Location
scripts/download_file.py:44- Finding
Arbitrary File Write Through Unsanitized Download Filenames
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This web automation skill largely matches its stated purpose, but it needs Review because it gives broad browser and download authority with unsafe defaults and weak local controls.
Review this skill carefully before installing. It is a powerful browser automation tool, not just a reader: use it only in isolated environments or with trusted tasks, avoid authenticated or sensitive websites unless you are supervising actions, do not submit forms without explicit review, avoid secrets in search queries, and treat downloaded files as untrusted. The download and persistent-browser implementation should be hardened before use in shared or high-trust environments.
scripts/download_file.py:44Arbitrary File Write Through Unsanitized Download Filenames
scripts/download_file.py:114Automatic Fallback to Unverified TLS Connections
scripts/download_file.py:114Unrestricted URL Navigation Enables Server-Side Request Forgery
scripts/browser_session.py:188Unauthenticated Shared Unix Socket Permits Browser Session Hijacking
scripts/browser_session.py:263Insecure Temporary Filename Creation During Range Screenshots
SKILL.md:12Unpinned Executable Third-Party Dependencies
A substantial description-behavior mismatch is a security problem because operators may authorize the skill based on the documented behavior while the implementation exposes additional capabilities such as arbitrary JavaScript execution, form input, or other browser actions. This can enable unintended website interaction, data submission, or broader browser-driven actions under false assumptions about what the skill does.
A substantial description-behavior mismatch is a security problem because operators may authorize the skill based on the documented behavior while the implementation exposes additional capabilities such as arbitrary JavaScript execution, form input, or other browser actions. This can enable unintended website interaction, data submission, or broader browser-driven actions under false assumptions about what the skill does.
A substantial description-behavior mismatch is a security problem because operators may authorize the skill based on the documented behavior while the implementation exposes additional capabilities such as arbitrary JavaScript execution, form input, or other browser actions. This can enable unintended website interaction, data submission, or broader browser-driven actions under false assumptions about what the skill does.
The skill is described as a browsing/extraction utility, but it also exposes an eval action that executes arbitrary JavaScript in any loaded page context. This materially expands capability from passive reading to active page-side code execution, enabling actions such as DOM manipulation, token extraction from page-accessible state, triggering authenticated workflows, or bypassing higher-level safety expectations about what the tool can do.
On SSL errors, the code retries the request with verify=False, disabling certificate validation and allowing man-in-the-middle interception or content tampering. Because this tool downloads files and may extract PDF text from them, accepting unverified HTTPS content directly undermines the integrity and authenticity of the data being saved and processed.
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
- **Screen reading on steroids** — extracts clean, structured text from any webpage, stripping away visual clutter, ads, and navigation noise
- **Voice-driven browsing** — when paired with an AI assistant, users can browse the web entirely through natural language ("scroll down", "click Sign In", "read me the Overview section")
- **Targeted content extraction** — grab specific sections, search for text, or screenshot regions without needing to visually scan a page
- **Form interaction** — fill inputs and submit forms via commands, removing the need for precise mouse/keyboard control
- **Cookie banner removal** — automatically dismisses consent popups that are notoriously difficult for screen readers
## Features
Automatically dismissing cookie banners can silently make or alter privacy consent choices on behalf of the user, especially when the implementation clicks broad 'accept' patterns. In an accessibility-focused agent skill, this is more sensitive because the agent is acting on behalf of users who may not be able to independently verify what consent decision was made.
The README advertises browser automation features that can click, fill, submit forms, and execute arbitrary JavaScript without any safety boundary or warning about side effects. In an agent context, these capabilities can cause unintended state-changing actions on third-party sites, account misuse, or execution of harmful page-context scripts if invoked without explicit user confirmation.
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.
| `click <target>` | Click by CSS selector, text, or button/link role |
| `scroll <dir\|sel>` | Scroll down/up or to a CSS selector |
| `wait <sec\|sel>` | Wait seconds or for element to appear |
| `fill <sel> <val>` | Fill input field (optional `--submit`) |
| `back` / `forward` / `reload` | Navigation history |
| `eval <js>` | Execute JavaScript, return result |
| `links` | Extract all links (href + text) |
The skill advertises network access and local file-writing behavior (downloads, screenshots) but does not declare any explicit tool scope such as permissions or allowed-tools. That omission weakens enforcement and user awareness, making it easier for the skill to be invoked in contexts where network and filesystem side effects are not expected.
The skill describes automatic cookie-banner dismissal and clicking behavior without a clear warning that it may interact with third-party websites on the user's behalf. In context, that increases the risk of unintended consent, accidental form interaction, or policy violations during browsing sessions.
The code automatically clicks cookie consent elements without informing the user or obtaining approval. That can silently alter privacy preferences, accept tracking, or interact with consent dialogs in ways the user did not intend, especially on regulated or sensitive sites.
The fill action supports entering data into arbitrary form fields and optionally submitting them, which exceeds a read-only or browse-oriented tool description. In context, this turns the browser session into an action-taking agent that can post data to websites, initiate workflows, or interact with authenticated sessions without an explicit trust boundary or confirmation step.
Form filling and optional submission occur with no user-facing confirmation, despite being state-changing web interactions. In a persistent visible browser, this can cause unintended account actions, data disclosure to third parties, or accidental submissions if the session is authenticated or handling sensitive information.
The script accepts an arbitrary --proxy value and passes it directly to requests for both HTTP and HTTPS traffic, allowing all downloads to be routed through an operator- or attacker-controlled intermediary. In a web-browsing/download skill, this expands the network trust boundary and can expose requested URLs, downloaded content, metadata, and potentially enable manipulation of non-TLS traffic or traffic sent after TLS-verification fallback.
This code performs a network request to an arbitrary URL and writes the response to disk, which are safety-relevant operations under the warning criteria for code files. Although the module docstring describes usage, it does not clearly warn that remote content will be fetched and saved locally, and there is no confirmation prompt before these actions.
The unsafe default verify=False disables HTTPS certificate verification during retry, making secure transport effectively optional under failure conditions. This creates a straightforward avenue for interception and response modification by any network adversary able to trigger or exploit certificate validation problems.
except requests.exceptions.SSLError:
# Retry without SSL verification if certs are broken
resp = requests.get(url, headers=headers, timeout=30, stream=True,
allow_redirects=True, proxies=proxies, verify=False)
resp.raise_for_status()
if not filename:
This script transmits user-provided search queries to third-party search engines over the network. In the context of an agent skill, queries may contain sensitive user data, internal identifiers, or secrets, so external transmission creates privacy and data leakage risk even though the behavior is expected for a web-search tool.
form_data = {"q": query}
for page in range(pages):
resp = requests.post("https://html.duckduckgo.com/html/", data=form_data, headers=HEADERS, timeout=15)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "html.parser")
The script programmatically clicks cookie/consent controls across the main frame and iframes without user awareness or consent. In a browsing automation skill, this can silently alter privacy choices, accept broader tracking than intended, and create compliance and trust issues, especially because the skill is designed to operate on arbitrary third-party sites.
This markdown file documents a download capability that saves remote content to a local directory, including a default output path. While the feature is expected, the description does not include any caution that it writes files to disk or that users should verify destination paths and downloaded content.
The skill supports downloading files and saving screenshots, both of which write data to the local filesystem, but the description does not clearly warn about those side effects. This can surprise users, create data-handling issues, or lead to storage of untrusted content in environments that assumed read-only behavior.
The skill hard-codes locale="en-US", which imposes a specific language/locale setting on all browser sessions. There is no user opt-in, alternative locale selection, or documented region-specific justification for this restriction.
The request headers hard-code Accept-Language to en-US,en;q=0.9, which imposes a specific language/locale on all searches. This matches the policy concern for language/locale constraints because the script does not provide any user opt-in or configuration for locale selection.
The Google-specific query parameters include hl: en, which explicitly forces English-language results. The script does not document this as a justified region-specific requirement or give users a way to choose another locale.
The code hard-codes locale="en-US" for all browsing sessions, which imposes a specific locale regardless of the user's preferences. There is no option to select a locale or documentation justifying why an English US locale is required.
No suspicious patterns detected.