T09 · Insecure Skill Coding Practices
- Location
server/classifier.py:466- Finding
Automatic Disclosure of Detailed Financial Data to External LLM Providers
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This personal finance skill is mostly coherent, but it needs Review because it handles bank data and credentials with broad persistent access and some under-scoped disclosure paths.
Review this carefully before installing. It is a real local finance tool, but installation grants a persistent daemon access to bank transaction data, Plaid credentials, OpenClaw credential files, and LLM providers. Only install if you accept external LLM classification fallback, plaintext storage of Plaid developer credentials, and system-level Python/package and launchd changes.
server/classifier.py:466Automatic Disclosure of Detailed Financial Data to External LLM Providers
server/llm.py:89Unauthorized Discovery and Use of Host Agent Credentials
server/main.py:2674Plaid API Secret Persisted in Plaintext in Both SQLite and a Dotenv File
SKILL.md:24Unpinned Dependencies Installed Directly into System Python
server/installer.py:77Installer Can Destroy Existing OpenClaw Configuration on Read or Parse Failure
The notification endpoint is taken directly from the OPENCLAW_NOTIFY_URL environment variable and then used for an outbound POST without allowlisting or verification. If an attacker can influence the process environment, they can redirect notification contents to an arbitrary host, causing data exfiltration or unintended internal network access.
method="POST",
)
try:
with request.urlopen(req, timeout=5) as resp:
return resp.status < 400
except (URLError, OSError):
return False
The design includes sending finance-related notifications and classification questions through OpenClaw chat, which can leak sensitive transaction context into a broader messaging substrate outside the local budgeting daemon. Because the product is explicitly positioned as a personal-finance assistant, chat notifications can expose private spending details through external channels, logs, integrations, or less-trusted client surfaces.
- **First-run flow:** when the UI sees that `app_config.ui_password_hash`
is empty, every route except `/setup` redirects there. The `/setup`
wizard collects: new password, confirm password, optional notification
preference ("send chat notifications via OpenClaw if available"), then
prompts to connect a first bank.
- **Password storage:** argon2id hash in `app_config.ui_password_hash`.
Never sent back to the browser.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
| Component | Before | After |
|---|---|---|
| `plaid_config` table | Existed in schema | Unchanged — already correct |
| Access token encryption | Fernet key in macOS Keychain (stable) | Unchanged — already correct |
| Access tokens in DB | Stored encrypted in `bank_connections` | Unchanged — already correct |
| `configure_plaid()` → DB write | Present but crashed on uninit DB in tests | Wrapped in `try/except`; gracefully skips if DB not ready |
| Daemon startup | Only loaded `.env`; no DB credential loading | Adds `_load_plaid_config_from_db()` step after `init_db` |
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
|---|---|---|
| `plaid_config` table | Existed in schema | Unchanged — already correct |
| Access token encryption | Fernet key in macOS Keychain (stable) | Unchanged — already correct |
| Access tokens in DB | Stored encrypted in `bank_connections` | Unchanged — already correct |
| `configure_plaid()` → DB write | Present but crashed on uninit DB in tests | Wrapped in `try/except`; gracefully skips if DB not ready |
| Daemon startup | Only loaded `.env`; no DB credential loading | Adds `_load_plaid_config_from_db()` step after `init_db` |
| `health_monitor` | Created per-connection providers, ignoring `plaid_provider` arg | Uses passed `plaid_provider` when not None; only creates per-connection providers when called standalone |
The README instructs users to hand Plaid Client ID and Secret directly to an AI agent without a strong warning about secret handling risks. This encourages users to disclose sensitive credentials into a conversational channel that may be logged, retained by the host agent, or exposed to other tools/prompts, expanding the trust boundary unnecessarily.
This explicitly tells the user to provide Plaid credentials to an AI agent, which is a direct secret-disclosure pattern. Even if the app is local-only, the agent/client ecosystem may log messages, sync transcripts, or expose prompt content to other components, making credential compromise more likely.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.
The finding notes that Plaid credentials are written to a local .env file and process environment variables are modified. In a banking application, persisting API credentials in a plaintext environment file materially increases the risk of credential disclosure through local compromise, backups, logs, or accidental inclusion in support bundles, and the skill's own guidance says credentials should not be stored in plain text.