Scan Report
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.
Safe to install
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.
Findings 3 items
| Severity | Finding | Location |
|---|---|---|
| Medium | SKILL.md claims no external dependencies but code makes network calls Doc Mismatch | scripts/expense_trends.py:126 |
| Low | Credential config file access attempt Sensitive Access | scripts/expense_trends.py:36 |
| Low | SKILL.md budget defaults contradict script hardcoded values Doc Mismatch | scripts/expense_budget.py:13 |
| Resource | Declared | Inferred | Status | Evidence |
|---|---|---|---|---|
| Filesystem | READ | WRITE | ✓ Aligned | All scripts write to ./expense_records.json — declared as data path in SKILL.md |
| Network | NONE | READ | ✗ Violation | scripts/expense_trends.py:126 — HTTP POST to openrouter.ai |
| Shell | NONE | NONE | — | No subprocess/os.system calls found |
| Environment | NONE | READ | ✓ Aligned | scripts/expense_trends.py:36 — reads OPENROUTER_API_KEY env var |
| Skill Invoke | NONE | NONE | — | N/A |
| Clipboard | NONE | NONE | — | N/A |
| Browser | NONE | NONE | — | N/A |
| Database | NONE | NONE | — | N/A |
1 findings
Medium External URL 外部 URL
https://openrouter.ai/api/v1/chat/completions scripts/expense_trends.py:126 File Tree
8 files · 55.9 KB · 1621 lines 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
Dependencies 2 items
| Package | Version | Source | Known Vulns | Notes |
|---|---|---|---|---|
requests | unpinned | import | No | Imported in expense_trends.py but not listed in any dependency file; version not pinned |
matplotlib | unpinned | import | No | Used as fallback for chart generation; not listed in dependency file |
Security Positives
✓ 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