扫描报告
28 /100
snarky-expense-butler
毒舌记账管家,支持记账、查询、预算提醒、毒舌消费分析、地域统计、趋势图
Skill functions as a legitimate local expense tracker but contains undocumented network code (OpenRouter API call) that contradicts the SKILL.md declaration of 'no external dependencies, no API key'. The network functionality degrades gracefully to matplotlib and poses no data exfiltration risk.
可以安装
Update SKILL.md to document the optional OpenRouter API integration for trend chart generation. Remove the credential-reading code for ~/.openclaw/openclaw.json (keychain approach can't extract the key anyway). Declare network:READ if the API feature is retained.
安全发现 3 项
| 严重性 | 安全发现 | 位置 |
|---|---|---|
| 中危 | SKILL.md claims no external dependencies but code makes network calls 文档欺骗 | scripts/expense_trends.py:126 |
| 低危 | Credential config file access attempt 敏感访问 | scripts/expense_trends.py:36 |
| 低危 | SKILL.md budget defaults contradict script hardcoded values 文档欺骗 | scripts/expense_budget.py:13 |
| 资源类型 | 声明权限 | 推断权限 | 状态 | 证据 |
|---|---|---|---|---|
| 文件系统 | READ | WRITE | ✓ 一致 | All scripts write to ./expense_records.json — declared as data path in SKILL.md |
| 网络访问 | NONE | READ | ✗ 越权 | scripts/expense_trends.py:126 — HTTP POST to openrouter.ai |
| 命令执行 | NONE | NONE | — | No subprocess/os.system calls found |
| 环境变量 | NONE | READ | ✓ 一致 | scripts/expense_trends.py:36 — reads OPENROUTER_API_KEY env var |
| 技能调用 | NONE | NONE | — | N/A |
| 剪贴板 | NONE | NONE | — | N/A |
| 浏览器 | NONE | NONE | — | N/A |
| 数据库 | NONE | NONE | — | N/A |
1 项发现
中危 外部 URL 外部 URL
https://openrouter.ai/api/v1/chat/completions scripts/expense_trends.py:126 目录结构
8 文件 · 55.9 KB · 1621 行 Python 7f · 1564L
Markdown 1f · 57L
├─
▾
scripts
│ ├─
add_expense.py
Python
│ ├─
expense_analysis.py
Python
│ ├─
expense_budget.py
Python
│ ├─
expense_location.py
Python
│ ├─
expense_query.py
Python
│ ├─
expense_report.py
Python
│ └─
expense_trends.py
Python
└─
SKILL.md
Markdown
依赖分析 2 项
| 包名 | 版本 | 来源 | 已知漏洞 | 备注 |
|---|---|---|---|---|
requests | unpinned | import | 否 | Imported in expense_trends.py but not listed in any dependency file; version not pinned |
matplotlib | unpinned | import | 否 | Used as fallback for chart generation; not listed in dependency file |
安全亮点
✓ No base64-encoded execution, obfuscation, or anti-analysis techniques found
✓ No reverse shell, C2 communication, or data exfiltration to external servers
✓ No access to sensitive paths (~/.ssh, ~/.aws, .env) beyond the benign openclaw config read
✓ No credential harvesting beyond the failed openclaw config read (key is in keychain)
✓ No subprocess/shell execution beyond standard Python file I/O
✓ File locking (fcntl) used for concurrent write safety
✓ Network call gracefully degrades to matplotlib if API fails
✓ No supply chain risks — no external dependencies declared or used
✓ All data stays in local JSON file as documented