T09 · Insecure Skill Coding Practices
- Location
scripts/query_rankings.py:52- Finding
TLS Certificate and Hostname Verification Disabled
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill mostly does what it says, but it handles subscriptions and contact delivery with weak safeguards and fetches ranking data over unauthenticated TLS.
Install only after reviewing the privacy and transport risks. Avoid using subscription delivery with real email or WeChat identifiers unless the storage file is protected, and treat generated Excel or email reports as untrusted until the TLS verification, spreadsheet escaping, and HTML escaping issues are fixed.
scripts/query_rankings.py:52TLS Certificate and Hostname Verification Disabled
scripts/export_to_excel.py:31Spreadsheet Formula Injection in Excel Exports
scripts/delivery_service.py:170Unescaped Data Embedded in HTML Email Reports
统计时间:{stat_date}
📊 排行榜图表
| 排名 | 账号名称 | 粉丝数 |
|---|
scripts/subscription_manager.py:77Subscriber Personally Identifiable Information Stored in Plaintext
A skill presented as a rankings tool but actually managing subscriptions, pricing tiers, user contact details, delivery scheduling, and send history materially expands the data handling and automation risk. Hidden collection and retention of email/WeChat identifiers can expose users to privacy harm, unwanted outreach, or misuse of stored personal data if the behavior is not clearly disclosed and consented.
A skill presented as a rankings tool but actually managing subscriptions, pricing tiers, user contact details, delivery scheduling, and send history materially expands the data handling and automation risk. Hidden collection and retention of email/WeChat identifiers can expose users to privacy harm, unwanted outreach, or misuse of stored personal data if the behavior is not clearly disclosed and consented.
A skill presented as a rankings tool but actually managing subscriptions, pricing tiers, user contact details, delivery scheduling, and send history materially expands the data handling and automation risk. Hidden collection and retention of email/WeChat identifiers can expose users to privacy harm, unwanted outreach, or misuse of stored personal data if the behavior is not clearly disclosed and consented.
A skill presented as a rankings tool but actually managing subscriptions, pricing tiers, user contact details, delivery scheduling, and send history materially expands the data handling and automation risk. Hidden collection and retention of email/WeChat identifiers can expose users to privacy harm, unwanted outreach, or misuse of stored personal data if the behavior is not clearly disclosed and consented.
Referenced artifact was not completely inspected
python3 scripts/query_rankings.py --category 综合全部 --type daily --limit 20 --output /tmp/rankings.json
Referenced artifact was not completely inspected
python3 scripts/query_rankings.py --category 综合全部 --type daily --limit 20 --output /tmp/rankings.json
Referenced artifact was not completely inspected
python3 scripts/query_rankings.py --category 综合全部 --type daily --limit 20 --output /tmp/rankings.json
Referenced artifact was not completely inspected
python3 scripts/query_rankings.py --category 综合全部 --type daily --limit 20 --output /tmp/rankings.json
The skill documentation advertises functionality that implies network access and local file read/write, but it declares no explicit tool scope or permissions. In an agent environment, this weakens user visibility and platform enforcement, making it easier for the skill to access files or external services without clear consent boundaries.
The documentation encourages automatic push subscriptions but does not clearly warn that the skill may continuously send data to external channels. Ongoing outbound delivery increases privacy and abuse risk because users may not realize recurring communications, destination exposure, or third-party processing are involved.
This code retrieves a WeChat access token and posts template message data containing the recipient OpenID and report contents to external WeChat endpoints. Although failures are printed, there is no confirmation prompt or explicit user disclosure warning that user/report data will be transmitted to a third-party service.
The code places the WeChat app secret directly into the token request URL query string. Secrets in URLs can be exposed through logs, proxies, monitoring systems, exception traces, and network tooling, increasing the chance of credential leakage even when HTTPS is used.
wechat_config = self.config.get('wechat', {})
# 获取access_token
token_url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={wechat_config.get('appid')}&secret={wechat_config.get('appsecret')}"
token_resp = requests.get(token_url).json()
access_token = token_resp.get('access_token')
The access token is embedded in the message-send URL as a query parameter. Access tokens in URLs are prone to leakage via logs, reverse proxies, analytics, debugging output, and monitoring, which could allow unauthorized API use until the token expires.
return False
# 发送模板消息
msg_url = f"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={access_token}"
payload = {
"touser": openid,
"template_id": template_id,
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
if url:
payload["url"] = url
resp = requests.post(msg_url, json=payload).json()
if resp.get('errcode') == 0:
return True
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
if url:
payload["url"] = url
resp = requests.post(msg_url, json=payload).json()
if resp.get('errcode') == 0:
return True
This Python file contains user-facing docstrings, CLI description, help text, and status/error messages exclusively in Chinese. The stated policy flags language or locale constraints when a skill forces a specific language without user opt-in, and this file does not offer any language selection or justify a region-specific limitation.
This code file contains natural-language descriptions and CLI help text that force a specific language/locale experience for users. Under the policy, language constraints should be optional or clearly justified; here the script presents Chinese-only instructions and labels with no opt-in or explanation that it is intentionally region-specific.
The command-line interface help strings and status messages are presented exclusively in Chinese, which constitutes a language/locale policy issue when no user choice is offered. Users who do not read Chinese cannot meaningfully understand prompts or outputs, and the file does not document this as a justified locale-specific tool.
The code claims to only omit SNI, but it also disables certificate validation and hostname checking via ssl.CERT_NONE and check_hostname=False. That allows man-in-the-middle interception or spoofing of the remote API, so returned ranking data can be silently modified and any transmitted query parameters exposed to an attacker on the network path.
This code file performs an outbound HTTPS request to a third-party endpoint using user-supplied parameters such as category, date, and source. Although the code has internal comments/docstrings, there is no user-facing disclosure at the point of execution that the script will contact an external service and transmit request data.
The manifest describes a skill for tracking Xiaohongshu follower-growth rankings and generating visual ranking charts. In this file, the implemented behavior is creating, updating, canceling, and listing subscriptions, including storing user contact fields like email and wechat_id, which is a different functional scope than rankings analysis or chart generation.
This file contains user-facing natural language in Chinese in the module docstring and throughout the CLI interface, which effectively forces a specific language for users. The policy allows locale constraints only when the skill offers opt-in language choice or clearly documents a justified region-specific requirement, neither of which is present here.
The script persists subscription records, including email and WeChat ID, to a local JSON file without any user-facing disclosure or visible safeguards. Storing personal data in plaintext local files increases the risk of unauthorized access, accidental leakage, or improper retention, especially because the skill context does not strongly signal that contact-data storage is part of its core purpose.
The code collects and stores personal contact data (email and WeChat ID) even though that data collection is not clearly justified by the skill description focused on rankings and charts. Unnecessary collection of personal data expands the privacy attack surface and increases harm if the local storage is exposed or mishandled.
Automatically copying generated images to the desktop creates local files outside the immediate output context and may surprise users in shared or managed environments. While lower severity, unannounced file creation can expose sensitive or proprietary content to other local users, backup systems, or sync services.
Detected: suspicious.insecure_tls_verification