T09 · Insecure Skill Coding Practices
- Location
scripts/billing.py:48- Finding
SkillPay API Key Exposure Through Command-Line Arguments
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears to provide the advertised weather features, but its paid billing script can charge users and handle a billing API key with weak safeguards.
Review this before installing if you do not want an agent to initiate SkillPay charges automatically. Prefer using SKILLPAY_API_KEY from a protected environment or secret store, avoid passing --api-key on the command line, and confirm that you are comfortable with city names going to wttr.in and billing identifiers going to SkillPay.
scripts/billing.py:48SkillPay API Key Exposure Through Command-Line Arguments
The skill claims forecast and clothing recommendation features that are reportedly not implemented, creating a trust gap between the declared functionality and actual behavior. In the context of a paid skill, this is more dangerous because users may be charged for capabilities they never receive, and reviewers may miss the true operational behavior.
The skill claims forecast and clothing recommendation features that are reportedly not implemented, creating a trust gap between the declared functionality and actual behavior. In the context of a paid skill, this is more dangerous because users may be charged for capabilities they never receive, and reviewers may miss the true operational behavior.
The skill claims forecast and clothing recommendation features that are reportedly not implemented, creating a trust gap between the declared functionality and actual behavior. In the context of a paid skill, this is more dangerous because users may be charged for capabilities they never receive, and reviewers may miss the true operational behavior.
The skill advertises executable scripts and appears to require environment, network, and shell capabilities, but it does not declare any explicit tool scope or permissions. This weakens sandboxing and review controls, making it easier for the skill to access sensitive capabilities without transparent authorization and increasing the risk of unintended network calls, environment-variable access, or command execution.
The charge function sends a user identifier, skill identifier, amount, and description to a remote billing API, which is a safety-relevant network action affecting user data and billing state. The file contains no confirmation prompt, user-facing log message, or explanatory comment/docstring warning that a charge request will be transmitted.
This code hardcodes user-facing labels, clothing descriptions, tips, and formatted output entirely in Chinese across the recommendation data and display strings. The policy allows locale constraints only when documented and justified or when the user is offered a choice, neither of which is present in this file.
The formatted output hard-codes Chinese text such as '天预报', '体感', and '湿度' for all users. This imposes a specific language without user opt-in or a documented locale constraint, which is a natural-language policy violation under the stated rules.
The manifest advertises current weather, multi-day forecasts, clothing index, and dressing recommendations. In the implementation, get_weather reads only current_condition and nearest_area from wttr.in, and the output contains current conditions and a generic comfort assessment, with no forecast retrieval or clothing recommendation logic.
This code returns comfort labels and formatted weather output using Chinese strings such as "舒适", "温度", and "湿度". Because the skill does not offer any locale or language opt-in, it enforces a specific language in user-facing content, which matches the policy-violation category for language/locale constraints.
This markdown file contains user-facing natural-language guidance entirely in Chinese, but it does not indicate that the skill is Chinese-only or provide any user opt-in for the language. Under the policy, forcing a specific language without user choice can be a locale-policy violation.
The helper reads SKILLPAY_API_KEY from the environment, which is access to sensitive credentials. This file does not include any comment, docstring detail, or user-facing output explaining that the skill depends on and consumes a secret API key.
The balance function performs a network request containing the user_id to retrieve billing information from an external service. There is no user-facing warning, log statement, or explanatory comment indicating that user billing data is sent off-host.
The payment_link function transmits user_id, skill_id, and amount to a remote API to generate a payment link, which is a user-impacting network action. The code provides no warning, confirmation, or explanatory comment to disclose this external transmission.
The manifest describes a broader feature set including current weather and clothing/dressing recommendations. In this file, the code fetches forecast data from wttr.in, extracts per-day forecast fields, and formats forecast output, but there is no logic that computes or returns clothing advice, and no separate current-weather operation beyond using forecast/hourly data as a proxy.
This code constructs an external HTTP request to wttr.in using the user-supplied city value and transmits it over the network. There is no confirmation prompt, disclosure message, or explanatory comment warning that location-related input will be sent to a third-party service.
No suspicious patterns detected.