T09 · Insecure Skill Coding Practices
- Location
scripts/llm_client.py:21- Finding
Configurable LLM endpoint can expose API credentials and research content
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a coherent literature-reporting automation that uses expected network and LLM access, but users should protect API keys and review scheduled execution before enabling it.
Install only if you are comfortable sending paper titles, abstracts, and research-focus text to your chosen LLM provider. Use a trusted HTTPS base_url, keep config.yaml out of source control, prefer a virtual environment and a limited-spend API key, and review any cron entry before enabling daily runs.
scripts/llm_client.py:21Configurable LLM endpoint can expose API credentials and research content
install.sh:22Installer resolves unpinned dependencies and suppresses installation failures
The documented purpose does not mention that the skill may inspect local config files, validate API keys, and test external connectivity as primary behaviors. Those actions touch sensitive configuration and potentially transmit data externally, so failing to disclose them accurately creates a meaningful security and privacy risk even if the intent is not malicious.
The documented purpose does not mention that the skill may inspect local config files, validate API keys, and test external connectivity as primary behaviors. Those actions touch sensitive configuration and potentially transmit data externally, so failing to disclose them accurately creates a meaningful security and privacy risk even if the intent is not malicious.
The documented purpose does not mention that the skill may inspect local config files, validate API keys, and test external connectivity as primary behaviors. Those actions touch sensitive configuration and potentially transmit data externally, so failing to disclose them accurately creates a meaningful security and privacy risk even if the intent is not malicious.
The documented purpose does not mention that the skill may inspect local config files, validate API keys, and test external connectivity as primary behaviors. Those actions touch sensitive configuration and potentially transmit data externally, so failing to disclose them accurately creates a meaningful security and privacy risk even if the intent is not malicious.
The documented purpose does not mention that the skill may inspect local config files, validate API keys, and test external connectivity as primary behaviors. Those actions touch sensitive configuration and potentially transmit data externally, so failing to disclose them accurately creates a meaningful security and privacy risk even if the intent is not malicious.
The guide instructs users to place an API key and Feishu user identifier into a configuration file and to send generated report content to external services, but it provides no warning about credential handling, file permissions, secret storage, redaction, or data-sharing implications. In a skill that automates retrieval, summarization, and third-party delivery, this omission increases the chance of credential leakage or unintentional transmission of sensitive research topics or outputs.
The guide recommends setting up a persistent cron job that repeatedly executes scripts performing network retrieval and automated processing, but it does not mention safe execution context, least-privilege accounts, logging hygiene, or how to remove/disable the task. Persistent scheduled execution raises risk because misconfiguration or later script compromise would continue to run automatically and could repeatedly exfiltrate data or misuse stored credentials.
方法2:使用系统cron
crontab -e
# 添加以下行(每天早上9点执行)
0 9 * * * cd /path/to/research && python3 scripts/fetch_papers.py && python3 scripts/generate_summary.py
The markdown states the skill supports '自动推送' and later shows a send_to_feishu.py step, but it does not warn users that generated report content may be transmitted to Feishu or other external services. For a markdown file, omitting privacy or data-transfer disclosure for behavior that could affect user data matches the missing user warnings category.
The skill documentation declares installation, shell execution, network access, local file reads/writes, and scheduling, but it does not define any explicit tool scope or permissions boundary. In an agent environment, missing scope declarations can allow the skill to run with broader capabilities than users expect, increasing the blast radius for unintended file modification, command execution, or network use.
Broad activation phrases like '设置文献汇报' or '每天推送论文' can overlap with ordinary conversation and trigger the skill unexpectedly. In a skill that can invoke shell commands, read/write files, and use network resources, accidental activation increases the chance of unintended execution and unreviewed credential use.
The skill explicitly instructs users to send paper titles/abstracts and API-backed prompts to an external LLM endpoint, which constitutes external data transmission. In this context the transmission is part of the intended function, but it still creates privacy, confidentiality, and supply-chain risk because research topics, paper content, and potentially metadata leave the local environment and depend on a third-party service.
# LLM API配置(必须)
api:
api_key: "YOUR_API_KEY" # 你的LLM API Key
base_url: "https://api.siliconflow.cn/v1" # API基础URL
model: "deepseek-ai/DeepSeek-V3.2" # 模型名称
# 推送配置(可选)
The description states the skill is an '自动科研文献汇报系统' and specifically produces '双语摘要', but all user-facing metadata is presented in Chinese with no indication that language or locale is configurable. This creates a natural-language locale policy concern because the skill appears to impose a specific language context without explicit user opt-in or justification as a region-specific tool.
The module documentation and prompt content require Chinese-language behavior, including a Chinese-only output format and default Chinese research focus. There is no opt-in, alternative locale handling, or explanation that this is intentionally restricted to a Chinese-language workflow.
This code performs an outbound network request to a configurable external endpoint using an API key and user/content-derived prompt data. External transmission is expected for an LLM integration, but it still creates a real security boundary crossing: data leaves the local environment, and if the configured base URL is untrusted or misconfigured, sensitive content could be exposed to unintended recipients.
}
try:
response = requests.post(
f"{base_url}/chat/completions",
headers=headers,
json=data,
The script sends paper titles and abstracts to an external LLM service, but there is no evidence of user notice, consent, or data-classification checks before transmission. Even if papers are public, abstracts, custom research topics, or future inputs may contain sensitive or proprietary information, creating privacy and compliance risk when routed to a third-party API.
Untrusted paper titles and abstracts are interpolated directly into the LLM prompt, so malicious paper text can include prompt-injection instructions that manipulate the model's relevance judgment. In this skill, that can poison filtering results, causing irrelevant or adversarial content to be selected, trusted, and potentially pushed downstream into summaries or notifications.
This Python file contains natural-language docstrings and error/help text exclusively in Chinese, including the module description and remediation guidance. Under the policy rule for language/locale, forcing a specific language without opt-in or a documented regional justification is a natural-language policy violation.
This code file contains natural-language descriptions and runtime messages exclusively in Chinese, beginning with the module docstring and continuing throughout the script. Under the policy, forcing a specific language without offering a user choice or documenting a justified locale constraint is a language/locale policy violation.
The manifest says the skill activates when users want to customize research topics, implying topic selection should be user-driven. In this file, both the keyword filter and the AI screening focus are fixed to a specific domain ('医疗设备相关研究'), so the implemented behavior is narrower than the claimed general custom-topic literature reporting capability.
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
'sort': 'pub_date',
}
response = requests.get(search_url, params=params, timeout=30)
data = response.json()
if 'esearchresult' not in data:
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
'retmode': 'xml',
}
response = requests.get(fetch_url, params=params, timeout=30)
# 简单解析XML(只提取标题和摘要)
import xml.etree.ElementTree as ET
The docstring states in Chinese that the script generates summaries and key findings and specifically generates a Chinese title, suggesting a fixed language behavior. There is no visible indication that users can opt into another language or that the Chinese-language requirement is explicitly justified as a region-specific constraint.
The script sends paper titles and abstracts to external LLM functions without any visible consent, disclosure, data-classification check, or sanitization step. While literature metadata is often public, abstracts can still be licensed, sensitive in some workflows, or contain unpublished/internal content if upstream inputs are modified, so silent transfer to a third-party API creates a real data-governance and privacy risk.
This is a concrete external transmission path: the skill posts prompt data containing paper content to a configurable remote endpoint. Because the destination is taken from configuration and there are no restrictions shown on scheme, host allowlisting, or data sensitivity checks, the skill could disclose user-provided or collected content to an unintended third party.
}
try:
response = requests.post(
f"{base_url}/chat/completions",
headers=headers,
json=data,
The code sends paper titles and abstracts embedded in prompts to an external LLM endpoint via HTTP without any visible consent flow, notice, redaction, or data-classification guard. In a literature-reporting skill, abstracts may include unpublished, proprietary, or subscription-restricted content, so silent third-party transmission creates a real privacy and compliance risk.
No suspicious patterns detected.