T09 · Insecure Skill Coding Practices
- Location
scripts/monitor.py:194- Finding
Configuration-Controlled Product URLs Enable Server-Side Request Forgery
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a coherent competitor price monitor, but it uses overbroad network and file-writing behavior that needs review before installation.
Review this skill before installing. Use it only with trusted configuration files, restrict product URLs to real marketplace hosts, keep webhook notifications disabled unless the destination is verified, and avoid running it as a privileged user or on a network where it can reach internal services.
scripts/monitor.py:194Configuration-Controlled Product URLs Enable Server-Side Request Forgery
scripts/monitor.py:278Unsanitized Product Names Are Used to Construct Writable File Paths
scripts/monitor_v2.py:89Unrestricted Notification Webhook URLs Enable Blind Server-Side Request Forgery
The skill advertises one purpose while also including undeclared outbound notification capability via WeCom and DingTalk webhooks. Hidden or insufficiently declared network egress can expose monitored product data, business intelligence, or user-configured identifiers to third-party endpoints, especially in a competitor-monitoring context where collected data may be commercially sensitive.
The skill advertises one purpose while also including undeclared outbound notification capability via WeCom and DingTalk webhooks. Hidden or insufficiently declared network egress can expose monitored product data, business intelligence, or user-configured identifiers to third-party endpoints, especially in a competitor-monitoring context where collected data may be commercially sensitive.
The skill advertises one purpose while also including undeclared outbound notification capability via WeCom and DingTalk webhooks. Hidden or insufficiently declared network egress can expose monitored product data, business intelligence, or user-configured identifiers to third-party endpoints, especially in a competitor-monitoring context where collected data may be commercially sensitive.
The skill metadata does not declare any tool scope or permissions, yet the documented behavior includes reading configuration files, writing output/history, scheduling cron jobs, and sending outbound webhook/email notifications. This creates an authorization and transparency gap: users and the platform cannot accurately evaluate what the skill may access or where data may be sent.
The manifest description and the entire user-facing README content are written in Chinese, and there is no indication that users can select another language or that the skill is intentionally limited to a Chinese-speaking or China-only compliance context. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation.
The file-level natural-language description and all user-facing messages are written exclusively in Chinese, indicating the skill is intended to operate in a fixed language/locale. There is no visible option or documented mechanism for the user to choose another language, which conflicts with the policy against forcing a specific language without opt-in.
The alert content shown to users is entirely hard-coded in Chinese, including headings, recommendations, and status labels. Because the skill does not offer any user choice of language or state a justified region-specific restriction, this is a natural-language policy violation.
技能描述声明其用途是自动追踪竞品价格变动和上下架状态,属于监控与跟踪范畴。但这里在告警消息中加入“是否跟进”“建议价格:略低于竞品”等决策与定价建议,已经从监控扩展到经营策略输出,不再只是状态追踪。
The skill manifest describes a competitor monitoring assistant that supports 淘宝/京东/拼多多/亚马逊, and the module docstring similarly presents this as a production monitoring tool. In actual code, platform handling in check_product only covers jd.com, taobao.com, and tmall.com, with no Pinduoduo or Amazon implementation, and Taobao uses mock data rather than real tracking.
The top-level docstring states '生产版 v2' and '真实数据抓取', which implies live platform data collection. However, get_taobao_price explicitly labels the result as simulated data and returns hard-coded prices because authorization is unavailable, directly contradicting the 'real data' claim for that supported platform.
The file's natural-language strings and stated functionality are entirely Chinese-specific, including user-visible messages and messaging content, with no indication that users can opt into another language. Under the policy, forcing a specific language without user choice is a natural-language policy violation unless the locale constraint is clearly documented and justified.
This code sends generated monitoring messages to external WeCom webhook endpoints, which transmits business data off-host. While there are success/failure prints, there is no user-facing warning or explanatory comment/docstring indicating that monitored product details will be sent to third-party messaging services, so the data transmission lacks meaningful disclosure.
This code transmits monitoring results to an arbitrary webhook URL from configuration without any validation or restriction. In this skill context, competitor pricing and monitoring activity can be commercially sensitive, so a misconfigured or maliciously altered webhook can silently exfiltrate business intelligence to an attacker-controlled endpoint.
}
}
response = requests.post(webhook_url, json=data, headers=headers, timeout=10)
if response.status_code == 200:
result = response.json()
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
}
}
response = requests.post(webhook_url, json=data, headers=headers, timeout=10)
if response.status_code == 200:
result = response.json()
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
}
}
response = requests.post(webhook_url, json=data, headers=headers, timeout=10)
if response.status_code == 200:
result = response.json()
The function posts alert messages to a DingTalk webhook, sending monitored pricing information to an external service. Existing log messages only report send success/failure and do not clearly disclose the nature of the outbound transmission, leaving users without an explicit warning about external sharing.
The DingTalk notification path also sends alert content to a configurable external URL with no destination validation. Because the tool monitors competitor pricing, unauthorized outbound transmission could leak sensitive market-tracking data or internal response recommendations to third parties.
}
}
response = requests.post(webhook_url, json=data, headers=headers, timeout=10)
if response.status_code == 200:
result = response.json()
A full-file natural-language presentation in a single language can be a locale policy concern when no user choice or explicit scope is provided. Here, the skill documentation forces Chinese as the only visible language and does not state that the skill is region-specific or otherwise intentionally limited.
This markdown file includes configuration for a WeChat webhook and shows that price-change alerts are pushed externally. While the README explains how to configure the webhook, it does not explicitly warn users that monitoring results and related metadata will be sent to a third-party service, which is a user-facing disclosure relevant to privacy and data handling.
The configuration uses Chinese-only product names in user-facing values, which can indicate a fixed language/locale assumption. The file does not provide any language selection, opt-in mechanism, or documentation that this skill is intentionally limited to a Chinese marketplace context.
The entire markdown alert is presented in Chinese, including labels and status text, with no indication that the user opted into this locale or that the skill is region-specific. The policy requires flagging language or locale constraints when they are imposed without user opt-in or clear justification.
No suspicious patterns detected.