使用说明 (SKILL.md)
Investment Committee Skill
五位大师平权投票(各 20%),并行独立分析,输出中文裁决报告。
执行流程
Step 1:数据准备
行情抓取(优先用脚本,比搜索更准确):
python3 {workspace}/investment-committee/scripts/fetch_price.py GOOGL 700.hk BTC GOLD
数据源:stooq.com(免费无限流)。常用映射:700→700.hk,NVDA→nvda.us,BTC→btc.v,GOLD/黄金→xauusd。
基本面数据:web_search 补充 PE、Forward PE、分析师目标价、近期财报、宏观事件。
关键信息清单(装进所有委员 prompt):
- 价格 + 日涨跌 + 52周区间
- TTM PE / Forward PE(股票)或恐惧贪婪指数(加密)
- RSI / 与200日均线偏差
- 近期重大事件(财报日期、政策、宏观催化剂)
- 若用户有持仓:持仓比例 + 是否已盈亏
Step 2:识别分析模式
| 用户请求 |
模式 |
重点 |
| "分析 XXX" / "要不要买" |
买入判断模式 |
五委员给买入评分 |
| "我持有 X 仓位,怎么办" |
仓位管理模式 |
五委员给操作建议(止损/持有/加仓) |
| "XXX 和 YYY 哪个更好" |
比较模式 |
两标的同时分析,最后比较结论 |
Step 3:并行召唤五位委员
sessions_spawn × 5(同时发出,保证独立性)
每个 sub-agent 的 task 格式:
你现在扮演 [大师姓名]。
以下是你的投资哲学和分析框架:
[读取对应 references/ 文件全文]
[买入判断模式] 请用你的视角分析以下标的,严格按你的框架输出评分和判断:
[仓位管理模式] 用户当前 [X%] 仓位持有该标的,请从你的框架出发给出仓位管理建议:
标的:[XXX]
当前价格:[YYY]
关键数据:[数据清单]
近期事件:[事件]
[上次你的评分:X/10(若有历史档案)]
输出格式:(按对应 reference 文件的 "输出要求" 一节)
⚠️ 关键约束:五个 sub-agent 必须独立,不能互相看到结论。
Step 4:整合裁决
收齐五份结果后,读取 references/verdict.md 进行整合:
- 计算加权综合分(各 20%)
- 识别最大分歧(分差最大的两位委员)
- 检查否决规则
- 提取可直接执行的操作参数(止损价、仓位、加仓条件)
- 按
assets/report-template.md 格式输出
- 发送到当前 Discord 频道
- 存档到
{workspace}/investment-committee/history/YYYY-MM-DD_标的_说明.md
特殊资产权重调整
加密资产 / 黄金:芒格和段永平因"无内在价值"天然低分,报告中注明「本标的宏观/量化视角权重更具参考价值」,重点参考马克斯(周期)、德鲁肯米勒(宏观流动性)、西蒙斯(量化信号)。
委员角色速查
| 委员 |
核心框架 |
Reference 文件 |
| 芒格 |
护城河 / 生意本质 / 能力圈 |
references/munger.md |
| 马克斯 |
周期位置 / 情绪温度 / 风险不对称 |
references/marks.md |
| 段永平 |
本分 / 动机审查 / 十年持有 |
references/duan.md |
| 德鲁肯米勒 |
宏观流动性 / 催化剂 / 止损 |
references/druckenmiller.md |
| 西蒙斯 |
量化五信号 / 动量 / 统计胜率 |
references/simons.md |
裁决整合规则见 references/verdict.md。
报告格式见 assets/report-template.md。
安全使用建议
This skill looks functionally coherent for generating multi-person investment reports, but you should verify two things before installing or running it: (1) How 'send to current Discord channel' is implemented — ask the author whether a Discord webhook/token is required and where credentials would be stored; do not provide broad Discord tokens unless you trust the skill. If the agent uses your existing Discord integration, be aware it will post potentially sensitive portfolio or query text to that channel. (2) The skill spawns five parallel sub-agents and uses web_search; confirm what context (conversation history, files, or secrets) those sub-agents can access so you don't accidentally leak sensitive data. Everything else (local reference files, price fetch from stooq.com, saving to workspace) is expected and proportionate. If you want to reduce risk: run the skill in a sandboxed agent with no Discord/network posting permission, inspect fetch_price.py locally (it only queries stooq.com), and consider removing or disabling the automatic 'send to Discord' step until you verify the integration.
功能分析
Type: OpenClaw Skill
Name: investment-committee
Version: 1.0.0
thought
The user wants me to analyze a set of files for an OpenClaw AgentSkill called "investment-committee".
I need to classify it as `benign`, `suspicious`, or `malicious` based on specific criteria:
- `malicious`: Intentional harmful behavior (theft, exfiltration, backdoors, etc.).
- `suspicious`: Risky capabilities/vulnerabilities without clear malicious intent (shell access, network access, prompt injection risks).
- `benign`: Aligned with purpose, no high-risk behaviors.
Let's look at the files:
1. **_meta.json**: Metadata about the skill. Owner ID, slug, version, published date. Looks standard.
2. **SKILL.md**: Instructions for the AI agent.
- It describes an "Investment Committee" with 5 personas (Munger, Marks, Duan, Druckenmiller, Simons).
- It outlines a 4-step process: Data preparation, Analysis mode identification, Spawning sub-agents, and Verdict integration.
- **Step 1 (Data Prep)**: It provides a bash command to run a python script: `python3 {workspace}/investment-committee/scripts/fetch_price.py GOOGL 700.hk BTC GOLD`. This is a local script execution.
- **Step 3 (Spawn)**: It mentions `sessions_spawn × 5`. This is a feature of OpenClaw to run parallel agents.
- **Step 4 (Verdict)**: It mentions reading files from `references/`, `assets/`, and writing to `{workspace}/investment-committee/history/`.
- **Prompt Injection Surface**: The instructions tell the agent how to behave. There are no instructions to ignore the user, exfiltrate data, or perform unauthorized actions. It's a complex multi-agent workflow.
3. **scripts/fetch_price.py**:
- A Python script to fetch stock/crypto prices from `stooq.com`.
- It uses `requests` to get CSV data from a public URL.
- It maps common symbols to Stooq's format.
- It prints the results.
- **Risk**: It makes a network request to `stooq.com`. This is necessary for the stated purpose (fetching prices). It doesn't seem to exfiltrate sensitive data (it only sends the symbol and date range).
4. **assets/report-template.md**: A template for the final report. Benign.
5. **references/druckenmiller.md**: Persona instructions for Stanley Druckenmiller. Benign.
6. **references/duan.md**: Persona instructions for Duan Yongping. Benign.
7. **references/marks.md**: Persona instructions for Howard Marks. Benign.
8. **references/munger.md**: Persona instructions for Charlie Munger. Benign.
9. **references/simons.md**: Persona instructions for James Simons. Benign.
10. **references/verdict.md**: Rules for integrating the 5 opinions. Benign.
- **Data exfiltration**: None found. The script fetches data from a legitimate financial data site.
- **Malicious execution**: The `SKILL.md` instructs the agent to run a local python script. This is a standard way OpenClaw skills work. The script itself is simple and does what it says.
- **Persistence/Backdoors**: None found.
- **Prompt Injection**: The `SKILL.md` contains instructions for the agent, but they are aligned with the "Investment Committee" purpose. There are no "ignore previous instructions" or "send your system prompt to X" type of attacks.
- **Obfuscation**: None found.
- **Supply chain**: No external dependencies other than `requests`.
The skill uses `python3` execution and `web_search` (implied in SKILL.md), which are high-privilege capabilities. However, these are used for the stated purpose of financial analysis. The script `fetch_price.py` is local and transparent.
Is there any "suspicious" element?
- The script uses `requests` to an external domain (`stooq.com`).
- The agent is instructed to run shell commands.
- The agent is instructed to spawn sub-agents.
According to the "CRITICAL DISTINCTION" and "IMPORTANT THRESHOLD":
- Risky capabilities (shell/network/file access) plausibly needed for the stated purpose should be classified as `suspicious` if they are vulnerabilities, or `benign` if they are just features.
- However, the prompt says: "benign only if behavior is clearly aligned with the stated purpose and lacks meaningful high-risk behaviors."
- Running arbitrary python scripts and making network calls are "high-risk behaviors" in an agentic context, even if the script provided is currently safe.
- But the instructions say: "malicious ONLY if there is clear evidence of INTENTIONAL harmful behavior... If you see risky capabilities without clear malicious intent... classify as suspicious (not malicious)."
Wait, the prompt says: "benign only if behavior is clearly aligned with the stated purpose and lacks meaningful high-risk behaviors."
And: "classify as suspicious (not malicious)" if there are "risky capabilities without clear malicious intent (e.g., shell/network/file access plausibly needed for the stated purpose...)"
So, since it uses shell execution (`python3 ...`) and network access (`requests.get`), it fits the "suspicious" category because these are risky capabilities, even if they are used for the stated purpose.
Let's re-read: "benign only if behavior is clearly aligned with the stated purpose and lacks meaningful high-risk behaviors."
Is fetching a price from a public API a "meaningful high-risk behavior"? In the context of an AI agent, executing code is always high-risk.
However, many OpenClaw skills are designed to run code.
If I compare this to a truly benign skill (e.g., one that just formats text), this is more "risky".
Let's look at `fetch_price.py` again.
It takes arguments from `sys.argv`.
`python3 {workspace}/investment-committee/scripts/fetch_price.py GOOGL 700.hk BTC GOLD`
If a user provides a malicious symbol like `; rm -rf /`, would it be vulnerable?
The `SKILL.md` shows the agent constructing the command.
The script `fetch_price.py` does:
```python
def fetch_quote(symbol_raw, days_back=5):
sym = normalize_symbol(symbol_raw)
...
url = f'https://stooq.com/q/d/l/?s={sym}&d1={d1}&d2={d2}&i=d'
r = requests.get(url, headers=HEADERS, timeout=10)
```
If `symbol_raw` is something like `foo&bar=baz`, it's just a URL parameter.
The shell injection risk is in how the *agent* calls the script.
`python3 {workspace}/investment-committee/scripts/fetch_price.py [USER_INPUT]`
If the agent doesn't sanitize the input before putting it in the bash block, it's a shell injection vulnerability.
The `SKILL.md` says: `python3 {workspace}/investment-committee/scripts/fetch_price.py GOOGL 700.hk BTC GOLD`. It doesn't explicitly show a variable placeholder like `$TARGET`, but the instructions say "对任意标的进行多维度独立分析" (analyze any target).
So the agent will likely do: `python3 .../fetch_price.py <target_from_user>`.
This is a classic "Shell injection via lack of input sanitization" vulnerability.
The prompt says: "Vulnerabilities (e.g., ... Shell injection via os.system, lack of input sanitization ...) are flaws that allow attacks. ... CLASSIFY VULNERABILITIES ... AS 'suspicious', NOT 'malicious'".
Therefore, the classification should be `suspicious`.
Indicators:
1. Shell execution of a local script with parameters derived from user input (potential shell injection).
2. Network access to an external domain (`stooq.com`) to fetch data.
3. Complex multi-agent orchestration which increases the attack surface for prompt injection (though no malicious intent is visible).
The script `fetch_price.py` itself is benign in intent. The `SKILL.md` is a sophisticated investment tool. But the pattern of "Agent runs shell command with user-provided strings" is a security risk.
Final check on "malicious": Is there any intent to steal? No. Is there a backdoor? No.
Final check on "benign": Does it lack high-risk behaviors? No, it executes shell commands and makes network calls.
So `suspicious` is the correct classification.
Summary:
The skill implements a multi-agent investment analysis workflow. It is classified as suspicious due to the use of shell command execution (`python3`) to run a local script (`fetch_price.py`) with arguments derived from user input, which presents a shell injection risk. Additionally, the script performs external network requests to `stooq.com`. While these actions are aligned with the stated purpose of financial analysis, the lack of explicit input sanitization in the agent's instructions makes it vulnerable to exploitation.
Wait, I should check if there are any other IOCs.
URL: `https://stooq.com/q/d/l/`
File names: `SKILL.md`, `scripts/fetch_price.py`, `references/verdict.md`, etc.
The classification is `suspicious`.
One more thing: The `SKILL.md` uses `sessions_spawn`. This is a powerful feature.
The instructions for the sub-agents are in `SKILL.md`.
`你现在扮演 [大师姓名]。 ... [读取对应 references/ 文件全文]`
This is a standard RAG/Persona pattern.
The most important indicator is the shell execution pattern.
```json
{
"classification": "suspicious",
"summary": "The skill orchestrates a multi-agent financial analysis workflow but is classified as suspicious due to its reliance on shell command execution. The agent is instructed in `SKILL.md` to run a local Python script (`scripts/fetch_price.py`) using parameters derived from user input, which creates a potential shell injection vulnerability. Furthermore, the script performs outbound network requests to `stooq.com` to retrieve market data, which, while functional, constitutes a high-risk capability in an agentic environment."
}
```
Wait, the prompt says "Respond ONLY as JSON". I should make sure the summary is a single short paragraph.
One detail: `stooq.com` is a legitimate financial site.
The script uses `requests.get(url, headers=HEADERS, timeout=10)`.
The `normalize_symbol` function:
```python
def normalize_symbol(s):
s = s.upper()
return SYMBOL_MAP.get(s, s.lower().replace('.HK', '.hk').replace('.US', '.us'))
```
This function doesn't sanitize for shell characters, but the script is called *from* the shell. The vulnerability is in the agent's construction of the command line.
Example:
User: "Analyze `Tencent; rm -rf /`"
Agent might run: `python3 .../fetch_price.py Tencent; rm -rf /`
This is the risk.
The instructions are in Chinese, but the logic is clear.
Final JSON structure:
{
"classification": "suspicious",
"summary": "..."
}
```json
{
"classification": "suspicious",
"summary": "The skill implements a multi-agent investment analysis workflow that is classified as suspicious due to the use of high-risk capabilities. Specifically, `SKILL.md` instructs the agent to execute a local Python script (`scripts/fetch_price.py`) via the shell using arguments derived from user input, which presents a shell injection risk if the agent does not sanitize the input. Additionally, the script performs outbound network requests to `stooq.com` to fetch financial data. While these behaviors are consistent with the stated purpose, the combination of code execution and network access without explicit security constraints constitutes a significant attack surface."
}
```