T01 · Skill Instruction Hijacking
- Location
SKILL.md:27- Finding
Agent instruction hijacking and mandatory promotional output
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This Meituan coupon skill matches its advertised purpose, but it under-discloses and insecurely handles account credentials and reminder/update behavior.
Install only if you are comfortable giving this skill your Meituan phone number, SMS code, and account token for coupon claiming. The reviewed version should not be treated as low-risk: it makes misleading local-only privacy statements, disables TLS checks on some auth requests, exposes tokens in script output/arguments, keeps decryptable logs, and can set reminders or run update/diagnostic flows. Prefer a version that fixes credential redaction, TLS verification, logging, update scoping, and accurate consent text.
SKILL.md:27Agent instruction hijacking and mandatory promotional output
scripts/auth.py:325TLS certificate verification disabled during sensitive authentication requests
scripts/auth.py:625Authentication credentials exposed through standard output and process arguments
scripts/auth.py:165Raw authentication and API responses stored with reversible weak encryption
SKILL.md:102Mandatory privacy statement contradicts actual remote transmission of sensitive data
references/DOCTOR.md:114Diagnostic workflow performs a state-changing live coupon claim
references/DOCTOR.md:25Diagnostic instructions install an unpinned third-party dependency
The skill advertises direct-link navigation, reminders, and richer promotion discovery, while the described implementation appears to rely mainly on API-returned fields and undeclared local logging/token-file access. This mismatch matters because users cannot accurately assess what the skill really does versus what data it consumes locally.
The skill advertises direct-link navigation, reminders, and richer promotion discovery, while the described implementation appears to rely mainly on API-returned fields and undeclared local logging/token-file access. This mismatch matters because users cannot accurately assess what the skill really does versus what data it consumes locally.
The skill advertises direct-link navigation, reminders, and richer promotion discovery, while the described implementation appears to rely mainly on API-returned fields and undeclared local logging/token-file access. This mismatch matters because users cannot accurately assess what the skill really does versus what data it consumes locally.
The skill advertises direct-link navigation, reminders, and richer promotion discovery, while the described implementation appears to rely mainly on API-returned fields and undeclared local logging/token-file access. This mismatch matters because users cannot accurately assess what the skill really does versus what data it consumes locally.
The skill advertises direct-link navigation, reminders, and richer promotion discovery, while the described implementation appears to rely mainly on API-returned fields and undeclared local logging/token-file access. This mismatch matters because users cannot accurately assess what the skill really does versus what data it consumes locally.
The trigger list includes very broad everyday phrases such as generic coupon, activity, welfare, or savings terms, which can cause unintended activation in unrelated conversations. Because activation can lead into login prompts, local token handling, network calls, and reminder setup, accidental invocation has meaningful privacy and consent implications.
The intent rules use broad semantic matching around consumption, discounts, and covered categories, making it easy for ordinary shopping or dining queries to be reinterpreted as coupon-claim intents. In a skill that handles authentication and persistent reminders, this increases the chance of non-consensual or confusing entry into sensitive flows.
The instructions direct retrieval and use of the complete user_token without any warning, masking requirement, or handling restriction. Full bearer-style tokens are highly sensitive; exposing them in commands, shell history, logs, process lists, or model-visible output can enable account takeover or unauthorized API use.
The skill declares no explicit tool/permission scope despite instructing use of shell execution, local file read/write, environment variables, and outbound network access. This weakens sandboxing and user review because the real capability surface is broader than the manifest communicates.
The instruction requires replies to be exactly the wording defined in SKILL.md, with no additions or rewrites. Because all prescribed user-facing content is in Chinese and no language choice or opt-in is offered, the skill imposes a fixed language/locale behavior on users.
The skill includes self-update checks and possible update/install actions via external platforms, which are outside the core advertised coupon function. Self-update logic expands supply-chain risk because it can introduce new code paths or fetch artifacts from remote services during normal user interactions.
The manifest frames the skill as a coupon领取、活动发现和自动提醒 tool. In addition to expected login support, it exposes explicit logout and device-token reset operations that alter stored authentication state and local device binding, which are broader account-management capabilities not mentioned in the manifest description.
Doctor mode executes an external diagnostic playbook unrelated to the main coupon purpose, creating an additional execution surface that may access local state or perform privileged troubleshooting actions. Even if manually triggered, hidden diagnostic paths are risky when they are not part of the declared functionality.
The diagnostic flow explicitly instructs the agent to read a locally stored user_token from disk and pass it to issue.py, which expands the skill from coupon assistance into credential handling and privileged API invocation. Even though framed as troubleshooting, this creates a pathway for sensitive token access and reuse that is unnecessary for normal conversational behavior and increases the chance of credential exposure or misuse.
The document authorizes reading local credential storage and showing raw JSON/API responses directly to the user, which is broader than the stated coupon/reminder purpose and risks exposing secrets, identifiers, internal error details, or backend behavior. Diagnostic documentation is still executable guidance to the agent, so this materially increases the attack surface and data leakage risk.
The manifest describes a user-facing coupon collection, activity link, and reminder skill, but this file implements a full embedded authentication subsystem for SMS login, persistent user_token/device_token management, and token verification. While some auth may support the skill, the manifest does not disclose that the skill manages account authentication state and device identifiers as a core behavior.
The version-check logic points users to a different external skill page than the manifested skill identity, creating an integrity and trust-boundary problem. In a security-sensitive authentication module, directing update checks to another skill page can facilitate user confusion, supply-chain mix-ups, or social-engineering-driven installation of unintended code.
The token verification request disables TLS certificate verification with verify=False while transmitting an authentication token to a remote endpoint. This allows a man-in-the-middle attacker on the network path to intercept or tamper with the request/response, potentially stealing the user token, forging token-validity responses, or altering authentication state.
"X-Requested-With": "XMLHttpRequest",
},
timeout=10,
verify=False,
trust_env=False
)
log_entry["response"] = {"http_status": resp.status_code, "body": resp.text[:500]}
The send-sms flow sends the full phone number in an HTTP request body to a remote endpoint, which is a privacy-relevant network transmission. Although the function docstring says it sends a verification code, there is no explicit user-facing warning, confirmation, or disclosure that the phone number will be transmitted to an external service.
The SMS-code send request also disables TLS certificate verification with verify=False while transmitting the user's phone number and device identifier. An active network attacker could intercept sensitive personal data, manipulate server responses, or redirect the authentication flow, which is especially dangerous in an account-login module.
"X-Requested-With": "XMLHttpRequest",
},
timeout=10,
verify=False,
trust_env=False
)
log_entry["response"] = {"http_status": resp.status_code, "body": resp.text[:500]}
The verify command sends both the user's phone number and SMS verification code to a remote endpoint and then stores the returned token locally. The code documents the mechanics in comments/docstrings, but it does not provide a clear user-facing warning that sensitive authentication data will be transmitted and a token persisted on disk.
This script reads a local auth token file and decrypts authentication logs, exposing sensitive operational data such as masked phone numbers, verification actions, result codes, and HTTP status. Even though it appears framed as a diagnostic utility, that capability is not aligned with the advertised coupon/reminder functionality, and the weak XOR-plus-hash scheme means anyone with local access and the config/token files can recover log contents.
The script reads local authentication material from ~/.xiaomei-workspace/auth_tokens.json and uses the device_token as part of the key material to decrypt stored logs. Even though it does not exfiltrate the token directly, this creates an unnecessary capability to access sensitive local auth context that is not aligned with the advertised coupon/reminder functionality, increasing the blast radius if the skill or its diagnostics are abused.
The script decrypts the issue log and prints the latest entry in cleartext, which can expose internal diagnostic data, request details, identifiers, or other sensitive contents to anyone with local execution access. In the context of a consumer coupon skill, this debugging capability is out of scope and makes accidental disclosure or misuse more likely.
The script reads a separate device token from ~/.xiaomei-workspace/auth_tokens.json solely to derive a log-encryption key, even though that credential is unrelated to the coupon-issuance function. Accessing an additional sensitive token without user disclosure expands the skill’s privilege boundary and creates unnecessary coupling to local secrets; if the log file or code path is abused, this can facilitate hidden tracking or misuse of unrelated credentials.
Detected: suspicious.insecure_tls_verification, suspicious.secret_argv_exposure