Problem
- API keys stored in plaintext localStorage (any XSS can steal them)
- SSRF in URL resolution — no private IP blocking
- No URL scheme validation (file://, javascript: allowed)
Solution
API Key Encryption
- Use Web Crypto API (AES-GCM) to encrypt keys at rest
- Generate encryption key on first use
- Migrate existing plaintext keys
SSRF Protection
- Block localhost, 127.0.0.1, private IPs
- Validate URL scheme (http/https only)
- Add error messages for blocked URLs
Files
src/lib/llm/config.ts — encryption
src/lib/llm/encryption.ts (new)
src/lib/resolver.ts — URL validation
Acceptance Criteria
Priority
High — Security vulnerability.
Plan
See plans/37-security-quality-hardening.md Tasks 37.1, 37.2
Problem
Solution
API Key Encryption
SSRF Protection
Files
src/lib/llm/config.ts— encryptionsrc/lib/llm/encryption.ts(new)src/lib/resolver.ts— URL validationAcceptance Criteria
Priority
High — Security vulnerability.
Plan
See
plans/37-security-quality-hardening.mdTasks 37.1, 37.2