← back to Codex Review 2026 04 30
SECRETS_AT_RISK.md
110 lines
# Secrets at risk — worklist for /secrets skill
Built 2026-04-30T23:45:19-07:00. Each line is a project + finding citation.
## AgentAbrams
- - `snippets/redact_lint.py:71-73`, `.github/workflows/ci.yml:34-40`: detected secrets are printed with surrounding snippet into CI logs. Fix by printing only pattern name + file/line, never matched content.
- - `video/oauth_authorize.py:31-32`: refresh token is printed to stdout, making terminal logs/screen recordings a secret leak. Fix by writing only to a chmod-600 local file or clipboard prompt, not stdout.
- - `.gitignore:1-7` correctly excludes common local secret files, OAuth client files, and pickles.
## bankrupt-leads
- - Secrets/auth/SQL injection: none observed.
## bubbesblock
- - `.env.example:1-2`: good start, but add all required keys, including `DPLA_API_KEY`, so setup drift is visible.
## claimmyaddress
- - `.env:2-5`: live API keys are stored in plaintext in the project directory; if synced, backed up, or later committed, they are exposed. Rotate these keys, move secrets to a real secret store, and keep only `.env.example`.
- - `.env:3`: `GOOGLE_GEOCODING_API_KEY` is a server-side key; if not strictly IP/service-account restricted, it can be abused for billable requests. Verify restrictions in GCP and rotate after removal.
- - `.env.example:1-2`: example config omits `DPLA_API_KEY` from `.env:5`, so local setup will drift or fail when code eventually depends on it. Keep required env vars complete with placeholder values.
## dear-bubbe-next
- - No secrets, credentials, or production data were present in the visible files.
## Designer-Wallcoverings
- - `DW-Agents/ecosystem.config.js:45`, `:72`, `:92`, `:134`, `:176`, `:494`; `brand-router/server.js:11`; `DW-Websites/shop-by-color/server.js:9`: real-looking Shopify/Slack/Anthropic/Zendesk/Postgres secrets are hardcoded. Rotate every exposed credential, purge from files/history/backups, load only from env/secret store.
- - `.env:1`, `shopify/.env:1`, `DW-MCP/.env:1`, `DW-Agents/.env:1`: live secret-bearing env files sit inside the project tree. Confirm whether they are tracked/backed up; rotate and move to an untracked secrets location.
- - `admin/server.ts:19`, `:30`, `:61`, `:421-424`: admin interface falls back to `admin123`, uses `Math.random()` bearer tokens, allows `Access-Control-Allow-Origin: *`, and prints the admin password. Require `ADMIN_PASSWORD`, use `crypto.randomBytes`, restrict CORS, never log secrets.
- - `DW-MCP/src/index.js:300-345`: Shopify OAuth callback has no state validation and logs/displays the new access token. Add OAuth `state` validation, authenticate token-generation flow, and never render/log tokens.
- - `DW-Agents/dw-agents/agent-slack/slack-agent.ts:275-280`: Slack events endpoint accepts unsigned JSON; `SLACK_SIGNING_SECRET` is defined but unused. Verify Slack request signatures before calling Claude or posting replies.
- - Are the exposed Shopify/Slack/Anthropic/Zendesk tokens still active?
## Forza
- - `README.md:27`, `DIARY.md:116`, `DIARY.md:272` document root SSH/deploy operations publicly; not a secret, but unnecessary recon material. Fix: move infra runbook to private notes and deploy with a non-root user.
## Hormuzy
- - Secrets/auth/SQL injection/prod credentials: none observed.
## jill-website
- - `src/server.ts:23` / `src/server.ts:24` / `src/middleware/auth.ts:12` / `views/admin.ejs:416`: production auth falls back to hardcoded passwords and the admin UI embeds `admin:admin123`. Require env secrets at boot; remove client-side Basic Auth; use server sessions.
- - Should the public site be password-protected, or only admin/write actions?
## Ken
- - `src/lib/auth.js:4`, `src/lib/auth.js:6`, `src/lib/db.js:4`: hardcoded JWT secret, admin password, and Postgres password in source; compromise of repo compromises app and DB. Move to env/secret manager, rotate all exposed secrets.
## lawyer-directory-builder
- - `.env:1`, `.env:9-14`: DB/admin/Stripe secrets are present in the project tree; compromise means admin takeover and live charges. Rotate secrets, remove `.env`, commit `.env.example`.
## Letsbegin
- - `.env.local:1`, `CLAUDE.md:5-6`, `CLAUDE.md:24-27`, `lib/gemini-image.ts:7`, `app/api/prd/generate/route.ts:8`: live API keys/passwords are in repo/docs. Rotate keys/passwords, purge history, require env vars with no fallbacks.
- - `lib/auth.ts:7-10`, `app/api/auth/login/route.ts:54-60`, `middleware.ts:68-80`: sessions are unsigned base64 JSON and cookies are `secure:false`; anyone can forge `{authenticated:true}`. Use signed/encrypted session cookies, `secure:true`, env-only secrets.
- - `app/api/quickmode/route.ts:4-6`: hardcoded Postgres production credentials. Move to `DATABASE_URL`, rotate DB password, and use least-privileged DB user.
## malden-house
- - [signup.js](/Users/stevestudio2/Projects/malden-house/signup.js:217): email verification is hardcoded `verified: true`; anyone can “claim” any address/email locally. Fix with server-side account creation, signed email tokens, and address ownership rules.
## Norma
- - `.env.local:1`, `.env.local:3-5`, `.env.local:14`, `.env.local:21-22`, `CLAUDE.md:12-13`, `README.md:21`: live-looking DB/admin/cron/session/Gemini/Gmail secrets are committed/documented. Rotate all exposed credentials, remove secrets from repo/docs, purge history if shared.
- - `middleware.ts:55-89` + `app/api/social/ai-image/route.ts:20`, `app/api/social/bulk-schedule/route.ts:66`, `app/api/social/bulk-schedule/route.ts:88`, `app/api/social/posts/approve/route.ts:10`, `app/api/social/posts/pending/route.ts:10`: middleware only checks token structure/expiry, while these routes do no `requireRole`; forged cookies can generate images, schedule/approve/read social posts. Add `requireRole` to every non-public route or crypto-verify in middleware.
- - `lib/auth.ts:5-8`, `lib/auth.ts:179-189`, `lib/cron-auth.ts:8`, `app/api/webhooks/pulse-topic/route.ts:6`: secrets fall back to predictable values and auth cookie is only `Secure` when `USE_HTTPS=true`. Fail closed in production and always set `Secure` behind HTTPS.
## resize-it
- - [server.py:21](/Users/stevestudio2/Projects/resize-it/server.py:21), [server.py:22](/Users/stevestudio2/Projects/resize-it/server.py:22), [.env:1](/Users/stevestudio2/Projects/resize-it/.env:1), [.env:2](/Users/stevestudio2/Projects/resize-it/.env:2): Spoonflower credentials are committed/hardcoded defaults. Rotate password, remove defaults, require env vars at startup.
- - [SKILL.md:89](/Users/stevestudio2/Projects/resize-it/SKILL.md:89): Gemini API key is embedded in docs/source. Revoke it, move to secret storage, scrub history if this was ever shared.
- - [server.py:29](/Users/stevestudio2/Projects/resize-it/server.py:29), [server.py:103](/Users/stevestudio2/Projects/resize-it/server.py:103), [server.py:155](/Users/stevestudio2/Projects/resize-it/server.py:155): no auth on endpoints that use stored Spoonflower credentials. Add owner auth/token gate; especially block public `/api/upload-to-spoonflower`.
## secrets-manager
- - Local secrets fan-out tool: captures/validates API tokens and writes them into project, skill, desktop, MCP, and remote `.env` targets.
- - `audit-2026-04-30.txt:1`: audit found `307` secret-looking leaks across projects/skills; current manager records the blast radius but does not remediate it. Rotate exposed keys, delete hardcoded copies, then rerun audit until clean.
- - `cli.js:68` + `cli.js:104`: `StrictHostKeyChecking=accept-new` while pushing secrets to remote root hosts risks trusting the wrong first-seen host. Pin host keys in `known_hosts` and fail closed.
- - `cli.js:247-259`: batch import tries to catch per-key errors, but `cmdAdd()` calls `process.exit()` on validation failure at `cli.js:225`; first bad token kills the whole batch. Return structured errors from `cmdAdd` instead of exiting inside it.
- - `clipboard-watcher.sh:60-70`: low-confidence token classifiers can send arbitrary clipboard strings to third-party verification endpoints. Require explicit key context or user confirmation for prefixless tokens.
- - `cli.js:96-110` writes remote secret bodies over stdin, not command-line args.
- - `cli.js:31` and registry storage avoid full secret values, keeping only last4/hash digests.
- - Should this tool be allowed to trigger `site-factory` automatically, or only stage secrets?
## site-factory
- - `.env:10`, `.env:13`, `sites/*/app/.env.local:5-7`: live Cloudflare/Stripe/webhook secrets are in the project tree. Rotate immediately, remove all real `.env*`, add `.gitignore`, move secrets to 1Password/Vercel/PM2 env.
- - `admin/server.js:15`: production can boot with hardcoded `SESSION_SECRET`, enabling session forgery if dev bypass is later removed. Refuse boot in production unless `SESSION_SECRET` is set and strong.
- - `sites/*/app/app/api/webhook/stripe/route.ts:11-13`: missing webhook secret makes the endpoint accept and ignore Stripe events. In production, fail closed unless explicitly `NODE_ENV !== "production"`.
- - `critic/server.js:112-148`, `critic/SELF-CRITIQUE.md:17-22`: `/critique/stub` can post arbitrary findings and has no auth/rate limit. Gate it behind dev-only/shared secret.
- - Stripe webhook signature verification exists when `STRIPE_WEBHOOK_SECRET` is configured.
## stayclaim
- - `src/app/search/page.tsx:128-130`, `src/app/api/search/route.ts:107-109`: OCR snippets are rendered with `dangerouslySetInnerHTML`; OCR/source text can become stored XSS. Escape source text and render `<mark>` tokens safely.
## the-ai-factory
- - `server.js:67`, `server.js:95`, `server.js:31`: no auth plus `Access-Control-Allow-Origin: *`; any webpage Steve visits can POST to localhost and trigger builds/activation. Fix: require `ADMIN_TOKEN` Bearer auth on all mutating routes and restrict CORS to the viewer origin.
- - `server.js:95`, `server.js:104`, `server.js:143`: activation copies LLM-generated files into `~/.claude` with only status gating, and `?force=true` bypasses approval. Fix: remove force from HTTP or require token + explicit local CLI confirmation; show/record a deterministic diff before copy.
- - Secrets leaked in code: none observed; checked-in `.env` is blank (`.env:4`, `.env:10`, `.env:14`).
- - `server.js`: `ADMIN_TOKEN` exists in env templates but is unused; either wire it or remove it.
## trademarks-copyright
- - `src/app/api/drops/checkout/route.ts:23`: if Stripe is unset, any caller can set any subscriber email to paid tier at lines `24-30`. Remove dev fallback outside `NODE_ENV !== "production"` and require subscriber token/session.
- - `.env.local:30`, `.env.local:47-48`: plaintext admin token and Basic auth credential, including raw password comment, sit in project dir. Rotate both; store outside repo/workspace backups.
- - `src/app/api/drops/cron/route.ts:15`: cron route is open if `CRON_TOKEN` is unset; `.env.local:25` uses `change-me-before-public`. Fail closed when missing and rotate token.
- - Admin middleware fails closed when `ADMIN_TOKEN` is missing in production.
## visual-factory
- - `server.js:223`, `server.js:257`, `server.js:279`, `server.js:326`, `server.js:362`: no auth/CSRF on create, retry, delete, activate, IG post. Any local webpage/process reaching `127.0.0.1:9892` can trigger destructive POSTs. Fix with required admin token plus Origin/CSRF checks.
## wholivedthere
- - `.env:2-5`, `scripts/deploy-direct.sh:21-22`, `scripts/deploy-pastdoor.sh:28-29`: committed Google/DPLA/GoDaddy API secrets; DNS/domain takeover and API billing exposure. Revoke/rotate now, remove defaults, keep only `.env.example`.
- - `scripts/deploy-pastdoor.sh:55-56`: rsync does not exclude `.env*`; local secrets can be copied to the server. Match `deploy-direct.sh` and exclude env files.
## yolo-agent
- - `server.js:17-18`, `ledger-app/src/lib/xfetch.ts:18`, `dashboard/task-ledger.html:279`: hardcoded `admin:DWSecure2024!` shipped in server and browser code. Anyone who sees the UI/source can control the agent. Fix: env-only secret, rotate password, remove client-side auth embedding.
- - `create-missing-collections.js:15`, `scripts/collection-descriptions.js:16`, `tasks/done/AG_dw-exclusive-page-update.md:9`, `tasks/done/14_shopify-image-audit.md:5`: live-looking Slack webhook, Gemini key, Shopify tokens, and Postgres credentials are committed in code/task artifacts. Fix: revoke/rotate all exposed secrets and purge/redact task archive.
- - `server.js:441-443`: Basic auth parsing uses `decoded.split(':')`; passwords containing `:` break, and comparison is not constant-time. Fix: robust parser plus timing-safe compare.
- - `server.js:486-514`: `/api/live-log` reads current log and arbitrary recent `/tmp/*.log` tails; authenticated users can see unrelated process output/secrets. Fix: only read agent-owned log path under `LOGS_DIR`.