T09 · Insecure Skill Coding Practices
- Location
scripts/qieman_client.py:24- Finding
Hard-Coded Qieman MCP API Credential
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches its fund-analysis purpose, but it handles sensitive financial data and credentials with enough overbroad, under-disclosed, and insecure behavior that users should review it carefully before installing.
Install only if you are comfortable with financial data being processed through external APIs, cached locally, and potentially monitored via a watchlist. Rotate or replace the bundled Qieman key, do not store real secrets in workspace markdown or shell profiles, avoid plaintext holdings export, and review the storage scripts before using uploaded portfolio files.
scripts/qieman_client.py:24Hard-Coded Qieman MCP API Credential
scripts/encrypt-holdings.py:56Path Traversal in Encrypted Holdings File Operations
scripts/encrypt-holdings.py:20Insecure Holdings Encryption-Key Storage and Plaintext Export
scripts/fund_analyzer_pro.py:22External Workspace Module Hijacking Through Python Search-Path Precedence
scripts/ttfund-query.py:184Plaintext HTTP Retrieval of Financial Market Data
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
}
try:
response = requests.post(
BASE_URL,
headers=headers,
json=payload,
The README contains a plaintext x-api-key in the sample MCP configuration, which may expose a real credential or normalize unsafe secret-handling practices. If valid, attackers could use the key to access the MCP service, consume quotas, retrieve data, or impersonate legitimate usage; even if illustrative, publishing secrets in docs encourages insecure copying and reuse.
If the implementation includes tests that exercise local cache storage, encryption/decryption, persistence, and deletion of holdings, but these behaviors are omitted from the declared functionality, the gap undermines reviewability and informed consent. For a portfolio-analysis skill, undeclared data lifecycle operations are materially relevant because they affect confidentiality and integrity of user financial records.
If the implementation includes tests that exercise local cache storage, encryption/decryption, persistence, and deletion of holdings, but these behaviors are omitted from the declared functionality, the gap undermines reviewability and informed consent. For a portfolio-analysis skill, undeclared data lifecycle operations are materially relevant because they affect confidentiality and integrity of user financial records.
If the implementation includes tests that exercise local cache storage, encryption/decryption, persistence, and deletion of holdings, but these behaviors are omitted from the declared functionality, the gap undermines reviewability and informed consent. For a portfolio-analysis skill, undeclared data lifecycle operations are materially relevant because they affect confidentiality and integrity of user financial records.
If the implementation includes tests that exercise local cache storage, encryption/decryption, persistence, and deletion of holdings, but these behaviors are omitted from the declared functionality, the gap undermines reviewability and informed consent. For a portfolio-analysis skill, undeclared data lifecycle operations are materially relevant because they affect confidentiality and integrity of user financial records.
If the implementation includes tests that exercise local cache storage, encryption/decryption, persistence, and deletion of holdings, but these behaviors are omitted from the declared functionality, the gap undermines reviewability and informed consent. For a portfolio-analysis skill, undeclared data lifecycle operations are materially relevant because they affect confidentiality and integrity of user financial records.
Underspecified trigger phrases overlap with common user wording, making accidental invocation more likely. While this is less severe than a direct code-execution flaw, it still matters here because accidental activation could prompt collection of sensitive portfolio data or unnecessary external lookups.
Requesting Excel uploads of user holdings without an explicit sensitive-data warning is a real privacy and security issue because portfolio files can reveal assets, account structure, investment behavior, and personal financial status. In this skill’s context, the danger is elevated because the data may then be parsed, stored, exported, or sent to external services for analysis.
Automatic watchlist monitoring and push notifications involve ongoing processing and transmission of potentially sensitive financial preferences and behavior, yet the description does not clearly warn about privacy, retention, recipients, or notification channels. In the context of a fund-analysis skill, undisclosed monitoring is especially dangerous because it can create continuous data exposure beyond a one-time analysis request.
Referenced artifact was not completely inspected
python scripts/signal_checker.py --list
Referenced artifact was not completely inspected
python scripts/signal_checker.py --list
Referenced artifact was not completely inspected
python scripts/signal_checker.py --list
Referenced artifact was not completely inspected
python scripts/signal_checker.py --list
Referenced artifact was not completely inspected
python scripts/signal_checker.py --list
Referenced artifact was not completely inspected
python scripts/signal_checker.py --list
Referenced artifact was not completely inspected
python scripts/signal_checker.py --list
Referenced artifact was not completely inspected
python scripts/signal_checker.py --list
Referenced artifact was not completely inspected
python scripts/signal_checker.py --list
This section documents personalized holding-diagnosis behavior using the user's loss amount and then recommends actions like continuing to hold or adding via dollar-cost averaging, without any explicit warning about uncertainty, suitability limits, or financial risk. Because it appears tailored to a user's real position and losses, the risk is higher: users may reasonably interpret it as individualized financial advice and act on it to their detriment.
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).
��户** | Excel 导入 | ✅ 100% | 免费 | ⭐⭐⭐⭐ |
步骤:
配置:
# Linux/Mac
export TTFUND_APIKEY="ttf_sk_live_xxx"
# Windows
set TTFUND_APIKEY=ttf_sk_live_xxx
# 永久配置(推荐)
echo 'export TTFUND_APIKEY="ttf_sk_live_xxx"' >> ~/.bashrc
source ~/.bashrc
验证:
echo $TTFUND_APIKEY
# 应显示 API Key(部分隐藏)
| 项目 | 限制 |
|---|---|
| 免费额度 | 50 次/天 |
| 超出后 | 需付费或等待次日 |
| 并发限制 | 10 次/秒 |
| 数据类型 | 是否可用 | 说明 |
|---|---|---|
| 基金基础信息 | ✅ | 代码、名称、类型、规模 |
| 净值数据 | ✅ | 单位净值、累计净值 |
| 收益率 | ✅ | 近 1 月/1 年/3 年等 |
| 持仓数据 | ✅ |
Telling users to place an API key in TOOLS.md encourages storing a live secret in a plaintext documentation file inside the workspace, where it may be indexed, read by agents, synchronized, or accidentally committed. In an agent skill context, workspace-readable markdown is especially risky because other tooling may ingest it automatically, making exposure more likely than in a normal local-only config path.
This file implements persistent storage, enumeration, deletion, and plaintext export of user holdings, which materially expands the skill from analysis into local data collection and retention of sensitive portfolio information. In the context of a fund-analysis skill, that broader capability increases privacy and misuse risk because it enables accumulation and extraction of users' financial data beyond what is necessary for one-shot analysis.
This test file reads Python source from disk and executes it with exec(), which allows arbitrary code execution if either target script is modified, replaced, or symlinked to attacker-controlled content. In a skill environment where workspace files may be updated dynamically or shared across tools, this turns test execution into a code-loading sink without any integrity validation.
# 执行脚本获取命名空间
qieman_ns = {}
with open(scripts_path / "qieman-mcp-query.py", 'r', encoding='utf-8') as f:
exec(f.read(), qieman_ns)
encrypt_ns = {}
with open(scripts_path / "encrypt-holdings.py", 'r', encoding='utf-8') as f:
This second exec() has the same core issue: it executes the full contents of a file from the skill workspace at runtime, so any tampering with encrypt-holdings.py results in arbitrary code execution during tests. Because the file being loaded appears security-sensitive, compromising it could also mask defects in encryption/storage behavior while executing payloads under the tester's privileges.
encrypt_ns = {}
with open(scripts_path / "encrypt-holdings.py", 'r', encoding='utf-8') as f:
exec(f.read(), encrypt_ns)
validate_fund_code = qieman_ns['validate_fund_code']
get_cache_key = qieman_ns['get_cache_key']
No suspicious patterns detected.