fix(ci): Fork-PR-Risiko für den docker-host-Runner dokumentieren (ADR-0003) #50

Merged
cschlaefke merged 4 commits from fix/43-ci-fork-pr-guard into main 2026-11-03 14:15:19 +00:00
Owner

Zusammenfassung

Refs #43 (bewusst kein Closes: die manuellen Schritte A und B sind offen).

Das Repo ist öffentlich, der Runner shuffle-mac-runner (docker-host, dind) läuft auf deinem Mac. Das Repo allein kann ihn nicht gegen böswillige Fork-PRs schützen: Bei pull_request kommt die Workflow-Datei aus dem Fork und kann runs-on selbst setzen. Schützen können nur die Freigabe-Pflicht, ein isolierter Runner oder ein privates Repo.

Änderungen

  • .forgejo/workflows/ci.yml: if:-Guard (Fork-PRs überspringen) gilt jetzt auch für supabase-tests (vorher nur e2e). Kommentare stellen klar, dass der Guard kein Schutz ist.
  • docs/adr/0003-ci-runner-sicherheit.md (neu, Status „Vorgeschlagen"): Analyse der Forgejo-Mechanismen, Entscheidung in drei Schichten, Schritt-für-Schritt-Anleitung A/B/C.
  • docs/adr/README.md (neu): Index ADR-0001 bis -0003.
  • docs/auth-konfiguration.md: Satz zum e2e-Job korrigiert.

Befund (Kern)

Forgejo 8.0.3 (Quelltext gelesen, nicht live getestet): Fork-PRs von Nutzern ohne Schreibrecht warten auf Freigabe. Hat der Nutzer aber schon einen freigegebenen Lauf im Repo, entfällt die Freigabe künftig. Eine Freigabe vertraut ihm also dauerhaft.

Review

code-reviewer: keine Blocker. W1 (falsche „Komfort"-Begründung), W2 (Testkonto aufräumen) und W3 (restricted-Nebenwirkungen) sind eingearbeitet.

Bitte bestätigen / manuell erledigen (siehe ADR)

  • A: Verhalten mit zweitem Konto prüfen (Fork-PR, zweiter Push), Testkonto danach löschen
  • Freigabe-Disziplin: Fork-PR-Läufe auf diesem Runner nicht freigeben
  • B: Runner isolieren (Wegwerf-VM/separater Host), nur für dieses Repo registrieren
  • Entscheidung: Repo privat stellen? (löst das Problem vollständig)
  • ADR-Status von „Vorgeschlagen" auf „Angenommen" setzen, sobald entschieden

Nicht getestet

  • Kein Fork-PR-Test, kein Lauf mit der geänderten ci.yml. Nach dem Push dieses PR prüfen, dass supabase-tests und e2e grün laufen und nicht übersprungen werden.
  • Unverifiziert gegen 8.0.3: DEFAULT_USER_IS_RESTRICTED, Sichtbarkeit öffentlicher Repos für restricted-Nutzer, UI-Bezeichnung „Geschützte Dateimuster" und deren Wirkung auf Merges, „Runner deaktivieren", launchctl-Weg, Instanz-Option gegen Forks.

🤖 Generated with Claude Code

## Zusammenfassung Refs #43 (bewusst kein `Closes`: die manuellen Schritte A und B sind offen). Das Repo ist öffentlich, der Runner `shuffle-mac-runner` (`docker-host`, dind) läuft auf deinem Mac. Das Repo allein kann ihn nicht gegen böswillige Fork-PRs schützen: Bei `pull_request` kommt die Workflow-Datei aus dem Fork und kann `runs-on` selbst setzen. Schützen können nur die Freigabe-Pflicht, ein isolierter Runner oder ein privates Repo. ## Änderungen - `.forgejo/workflows/ci.yml`: `if:`-Guard (Fork-PRs überspringen) gilt jetzt auch für `supabase-tests` (vorher nur `e2e`). Kommentare stellen klar, dass der Guard **kein Schutz** ist. - `docs/adr/0003-ci-runner-sicherheit.md` (neu, Status „Vorgeschlagen"): Analyse der Forgejo-Mechanismen, Entscheidung in drei Schichten, Schritt-für-Schritt-Anleitung A/B/C. - `docs/adr/README.md` (neu): Index ADR-0001 bis -0003. - `docs/auth-konfiguration.md`: Satz zum `e2e`-Job korrigiert. ## Befund (Kern) Forgejo 8.0.3 (Quelltext gelesen, nicht live getestet): Fork-PRs von Nutzern ohne Schreibrecht warten auf Freigabe. Hat der Nutzer aber schon einen freigegebenen Lauf im Repo, entfällt die Freigabe künftig. Eine Freigabe vertraut ihm also dauerhaft. ## Review `code-reviewer`: keine Blocker. W1 (falsche „Komfort"-Begründung), W2 (Testkonto aufräumen) und W3 (`restricted`-Nebenwirkungen) sind eingearbeitet. ## Bitte bestätigen / manuell erledigen (siehe ADR) - [ ] A: Verhalten mit zweitem Konto prüfen (Fork-PR, zweiter Push), Testkonto danach löschen - [ ] Freigabe-Disziplin: Fork-PR-Läufe auf diesem Runner nicht freigeben - [ ] B: Runner isolieren (Wegwerf-VM/separater Host), nur für dieses Repo registrieren - [ ] Entscheidung: Repo privat stellen? (löst das Problem vollständig) - [ ] ADR-Status von „Vorgeschlagen" auf „Angenommen" setzen, sobald entschieden ## Nicht getestet - Kein Fork-PR-Test, kein Lauf mit der geänderten `ci.yml`. Nach dem Push dieses PR prüfen, dass `supabase-tests` und `e2e` grün laufen und nicht übersprungen werden. - Unverifiziert gegen 8.0.3: `DEFAULT_USER_IS_RESTRICTED`, Sichtbarkeit öffentlicher Repos für `restricted`-Nutzer, UI-Bezeichnung „Geschützte Dateimuster" und deren Wirkung auf Merges, „Runner deaktivieren", `launchctl`-Weg, Instanz-Option gegen Forks. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
cschlaefke added 4 commits 2026-11-03 12:59:21 +00:00
Add ADR-0003 with Forgejo 8.0.3 options and a step-by-step guide for
runner/Forgejo settings, correct the misleading guard comments in ci.yml
and apply the comfort guard to supabase-tests too.

Refs #43

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Refs #43

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Refs #43

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
docs(ci): align auth-konfiguration guard wording with ADR-0003
All checks were successful
CI / flutter (pull_request) Successful in 1m21s
CI / web-build (pull_request) Successful in 58s
CI / supabase (pull_request) Successful in 3s
CI / supabase-tests (pull_request) Successful in 32s
CI / e2e (pull_request) Successful in 3m1s
6c4e2cc2e9
Refs #43

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
cschlaefke merged commit 79e06fbfe9 into main 2026-11-03 14:15:19 +00:00
cschlaefke deleted branch fix/43-ci-fork-pr-guard 2026-11-03 14:15:19 +00:00
cschlaefke added the
status/ready-for-merge
label 2026-11-03 14:15:33 +00:00
Author
Owner

Review-Stand (Orchestrator): CI grün auf 6c4e2cc (flutter, web-build, supabase, supabase-tests, e2e, alle success). supabase-tests und e2e laufen also nicht übersprungen, der neue if:-Guard wertet für PRs aus dem eigenen Repo wie erwartet aus. code-reviewer: keine Blocker, W1–W3 eingearbeitet. Es wurde kein Fork-PR getestet. Merge durch Chris; #43 bleibt offen, bis die manuellen Schritte A/B aus ADR-0003 erledigt sind.

**Review-Stand (Orchestrator):** CI grün auf 6c4e2cc (`flutter`, `web-build`, `supabase`, `supabase-tests`, `e2e`, alle success). `supabase-tests` und `e2e` laufen also nicht übersprungen, der neue `if:`-Guard wertet für PRs aus dem eigenen Repo wie erwartet aus. `code-reviewer`: keine Blocker, W1–W3 eingearbeitet. Es wurde kein Fork-PR getestet. Merge durch Chris; #43 bleibt offen, bis die manuellen Schritte A/B aus ADR-0003 erledigt sind.
Sign in to join this conversation.
No description provided.