other
- Location
scripts/tms_delivery.py:458- Finding
Payment URI Disclosed to an Unrelated Third-Party QR Service
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches its courier-booking purpose, but it handles tokens, precise addresses, cancellations, and payment links in ways that need careful review before installation.
Review this skill before installing. Use it only if you are comfortable giving it a Tencent delivery token and storing delivery names, phone numbers, addresses, and coordinates locally. Verify payment links in WeChat/Tencent directly, avoid use on shared machines, and delete the token/session/address-book data when no longer needed.
scripts/tms_delivery.py:458Payment URI Disclosed to an Unrelated Third-Party QR Service
scripts/tms_delivery.py:77Access Token Stored in Plaintext Without Enforced Owner-Only Permissions
scripts/tms_delivery.py:636Delivery Contact and Precise Location Data Persisted Without Enforced File Protection
Referenced artifact was not completely inspected
python3 ./scripts/tms_delivery.py bootstrap
Referenced artifact was not completely inspected
python3 ./scripts/tms_delivery.py bootstrap
Referenced artifact was not completely inspected
python3 ./scripts/tms_delivery.py bootstrap
The estimate request sends sender/receiver names, phone numbers, and address/location coordinates to https://weixin.go.qq.com, which is a privacy-sensitive network transmission. While this is part of the skill's purpose, the code file lacks any explicit disclosure to the user that their contact and location data will be sent to an external service for quoting/order placement.
The skill instructs the agent to execute local Python scripts, access session state, use MCP-backed network actions, and handle tokens, but it declares no explicit tool scope or permissions boundary. That creates an overbroad-capability risk: an orchestrator may expose more filesystem, environment, or network access than intended, making prompt-injected or malformed flows more dangerous.
The skill title and operational description are presented entirely in Chinese, and the trigger guidance in the description is also Chinese-specific. This indicates the skill is effectively constrained to a specific language/locale, but the file does not offer the user a language choice or explicitly justify the restriction as a region-specific policy requirement.
The entire API contract and user-facing guidance are written as mandatory Chinese instructions, including quoted messages to display to users, with no indication that another language may be used or that the user can opt in to Chinese. Under the policy, forcing a specific language without user choice is a natural-language policy violation unless the locale restriction is explicitly documented and justified.
The natural-language instructions and user-facing responses in this file are exclusively Chinese, and there is no indication that the user can choose another language or opt in to this locale. Under the stated policy, forcing a specific language without user choice is a natural-language policy violation unless the locale constraint is clearly documented and justified.
This markdown file includes an invocation example, 「帮我从公司寄个文件到XX」, but does not define a constrained trigger set or exclusion conditions. Because the workflow file lacks negative examples or scope boundaries, the activation guidance is somewhat ambiguous and could match ordinary conversational requests beyond the intended skill context.
This markdown file contains all operational instructions, triggers, and user-facing guidance exclusively in Chinese. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale constraint is explicitly documented and justified, which is not present here.
The documentation expands the skill's behavior beyond Tencent Mobility delivery by directing payment-link handling through an external QR service. In a payment context, this broadens the trust boundary and can leak order/payment metadata or expose users to tampering, tracking, or service substitution risks.
The referenced external endpoint indicates direct transmission of payment-related URL data to api.qrserver.com. In this skill context, the external transmission occurs during checkout and is more dangerous because users are being guided to complete payment, making confidentiality, integrity, and trust-boundary violations materially significant.
`book-order` 返回值已包含 `reply_template` 字段,**原样贴给用户即可**。
`reply_template` 内部已:
- 使用 `payInfo.codeUrl`(首选,weixin:// 协议)通过 `https://api.qrserver.com/v1/create-qr-code/` 编码为二维码图片
- `codeUrl` 为空时兜底使用 `payInfo.scanUrl`
- 图片下方附带 `scanUrl` 纯文本兜底链接
- 已包含订单号 / 寄收地址 / 费用 / 支付完成提示
The skill instructs the agent to render payment data through a third-party QR generation service unrelated to the stated Tencent delivery capability. This causes payment URLs or deep links to be transmitted to an external domain, creating unnecessary data exposure and dependency on an untrusted service during a payment step.
The markdown explicitly sends payment QR/link content to a third-party QR code service without warning the user that payment data will be transmitted externally. Because the content includes payment entry points and may be associated with order details shown in the same template, this creates a privacy and phishing-surface issue at a sensitive transaction step.
The trigger condition includes very broad acknowledgements such as “OK” and “好了”, which are common conversational replies that may appear outside an actual payment-confirmation context. In a delivery skill tied to order-state transitions and address-book prompts, this can cause unintended activation of the post-payment flow, leading to confusing order handling, unnecessary backend queries, or follow-on actions based on ambiguous user intent.
The document is entirely written in Chinese and prescribes fixed Chinese user-facing reply text such as prompts and warning messages. There is no indication that users may choose another language or that the locale restriction is optional or region-justified, which creates a language/locale policy concern.
The cancellation flow treats many generic acknowledgements such as “好”, “嗯”, “是”, and “确认” as authorization to execute a destructive action. In a conversational interface, these replies are easily elicited by ambiguous prompts or can refer to understanding rather than consent, creating a real risk of unintended order cancellation and associated cancellation fees or service disruption.
The skill enforces a Chinese-only token acquisition reply template and explicitly forbids any additional content, which can prevent the agent from communicating critical setup and consent information in the user's language. In a delivery skill that handles authentication tokens and order actions, this raises the risk of user confusion, mistaken credential handling, and inaccessible operation for non-Chinese readers.
The document explicitly describes persisting sensitive delivery data in a local session file, including sender/receiver names, phone numbers, and address/location details. Although it says not to leak data to the user and to avoid direct file access, it does not mention encryption, retention limits, access controls, or explicit user notice/consent, so local privacy exposure remains if the host is shared, compromised, or logs/backups capture the file.
The script stores the Tencent access token in plaintext under ~/.config/tms-delivery/env.json without any file-permission hardening, encryption, or user consent flow in this file. A local attacker or another process running as the same user could recover the token and make authenticated MCP requests as the user.
The mcp-call command exposes a generic pass-through interface to any MCP tool name and arbitrary JSON arguments, while the skill is supposed to be limited to same-city courier workflows. If the surrounding agent can invoke this script, an attacker could coerce the agent into calling unintended Tencent MCP capabilities using the stored access token, bypassing workflow guardrails implemented elsewhere in the file.
The payment template sends codeUrl data to https://api.qrserver.com/ to render a QR image. That leaks payment-related URL contents to an unrelated third-party service, potentially exposing payment session metadata or links that should remain only between the user and Tencent/WeChat.
if code_url:
# weixin:// 协议必须 URL 编码后再拼到 qrserver 的 data 参数
qr_src = (
"https://api.qrserver.com/v1/create-qr-code/?size=240x240&data="
+ quote(code_url, safe="")
)
else:
The skill persists contact names and phone numbers into a local session file without any evident retention minimization, permission hardening, or explicit notice in this code path. That creates a local privacy exposure: anyone with access to the host account or filesystem can read sensitive personal data from prior deliveries.
The inline documentation says diagnostic commands state show / state get 'directly print' and therefore are not affected by emit, but state_get at L0877-L0878 returns emit({"status": "ok", "session": session}). This is an active contradiction in intent/documentation about whether sensitive fields are filtered before reaching the LLM.