T09 · Insecure Skill Coding Practices
- Location
scripts/subscribe_tracking.py:17- Finding
Subscription JSON output exposes stored phone verification suffixes
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill largely matches its courier-tracking purpose, but its claimed privacy protections are not reliably enforced and subscription output can expose stored phone suffixes.
Review carefully before installing. Use this only if you are comfortable sharing tracking numbers and optional phone suffixes with KDNiao, and avoid forwarding JSON or full logistics output into group chats until the phone-suffix leak and privacy-redaction enforcement are fixed.
scripts/subscribe_tracking.py:17Subscription JSON output exposes stored phone verification suffixes
scripts/privacy_settings.py:25Declared group privacy policy is not enforced by logistics output paths
声明描述的是一个面向用户的快递物流查询与提醒技能,核心能力应围绕快递 API 调用和物流信息处理展开。但提供的代码片段只是一个废弃脚本包装器:导入 check_changes.main,提示改用另一个脚本,然后退出并传递命令行参数。该片段的主要目的与快递物流无关,也没有体现声明中的任何关键能力。因此描述与实际代码行为存在明显不匹配。
声明描述的是面向用户的快递查询与提醒技能,而实际代码仅是配套的初始化脚本。它的主要作用是读取命令行参数或环境变量/交互输入,创建或校验本地 JSON 配置文件,并返回初始化或状态结果。虽然其中涉及快递鸟 API 凭据、隐私模式和订阅文件,和声明场景存在一定关联,但该代码块本身没有调用快递鸟 API、没有查询物流轨迹、没有执行订阅通知、没有提取取件码,也没有识别快递公司。因此这段代码的实际主要行为与声明的主要功能不一致,应判定为描述与代码行为不匹配。
声明描述的是一个面向用户的完整快递物流查询/订阅技能;但给出的代码片段只负责“群聊隐私策略”配置管理,包括 show/set-mode/trust/untrust/resolve 等命令,读写本地配置文件并返回 full/redact 等策略。虽然这与声明中的“群聊隐私脱敏”子功能有关,但它只是配套配置工具,无法支撑所宣称的核心能力。代码没有网络请求、没有调用快递鸟 API、没有处理快递单号、没有任何订阅或提醒逻辑,因此代码实际行为与声明用途存在明显且重大的不匹配。
代码主功能与声明中的“快递物流查询”部分一致,且确实包含有限的“快递公司识别”能力。但声明列出的多项关键能力在该代码中没有体现:没有任何订阅接口调用或持久化订阅管理;没有定时任务、轮询、调度或提醒发送机制;没有针对取件码的文本提取/解析;也没有群聊场景下的隐私脱敏处理。由于这些都是声明中明确列出的用户可用能力,而代码只覆盖查询与部分公司识别,因此描述高估了实际能力,构成描述与行为不一致。
The skill declares shell, file, environment, and network-relevant behavior through its documented commands and environment variables, but does not explicitly constrain tool scope. That creates an avoidable over-privilege risk: an agent or runtime may grant broader capabilities than necessary, increasing the blast radius if the skill is misused or compromised.
The entire skill documentation is written only in Chinese and does not indicate that another language can be used or that the locale restriction is optional. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the constraint is explicitly justified.
This Python file contains natural-language error messages and interactive prompts exclusively in Chinese, including the credential prompts and initialization errors. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is explicitly justified.
This Python file contains natural-language strings that force a specific language for errors and command descriptions. Under the stated policy, hard-coding a language without user opt-in or a documented region-specific justification is a natural-language policy violation.
The argparse description and success/status messages are presented only in Chinese, with no indication that users can choose another language. This creates the same language-policy issue across the main user interaction surface of the tool.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
from kuaidi_common import latest_trace_of, sorted_traces, state_icon, state_text
API_URL = "https://api.kdniao.com/api/dist"
HOME_CONFIG = Path(os.path.expanduser(os.environ.get(
"KUAIDI_CONFIG_FILE", "~/.openclaw/config/kuaidi-query.json"
)))
The script returns error messages, help descriptions, and status text in Chinese only, with no option for the user to select language or locale. This is a natural-language policy issue because the skill imposes a specific language rather than offering choice or documenting a justified locale restriction.
The README is written entirely in Chinese and the usage section instructs users to speak to the assistant using Chinese phrases, but it does not indicate that other languages are supported or that Chinese is an optional locale. This can be a natural-language policy issue when skills should not force a specific language without user opt-in.
This markdown file presents all user-facing guidance in Chinese and does not indicate that the skill is region-specific or that other language options are available. Under the policy, forcing a specific language without user opt-in can be a natural-language policy violation.
This markdown file is entirely presented in Chinese from the title onward, with no indication that users may choose another language or that the skill is intentionally restricted to a Chinese-only audience. Under the natural-language policy rule, forcing a specific language without opt-in can be a locale policy violation.
This code emits a user-facing stderr message only in Chinese: "daily_check.py 已弃用,请改用 check_changes.py". The policy requires avoiding forced language or locale constraints unless the skill offers user choice or clearly documents a justified region-specific limitation.
The argparse description shown to users is only in Chinese, which imposes a single language on all users. The file does not indicate that the skill is intentionally limited to Chinese-speaking users or a China-specific deployment context.
This code transmits the user's tracking number and, when provided, the recipient phone suffix to an external API via HTTP request. Although the module docstring says it queries tracking data, there is no explicit user-facing disclosure in the CLI help, output, or nearby comments that this information is sent to a third-party service.
The example values for all user-facing configuration fields are written only in Chinese, which constitutes a natural-language locale constraint in the file content. There is no indication that the skill is region-specific or that users may use another language, so this appears to enforce a specific language without opt-in.
No suspicious patterns detected.