T06 · System Persistence
- Location
SKILL.md:209- Finding
Documented recurring OpenClaw tasks create cross-session persistence
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This fund-advisor skill is mostly coherent, but it has review-worthy financial-data integrity, persistence, and disclosure problems that users should understand before installing.
Install only if you are comfortable with a finance tool that contacts multiple public market-data services, writes local portfolio records, and may run recurring scheduled tasks if you enable them. Treat its investment suggestions as unverified reference output, avoid using the sample stock rankings for decisions, remove bundled portfolio data before use, and prefer running it in a dedicated environment with restricted network and file access.
SKILL.md:209Documented recurring OpenClaw tasks create cross-session persistence
SKILL.md:18Third-party Python dependencies are installed without immutable version and integrity controls
fund_keeper.py:180Unauthenticated HTTP market data can be manipulated to alter financial recommendations and cached results
stock_data.py:120Runtime network destinations exceed the Skill's declared domain boundary
stock_data.py:120Hard-coded sample rankings are presented as current stock-market results
funds/my-funds.md:5Release package contains populated private portfolio and performance records
If the implementation performs stock-market queries against Sina Finance and 10jqka while presenting itself as a fund advisor and not declaring those domains, users and platform policy controls may be misled about actual outbound traffic. Undeclared network destinations are security-relevant because they expand the trust boundary and can exfiltrate usage patterns or retrieved financial data.
If the implementation performs stock-market queries against Sina Finance and 10jqka while presenting itself as a fund advisor and not declaring those domains, users and platform policy controls may be misled about actual outbound traffic. Undeclared network destinations are security-relevant because they expand the trust boundary and can exfiltrate usage patterns or retrieved financial data.
If the implementation performs stock-market queries against Sina Finance and 10jqka while presenting itself as a fund advisor and not declaring those domains, users and platform policy controls may be misled about actual outbound traffic. Undeclared network destinations are security-relevant because they expand the trust boundary and can exfiltrate usage patterns or retrieved financial data.
If the implementation performs stock-market queries against Sina Finance and 10jqka while presenting itself as a fund advisor and not declaring those domains, users and platform policy controls may be misled about actual outbound traffic. Undeclared network destinations are security-relevant because they expand the trust boundary and can exfiltrate usage patterns or retrieved financial data.
If the implementation performs stock-market queries against Sina Finance and 10jqka while presenting itself as a fund advisor and not declaring those domains, users and platform policy controls may be misled about actual outbound traffic. Undeclared network destinations are security-relevant because they expand the trust boundary and can exfiltrate usage patterns or retrieved financial data.
If the implementation performs stock-market queries against Sina Finance and 10jqka while presenting itself as a fund advisor and not declaring those domains, users and platform policy controls may be misled about actual outbound traffic. Undeclared network destinations are security-relevant because they expand the trust boundary and can exfiltrate usage patterns or retrieved financial data.
If the implementation performs stock-market queries against Sina Finance and 10jqka while presenting itself as a fund advisor and not declaring those domains, users and platform policy controls may be misled about actual outbound traffic. Undeclared network destinations are security-relevant because they expand the trust boundary and can exfiltrate usage patterns or retrieved financial data.
The manifest describes the skill as a Chinese mutual fund advisor, with stock-fund linkage as a supporting feature. This changelog adds direct stock market capabilities such as real-time individual stock quotes and market gainers/losers lists, which are broader than merely linking stocks to funds and represent an expanded behavior scope.
The natural-language README content, including the tagline, features, commands, and audience sections, is presented entirely in Chinese. Under the policy, forcing a specific language without user opt-in or a documented justification is a locale/language policy issue.
The markdown lists edit, remove, buy, and sell commands, and elsewhere states the tool maintains files such as my-funds.md and transactions.json. However, the README does not warn users that these commands will modify or delete local data, which is a user-data-impacting behavior that should be disclosed in markdown descriptions.
The skill declares network requirements and clearly instructs users to read and write portfolio/config files, but it does not define an explicit tool scope such as permissions or allowed-tools. That creates a governance gap where the runtime may grant broader file or network access than users expect, increasing the risk of unintended data exposure or capability abuse.
The description explicitly frames the skill as a 'Chinese mutual fund intelligent advisor,' which imposes a locale-specific scope in the natural-language description. The file does not clearly offer users a language or locale choice or explain that the locale limitation is an intentional regional constraint.
The file-level description states the tool is a domestic Chinese fund advisor, and the user-facing prompts and outputs throughout the CLI are predominantly hard-coded in Chinese. There is no indication that users can opt into another language or locale, which may violate language-choice policy for generally available skills.
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
"User-Agent": "Mozilla/5.0",
"Referer": f"http://fund.eastmoney.com/{fund_code}.html"
}
response = requests.get(url, headers=headers, timeout=5)
if response.status_code == 200:
content = response.text
if content.startswith("jsonpgz(") and content.endswith(");"):
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
"User-Agent": "Mozilla/5.0",
"Referer": f"http://fund.eastmoney.com/{fund_code}.html"
}
response = requests.get(url, headers=headers, timeout=5)
if response.status_code == 200:
content = response.text
if content.startswith("jsonpgz(") and content.endswith(");"):
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
"User-Agent": "Mozilla/5.0",
"Referer": f"http://fund.eastmoney.com/{fund_code}.html"
}
response = requests.get(url, headers=headers, timeout=5)
if response.status_code == 200:
content = response.text
if content.startswith("jsonpgz(") and content.endswith(");"):
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
"User-Agent": "Mozilla/5.0",
"Referer": f"http://fund.eastmoney.com/{fund_code}.html"
}
response = requests.get(url, headers=headers, timeout=5)
if response.status_code == 200:
content = response.text
if content.startswith("jsonpgz(") and content.endswith(");"):
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
"User-Agent": "Mozilla/5.0",
"Referer": f"http://fund.eastmoney.com/{fund_code}.html"
}
response = requests.get(url, headers=headers, timeout=5)
if response.status_code == 200:
content = response.text
if content.startswith("jsonpgz(") and content.endswith(");"):
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
"User-Agent": "Mozilla/5.0",
"Referer": f"http://fund.eastmoney.com/{fund_code}.html"
}
response = requests.get(url, headers=headers, timeout=5)
if response.status_code == 200:
content = response.text
if content.startswith("jsonpgz(") and content.endswith(");"):
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
"User-Agent": "Mozilla/5.0",
"Referer": f"http://fund.eastmoney.com/{fund_code}.html"
}
response = requests.get(url, headers=headers, timeout=5)
if response.status_code == 200:
content = response.text
if content.startswith("jsonpgz(") and content.endswith(");"):
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
"User-Agent": "Mozilla/5.0",
"Referer": f"http://fund.eastmoney.com/{fund_code}.html"
}
response = requests.get(url, headers=headers, timeout=5)
if response.status_code == 200:
content = response.text
if content.startswith("jsonpgz(") and content.endswith(");"):
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
"User-Agent": "Mozilla/5.0",
"Referer": f"http://fund.eastmoney.com/{fund_code}.html"
}
response = requests.get(url, headers=headers, timeout=5)
if response.status_code == 200:
content = response.text
if content.startswith("jsonpgz(") and content.endswith(");"):
Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.
try:
url = f"http://fund.eastmoney.com/f10/jjjz_{fund_code}.html"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers, timeout=10)
if response.status_code == 200:
import re
The OCR feature reads user-supplied screenshots and extracts text, including any incidental sensitive data present in the image, without a clear warning or consent prompt. In a finance-oriented skill, screenshots may contain account balances, names, transaction history, or unrelated private content, making silent extraction more sensitive than in a generic OCR utility.
The skill is presented as a mutual-fund advisor but contains additional precious-metals pricing and investment-advice functionality outside the declared scope. Scope expansion matters because users and hosting systems may grant trust, permissions, or expectations based on the manifest; hidden or undocumented financial-advice features increase surprise and risk.
No suspicious patterns detected.