Scan Report
40 /100
openclaw-usage-manager
Real-time usage dashboard and auto-switcher for dual Claude Max accounts
This is a legitimate dual-account Claude Max usage manager, but it stores API tokens unencrypted in plaintext files and modifies OpenClaw auth profiles with no declared credentials handling in SKILL.md — a significant doc-to-code mismatch for a credential-accessing tool.
Use with caution
SKILL.md must declare filesystem:WRITE for token/auth storage, document the plaintext token persistence model, and explain why unencrypted credentials on disk are acceptable. Consider encrypting tokens.json or referencing a secret manager instead of storing raw Bearer tokens.
Findings 5 items
| Severity | Finding | Location |
|---|---|---|
| High | API tokens stored in plaintext on disk Credential Theft | usage-switch/setup-tokens.sh:17 |
| High | Undeclared modification of OpenClaw agent auth profiles Credential Theft | usage-switch/check.mjs:61 |
| Medium | SKILL.md does not declare any credential handling, token storage, or auth profile access Doc Mismatch | SKILL.md:1 |
| Medium | Undeclared filesystem WRITE to OpenClaw agent directory Priv Escalation | usage-switch/check.mjs:8 |
| Low | Hardcoded placeholder 1Password item IDs in server.mjs Obfuscation | usage-dashboard/server.mjs:19 |
| Resource | Declared | Inferred | Status | Evidence |
|---|---|---|---|---|
| Filesystem | NONE | WRITE | ✗ Violation | setup-tokens.sh:17 writes to ~/.openclaw/workspace/tools/usage-switch/tokens.jso… |
| Network | NONE | READ | ✗ Violation | server.mjs:58, check.mjs:28 POST to https://api.anthropic.com/v1/messages using … |
| Shell | NONE | WRITE | ✗ Violation | setup-tokens.sh:1, setup-tokens-simple.sh:1 are shell scripts; server.mjs:148 us… |
| Browser | NONE | READ | ✓ Aligned | SKILL.md describes a 'browser dashboard' but browser:READ is not in the declared… |
| credential | NONE | WRITE | ✗ Violation | setup-tokens.sh reads from 1Password CLI (op item get --reveal); check.mjs:65 wr… |
| Environment | NONE | READ | ✓ Aligned | setup-tokens.sh:17, setup-tokens-simple.sh:18 pass C1_TOKEN/C2_TOKEN via os.envi… |
5 findings
Medium External URL 外部 URL
https://x.com/5dmgmt/status/2032770037728113118 README.md:18 Medium External URL 外部 URL
https://openclaw.ai README.md:92 Medium External URL 外部 URL
https://developer.1password.com/docs/cli/ README.md:95 Medium External URL 外部 URL
https://x.com/5dmgmt README.md:653 Medium External URL 外部 URL
https://5dmgmt.com README.md:655 File Tree
7 files · 49.7 KB · 1333 lines Markdown 2f · 738L
JavaScript 2f · 293L
HTML 1f · 248L
Shell 2f · 54L
├─
▾
usage-dashboard
│ ├─
index.html
HTML
│ └─
server.mjs
JavaScript
├─
▾
usage-switch
│ ├─
check.mjs
JavaScript
│ ├─
setup-tokens-simple.sh
⚠
Shell
│ └─
setup-tokens.sh
⚠
Shell
├─
README.md
Markdown
└─
SKILL.md
Markdown
Dependencies 2 items
| Package | Version | Source | Known Vulns | Notes |
|---|---|---|---|---|
Node.js >= 18 | unspecified runtime version | runtime | No | No package.json / package-lock.json found — no npm dependencies. Uses only built-in Node.js modules (http, crypto, child_process, fs, url, path) |
1Password CLI (op) | latest | system binary | No | External system binary invoked via execSync. SKILL.md declares '1Password CLI recommended' but does not verify installation. Failure is handled gracefully (returns null token) |
Security Positives
✓ All network requests target the legitimate Anthropic API endpoint (api.anthropic.com) — no C2 or exfiltration channels detected
✓ Dashboard server binds to 127.0.0.1 only and implements CSRF token validation — good localhost-only design
✓ Atomic file writes using tmp + renameSync pattern for auth-profiles.json — prevents corruption
✓ tokens.json has chmod 600 applied — mitigates other-user file read risk
✓ External URLs point to a named GitHub repo with a real company (5dmgmt.com) — consistent with a legitimate open-source tool, not typosquatting
✓ setup-tokens.sh passes credentials via environment variables to Python rather than string interpolation — mitigates shell injection
✓ server.mjs uses import.meta.url and path-safe file serving — no path traversal vectors
✓ HTML dashboard uses DOM API (createElement) instead of innerHTML — mitigates XSS
✓ AJAX calls to /api/usage require both CSRF token and localhost origin verification — defense in depth