T09 · Insecure Skill Coding Practices
- Location
scripts/fetch_and_summarize.py:76- Finding
Incomplete SSRF Filtering Permits Access to Local and Special-Purpose Network Addresses
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This URL summarizer is purpose-aligned, but its fetcher can reach unintended internal network addresses and stores fetched results locally with limited privacy safeguards.
Review before installing. Use this only in a constrained environment with egress controls or an allowlist for public domains, avoid sensitive or signed URLs, and consider disabling or tightly restricting the cache directory. Do not run it on hosts that can reach internal admin services or cloud metadata endpoints unless the SSRF protections are fixed.
scripts/fetch_and_summarize.py:76Incomplete SSRF Filtering Permits Access to Local and Special-Purpose Network Addresses
scripts/fetch_and_summarize.py:136Incomplete Secret Redaction and Plaintext Caching Can Persist Sensitive Response Data
Code accesses a cloud instance metadata endpoint (e.g. 169.254.169.254). A single request can return temporary IAM credentials, making this a high-value SSRF target for credential theft.
# Config
BLOCKED = {"file", "ftp", "data", "javascript"}
PRIVATE = [ipaddress.ip_network(n) for n in ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]]
CLOUD = {"169.254.169.254", "100.100.100.200"}
# Proper regex patterns
SECRETS = [
Code accesses a cloud instance metadata endpoint (e.g. 169.254.169.254). A single request can return temporary IAM credentials, making this a high-value SSRF target for credential theft.
# Config
BLOCKED = {"file", "ftp", "data", "javascript"}
PRIVATE = [ipaddress.ip_network(n) for n in ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]]
CLOUD = {"169.254.169.254", "100.100.100.200"}
# Proper regex patterns
SECRETS = [
The skill advertises network access, file writing, and environment-variable use through its described functionality, but it does not declare any explicit tool scope or permissions boundary. This creates a transparency and governance gap: operators may enable the skill without understanding that it can fetch arbitrary URLs, write cache files, and consume sensitive environment configuration.
The skill description does not clearly warn users that fetching external URLs may disclose the host's IP/network identity to remote servers, and that IP hiding is only optional. In a URL-fetching skill, this omission is materially risky because users may unknowingly use it on sensitive infrastructure, causing privacy leakage or unintended outbound contact to attacker-controlled endpoints.
This code fetches remote content from user-supplied URLs and writes the fetched analysis results to a local cache directory, but it provides no confirmation prompt, user-facing log, or warning about those operations. Because the skill transmits user-provided URLs over the network and persists results under ~/.cache/site-summarizer, users are not clearly informed that external requests and local storage will occur.
The skill returns the resolved server IP address in its output, which is unnecessary for URL summarization and can disclose infrastructure details about visited targets. While not a direct code-execution flaw, it leaks network metadata that may aid reconnaissance or reveal internal addressing if SSRF protections are bypassed or incomplete.
No suspicious patterns detected.