Skip to content

security: internal infra details remain visible in git history despite 7145556 cleanup #54

Description

@sfegette

What I found

Commit 7145556 ("chore(security): remove internal automation from public repo") deleted .github/workflows/agent-dispatch.yml, .github/workflows/release.yml, scripts/release.sh, the internal CLAUDE.md, and public/CODEX_ACCESSIBILITY_REVIEW.md from HEAD, and added them to .gitignore so they can't be re-added by accident. Good instinct — but deleting a file in a new commit does not remove it from git history, and this is a public repo, so anyone can still git show 7145556^:scripts/release.sh (or clone + walk history) and get the full prior content.

I ran a scan across the entire history (git log --all -p) for literal credential patterns (GitHub PATs, Anthropic keys, Google API keys, Slack tokens, PEM blocks) and found no leaked secret values — that's the important good news, the actual token values were never committed.

What is still permanently visible in history, though:

  • Internal hostnames: m4mini.tailbaeb43.ts.net:8090 (a Tailscale tailnet MagicDNS name) and tracker.scottfegette.com, from the old scripts/release.sh / release.yml.
  • The tracker API's auth design: bearer-less, token passed as a URL query parameter (?token=${TRACKER_API_TOKEN}) — visible in plaintext in scripts/release.sh history and agent-dispatch.yml history. Tokens-in-URLs are an anti-pattern (they end up in proxy/server access logs), independent of whether the token value itself leaked.
  • The self-hosted runner setup and Apple Developer Team ID (MX6K4V7DP6), also from history + current project.yml. Team ID isn't secret (it's embedded in every signed binary anyway), but it does confirm which real-world Apple Developer account this project maps to.

Suggested fix (not applied)

  • Since no live secret values leaked, this is lower urgency than security: self-hosted Actions runner attached to this public repo, main branch unprotected #53, but as a precaution: rotate TRACKER_API_TOKEN and BRILLIANT_WEB_PAT anyway, since their names and usage pattern are now permanently public.
  • If the tailnet hostname / tracker domain shouldn't be public long-term, the only real fix is a history rewrite (git filter-repo) + force-push + telling any existing clones/forks to re-clone — that's a disruptive, irreversible-feeling operation for a repo with public forks, so flagging rather than doing it.
  • The token-in-query-param pattern lives in the tracker API itself (bmw-dev-stack), not in radcap — worth routing that fix cross-repo per the CLAUDE.md routing rule ("infra/backend work → sfegette/bmw-dev-stack").

I did not rewrite history or rotate any secrets — both are effectively irreversible/high-blast-radius and need your explicit go-ahead.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions