T09 · Insecure Skill Coding Practices
- Location
scripts/inventory_market_cloud.py:14- Finding
Fixed External Feishu Table May Receive Sensitive User Data
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This steel-trading skill is broadly coherent, but its cloud publishing path can send inventory and contact data to a fixed Feishu table without enough user-specific control.
Review before installing. Use this only if you intend to share steel inventory and contact details through the documented marketplace, replace the Feishu destination with one you control, disable or explicitly configure scheduled pushes, and install dependencies in an isolated environment.
scripts/inventory_market_cloud.py:14Fixed External Feishu Table May Receive Sensitive User Data
scripts/requirements.txt:1Unbounded Third-Party Dependencies Create a Mutable Supply-Chain Risk
scripts/export_price_excel.py:94Spreadsheet Formula Injection in Price Report Export
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
This mismatch specifically notes local persistence of price history and related data without clear disclosure. In a business context, silent local storage of operational data can create confidentiality and retention risks, especially when users may assume the skill is only performing ephemeral queries.
This mismatch specifically notes local persistence of price history and related data without clear disclosure. In a business context, silent local storage of operational data can create confidentiality and retention risks, especially when users may assume the skill is only performing ephemeral queries.
This mismatch specifically notes local persistence of price history and related data without clear disclosure. In a business context, silent local storage of operational data can create confidentiality and retention risks, especially when users may assume the skill is only performing ephemeral queries.
This mismatch specifically notes local persistence of price history and related data without clear disclosure. In a business context, silent local storage of operational data can create confidentiality and retention risks, especially when users may assume the skill is only performing ephemeral queries.
This mismatch specifically notes local persistence of price history and related data without clear disclosure. In a business context, silent local storage of operational data can create confidentiality and retention risks, especially when users may assume the skill is only performing ephemeral queries.
This mismatch specifically notes local persistence of price history and related data without clear disclosure. In a business context, silent local storage of operational data can create confidentiality and retention risks, especially when users may assume the skill is only performing ephemeral queries.
This mismatch specifically notes local persistence of price history and related data without clear disclosure. In a business context, silent local storage of operational data can create confidentiality and retention risks, especially when users may assume the skill is only performing ephemeral queries.
This mismatch specifically notes local persistence of price history and related data without clear disclosure. In a business context, silent local storage of operational data can create confidentiality and retention risks, especially when users may assume the skill is only performing ephemeral queries.
This mismatch specifically notes local persistence of price history and related data without clear disclosure. In a business context, silent local storage of operational data can create confidentiality and retention risks, especially when users may assume the skill is only performing ephemeral queries.
The trigger set includes broad everyday terms, making accidental activation likely. In this skill, activation can lead to shell commands, file handling, external lookups, or publication workflows, so overbroad triggers increase the chance that unrelated user messages initiate high-impact operations or collect data without clear intent.
The skill's inventory publication flow includes contact names and phone numbers for public posting, yet the documentation does not adequately warn users that this information may be disclosed to others. In a B2B marketplace context, accidental exposure of personal or business contact data can lead to privacy violations, scraping, spam, and targeted social engineering.
The Feishu integration section documents direct reads and writes to an external platform using a specific app token and table ID, but does not warn users about external transmission, storage, or sharing boundaries. This creates a substantial risk of unintended disclosure of business inventory and contact information to a third-party service or wider audience than expected.
column_map is built with Chinese standard keys such as 价格, but the import loop later accesses column_map["price"]. This mismatch causes a runtime exception during import, so a crafted or even normal Excel upload can reliably trigger a denial of service for the import workflow and prevent inventory ingestion.
The skill declares broad capabilities including shell execution, file read/write, and network access but does not define any explicit tool scope or permissions boundaries. In this context, the documentation instructs the agent to run scripts, save uploaded files, write Excel output, and access external services, so the lack of least-privilege constraints materially increases the chance of unauthorized file access, command execution, or data exfiltration.
Vague trigger descriptions with unclear activation boundaries can cause the skill to engage in contexts the user did not intend. Because this skill advertises actions involving uploads, imports, external data sources, and inventory publication, ambiguous activation materially raises the risk of privacy mistakes and unintended operations.
对话风格指南以中文礼貌用语和固定中文措辞作为回复规范,但未说明是否可根据用户偏好切换语言或地区表达方式。按照政策要求,若强制单一语言而不给用户选择,属于语言/locale 约束不充分披露的问题。
The skill instructs users to upload Excel inventory files, save them to a temporary directory, and import them, but it does not warn about file contents, storage, validation, or downstream effects. Inventory spreadsheets often contain sensitive business data, and unclear handling increases the risk of confidential data exposure, unintended persistence, or processing of malicious files.
The skill instructs persistent scheduled execution via crontab, which creates ongoing autonomous behavior beyond the immediate user session. In a skill that performs network access, file operations, and data pushes, persistence increases the blast radius of misconfiguration or abuse and may continue transmitting data without fresh user intent.
设置定时任务:
# 每天 9:00 推送
crontab -e
# 添加:
0 9 * * * cd /workspace/projects/workspace/skills/steel-price-query && python scripts/push_daily.py
The configuration fixes the default region to 唐山 and default steel types to Chinese-language values, which imposes a specific locale/domain context by default. For all file types, hard-coded language or locale constraints should either be optional, user-selectable, or clearly justified as region-specific behavior.
The template enables scheduled push delivery by default and already includes a concrete WeChat target plus predefined market queries. In a B2B trading skill, this can cause unintended outbound messaging, privacy leakage, or silent notifications to real recipients once the skill is deployed with minimal review, especially if users or operators assume the template is inert.
This code file contains natural-language content entirely in Chinese, including the module docstring and later CLI descriptions and output strings, with no option for users to select another language. Under the policy rule, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is clearly documented and justified.
This Python file contains only Chinese-language docstrings, argument descriptions, and console output, which imposes a specific language on all users. Under the policy, locale constraints should either be optional/opt-in or clearly documented as region-specific and justified; that justification is not present here.
When replace_existing is enabled, the script silently removes prior inventory for matching suppliers before completing the new import. In a B2B inventory platform context, accidental or malicious triggering can cause unintended data loss and business disruption, especially because there is no confirmation, preview, or rollback.
No suspicious patterns detected.