Back to skill

Security audit

Web Monitor

Security checks for vulnerabilities and agentic risk

Overview

This web-page monitor is mostly coherent, but it can fetch arbitrary URL targets, including local or internal resources, and persist the fetched content on disk.

Install only if you are comfortable with a local tool that sends requests to monitored URLs and stores page text and diffs on disk. Do not add file:, localhost, private-network, cloud-metadata, authenticated, confidential, or proprietary pages unless you have intentionally scoped and protected the data directory.

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

Error
Location
scripts/monitor.py:50
Finding

Unrestricted URL Fetching Enables SSRF and Local Resource Access

Content
View full analysis
str: """Fetch URL content, optionally extracting a CSS selector.""" req_headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) web-monitor/1.0" } if headers: req_headers.update(headers) req = Request(url, headers=req_headers) try: with urlopen(req, timeout=30) as resp: raw = resp.read().decode("utf-8", errors="replace") ``` The unrestricted function is reached using user-controlled or persistently stored URLs: ```python content = fetch_content(args.url, args.selector) ``` ```python new_content = fetch_content(url, watch.get("selector")) ``` ### Technical Analysis The URL supplied to the `add` command is passed directly to `urllib.request.urlopen()` without validating its scheme, hostname, resolved IP address, port, or redirect destination. The documented functionality only requires fetching public HTTP or HTTPS web pages. However, the implementation may also accept other handlers supported by `urllib`, including `file:` URLs. HTTP requests can target loopback, link-local, private-network, and cloud metadata addresses. Automatic redirects can also move a request from a public URL to a restricted internal destination. This creates an SSRF primitive and potential local-file read primitive. The fetched response is normalized and stored under the configured snapshot directory, after which the `snapshot` and `diff` commands can expose it through command output. ### Attack Path 1. An attacker persuades a user or Agent to add a crafted monitoring target, such as a loopback/private-service URL, cloud metadata endpoint, or `file:` URI. 2. The `add` command passes that v ...[truncated 1215 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
SKILL.md:29
Finding

Unpinned Runtime Dependency Creates Supply-Chain and Reproducibility Risk

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (4)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill documents operations that inherently require network access, local file reads/writes, and environment-variable use, but it does not declare any explicit tool scope or permissions boundary. This is dangerous because an agent may invoke the skill with broader-than-expected capabilities, making it harder for users and enforcement layers to understand or constrain what the skill can access.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This code fetches remote web content from a user-supplied URL and immediately stores the normalized page content to local snapshot files. While the tool's docstring says it tracks web pages and stores snapshots, there is no explicit user-facing warning in the command flow about remote requests being made and page contents being retained on disk, which is relevant to privacy and data-handling expectations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

The README explicitly states where data is stored but does not disclose that monitored page content and diffs may contain sensitive or proprietary information and will be persisted locally. In a monitoring tool, users may watch authenticated, internal, or confidential pages, so silent retention increases the risk of unintended exposure through local compromise, backups, shared accounts, or developer machines.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The skill states that snapshots and diffs are stored persistently in the user's home or workspace, but it does not clearly warn that this may save full or partial page content locally. This can create unintended retention of sensitive or copyrighted content, especially when monitoring authenticated, internal, or personal pages.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.