T09 · Insecure Skill Coding Practices
- Location
scripts/global_news_fetcher.py:33- Finding
API Credentials Exposed Through URL Query Parameters
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill mostly does the described hot-topic roundup, but it includes under-disclosed extra news-fetching code that uses API keys and an unsafe fixed temporary-file write.
Install only if you are comfortable with scheduled outbound news retrieval and Discord-oriented posting. Before enabling automation, confirm the Discord destination, run it as an unprivileged account, remove or fix the /tmp backup write, and either document/remove the Currents/GNews backup module or provide only limited API keys you are willing to use for that purpose.
scripts/global_news_fetcher.py:33API Credentials Exposed Through URL Query Parameters
scripts/push.cjs:149Predictable Temporary File Permits Symlink-Based File Overwrite
A description-behavior mismatch is security-relevant because users may approve the skill expecting domestic hot-topic collection, while the package appears to fetch different news sources and may not actually perform the claimed Discord delivery. This undermines informed consent and can conceal unreviewed network behavior or undeclared data handling, which is especially risky for scheduled automation.
The skill declares executable behavior that requires network access and likely environment/config access, but it does not declare any explicit tool scope or permissions. This weakens reviewability and can lead users or orchestrators to grant broader capabilities than expected, increasing the chance of unintended outbound access or misuse.
A scheduled skill that transmits fetched content to Discord should prominently warn users about the automatic outbound posting behavior. Without explicit disclosure, users may enable the skill without realizing it will periodically send externally sourced content to a third-party service, creating privacy, compliance, and operational risks.
This manifest description says the skill will 'automatically fetch' trending topics from multiple platforms and send them to Discord, but it does not specify the trigger conditions, schedule, scope, or constraints for when this happens. In a manifest file, that lack of specificity can make invocation behavior ambiguous and increase the chance of unintended activation or user misunderstanding.
The manifest describes a skill that aggregates daily hot-search rankings from specific Chinese platforms (Weibo, Zhihu, Baidu, Bilibili, Douyin, Toutiao) and pushes them to Discord. This module explicitly adds international news sources via Currents API and GNews, which is a different content domain from the declared platform hot-search roundup.
This code file contains natural-language strings and documentation entirely in Chinese, including the module description and runtime output, which imposes a specific language on users. The policy allows locale constraints only when users are given a choice or when the restriction is clearly documented and justified, neither of which appears here.
The code loads CURRENTS_API_KEY and GNEWS_API_KEY to access external international news APIs. Given the manifest’s stated purpose of fetching hot-search lists from named platforms and sending them to Discord, introducing separate global news providers and their credentials is not clearly justified by the declared scope.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
self.currents_key = os.getenv('CURRENTS_API_KEY')
self.gnews_key = os.getenv('GNEWS_API_KEY')
self.CURRENTS_URL = "https://api.currentsapi.services/v1"
self.GNEWS_URL = "https://gnews.io/api/v4"
def get_world_news_currents(self, limit: int = 10) -> Optional[List[Dict]]:
The script formats the date with the fixed locale 'zh-CN' and builds the main message text entirely in Chinese. This is a natural-language policy concern because it forces a specific language/locale on all users without any opt-in or configuration mechanism in the file.
The manifest describes an automation that grabs hot-topic feeds and sends them to Discord, which implies network retrieval and message generation. This script additionally persists the full generated message to /tmp/hot-topics-message.md, a local side effect not mentioned in the stated purpose and not required by the description.
The natural-language description and instructions are presented entirely in Chinese, which can constitute a language/locale policy issue when no user opt-in or justification is provided. The file does not state that the skill is intentionally region-specific or offer an alternative language option.
The manifest and README consistently describe this skill as fetching and pushing hot topics from six specified Chinese platforms to Discord. However, the documented file structure includes global_news_fetcher.py labeled as '国际新闻(备用)', which is a distinct content scope not mentioned in the manifest description.
The platform display names are all specified in Chinese string literals, which imposes a specific language/locale in the skill configuration. There is no indication in this file of user opt-in, language selection, or documentation that the skill is intentionally limited to a Chinese-language or region-specific context.
The file header claims the script fetches Weibo, Zhihu, Baidu, B站, and Douyin hot topics. However, the implementation includes formatToutiao and registers 'toutiao' in the formatter map, so the documentation understates actual behavior and contradicts the code's supported platform set.
Detected: suspicious.potential_exfiltration