T06 · System Persistence
- Location
SKILL.md:1067- Finding
Opt-Out Scheduled Tasks Create Cross-Session Persistence and Unsolicited External Delivery
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is for A-share market reports, but it needs review because it enables recurring external delivery by default, handles a local API token insecurely, and can produce current-dated financial reports with hard-coded claims.
Install only if you want default scheduled A-share reports and understand they may be saved locally and sent to linked messaging channels. Disable auto-push unless you explicitly want recurring delivery, avoid using a Tushare token until the endpoint uses HTTPS, treat generated market narratives as unverified, and run the Python dependencies in an isolated environment.
SKILL.md:1067Opt-Out Scheduled Tasks Create Cross-Session Persistence and Unsolicited External Delivery
SKILL.md:122Tushare API Token Is Transmitted over Unencrypted HTTP
SKILL.md:171Token Setup Injects an Undisclosed Affiliate Registration Link
README.md:214Mutable and Unverified Third-Party Python Dependencies
render_report.py:89Current-Dated Financial Reports Mix Live Values with Hard-Coded Market Claims
The description and code are partially related—both concern A-share market review data—but the implementation is materially narrower and differs in important ways. The script is explicitly a ‘盘后复盘数据获取脚本’ and fetches only post-close metrics. It does not implement pre-market or intraday report logic, nor does it generate the three promised report types. The advertised data architecture is also inaccurate for this code: there is no Tushare usage, and no actual search-engine scraping fallback is implemented. Additionally, southbound funds are declared but absent. While some mentioned data elements are present (market sentiment, sector rotation proxy, limit-up ladder, northbound flow, turnover), the declared description overstates both scope and architecture compared with the observed behavior.
The general domain matches A-share market review/report generation, but the declared description overstates and misstates what this code chunk actually does. The script specifically renders a post-market report (report_{TODAY}_postmarket_auto.md) and contains post-close recap content such as 涨停统计、连板梯队、今日小结、明日观察. There is no visible branching for pre-market or intraday report generation. The declared 3-tier fallback data architecture is also not represented here; instead, this script invokes a local fetch script and falls back only to crude stdout parsing, so the described resource access pattern is not accurate for this code chunk. Finally, the description says missing data is left blank and never fabricated, but this renderer injects substantial hardcoded content and fallback stock lists/market commentary (e.g., north/south money text, central bank text, sector themes, strategies, default counts), which is materially different from a strict blank-on-missing behavior. Therefore this is a meaningful description-behavior mismatch.
The skill enables unsolicited auto-push to external messaging endpoints by default, which creates an outbound data exfiltration channel and can spam or leak content without a fresh user action each time. In an agent setting, default external delivery is especially risky because reports may include inferred user interests, prior generated content, or data from local context and be transmitted automatically.
Automatic push and local report creation are enabled by default without clear upfront consent for persistent writes and outbound delivery. This is dangerous because users may believe they are invoking a one-shot analysis skill while it silently establishes recurring tasks, stores artifacts, and transmits outputs externally.
The skill metadata promises that missing data will be left blank and never fabricated, but this renderer injects hardcoded market narratives, fallback stock ladders, fixed资金/宏观 commentary, and tactical conclusions when data is absent or partial. In a financial-analysis skill, this is dangerous because users may treat fabricated or stale content as current market intelligence, leading to misleading reports and potentially harmful decisions.
The README states the skill will determine report generation based on user input or current time, but it does not clearly define invocation boundaries, consent requirements, or when autonomous behavior is allowed. In an agent setting, ambiguous trigger conditions can cause unintended execution and data retrieval, especially when combined with scheduled automation and outbound messaging.
The skill enables daily auto-push by default and sends reports to linked messaging channels, but the warning about outbound transmission is buried in the feature description rather than presented as explicit consent language. This creates a real risk of unanticipated external data transmission, especially if reports contain user-linked context, account-specific outputs, or sensitive workflow metadata.
The skill documents and embeds capabilities for local file reads/writes, network access, and shell/script execution, but does not declare any tool scope or permission boundaries. In an agent environment, this broad undeclared capability increases the chance of over-privileged execution, surprising side effects, and misuse of local or external resources beyond what a user expects from a market-reporting skill.
The trigger phrases are broad enough to match ordinary market conversation, increasing the risk of unintended invocation. Because this skill includes automation, file persistence, network access, and possible outbound delivery, accidental triggering is more dangerous than in a purely local, read-only skill.
Early documentation promises a fixed 3-tier fallback of Tushare Pro → AKShare → search engine. Later optimization rules explicitly replace that order for index data with Sina Finance first, including recommendations to skip unstable AKShare and use Sina directly, which contradicts the declared data-architecture intent.
The manifest-level principle says missing data should be left blank and not invented. However, the cross-validation rules for search fallback instruct choosing a middle or conservative value when multiple sources disagree, which introduces synthesized values not directly present in a source and conflicts with the non-fabrication claim.
Throughout the instructions and templates, the report structure, trigger words, and required output format are defined in Chinese, and the templates mandate Chinese presentation conventions for generated reports. The file does not clearly offer users a language-selection option or state that Chinese output is optional, which can violate a language/locale choice policy.
The skill expands from on-demand report generation into automation, persistence, and message delivery, materially increasing its operational scope. Scope expansion is dangerous because it adds unattended execution and data movement pathways that users may not anticipate, especially when coupled with local file storage and outbound notifications.
Default automatic pushes to bound messaging channels can disclose generated reports, user preferences, and potentially contextual data to external endpoints without explicit per-send authorization. The risk is amplified by the skill's automation model, because disclosure can recur on a schedule and may reach third-party messaging infrastructure outside the user's immediate view.
The automation instructions repeatedly save reports to local files without a clear warning about ongoing workspace modification. Repeated writes can accumulate sensitive or proprietary content over time, expand local disclosure risk, and surprise users who expected ephemeral outputs.
Reading prior locally saved reports introduces local file access beyond the minimum needed for generating a new report, and it creates a pathway for unintended reuse of stored content. This becomes dangerous when chained with automated outputs, because historical data can be re-ingested and propagated without the user realizing prior files are part of the prompt context.
The documented workflow chains local file reads with downstream message delivery, creating a gradual disclosure path where previously stored report content can be reintroduced and sent externally. This kind of multi-step data flow is risky because each individual action may seem benign, but together they enable propagation of historical local content beyond its original context.
The workflow directs creation and execution of local Python, JSON, and template pipeline files, increasing attack surface through script execution and persistent artifacts not central to the stated analysis role. In agent environments, extra executable tooling can be repurposed or modified to perform unintended actions, especially when shell and file-write capabilities are already present.
The module docstring explicitly describes this file as a "盘后复盘数据获取脚本" and the implemented logic fetches closing indexes, limit-up statistics, northbound flow, sector performance, and writes a JSON snapshot for later rendering. There is no code here supporting the manifest's broader claim of generating pre-market briefings or intraday snapshots, so the actual behavior in this file is materially narrower than the skill description.
The file's docstrings and all user-facing print output are written in Chinese, and the script provides no option to select another language or locale. Under the stated policy, forcing a specific language without opt-in is a natural-language policy violation unless the locale restriction is explicitly justified.
The manifest emphasizes a 3-tier fallback ending in search-engine retrieval, and the inline logging/comment says "超时3秒降级搜索" / "降级搜索" when sector data retrieval fails. In reality, the exception path only sets sector_ok = False and df_sector = None; no search request or alternate retrieval is attempted, so the documentation and runtime messages contradict the implemented behavior.
This file contains natural-language instructions and status text that force a specific language/locale for users. Under the policy, locale constraints should either provide user opt-in/choice or be clearly justified as region-specific; neither is present here.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
# 先删除旧文件(如果有)
if JSON_OUT.exists():
JSON_OUT.unlink()
result = subprocess.run(
[sys.executable, str(FETCH_SCRIPT)],
capture_output=True,
text=True,
The code emits stock-specific tactical guidance such as watching named equities for opening premium or '低位补涨机会', despite the skill declaring stock-picking and deep individual-stock analysis out of scope. In the context of a market-review skill, this broadens the tool into quasi-investment advice without appropriate controls, increasing the chance of users relying on unsupported recommendations.
The manifest describes generation of three report types: pre-market, intraday, and post-market. This script always writes a file named 'report__postmarket_auto.md' and its content is structured around post-market recap sections, with no branching or parameterization for the other two declared report modes.