Skip to content

Security-Review härten: Sandbox, kein Schreiben, private Befunde nicht öffentlich - #31

Merged
Musiker15 merged 3 commits into
mainfrom
security-review-haerten
Oct 10, 2026
Merged

Musiker15 merged 3 commits into
mainfrom
security-review-haerten

Conversation

@Musiker15

Copy link
Copy Markdown
Member

Härtung des Security-Reviews nach einer Kritik am ersten Stand. Die Grundarchitektur bleibt (eigener Job zum Veröffentlichen, OIDC statt Schlüssel, pull_request_target ohne Ausführung, persist-credentials: false, angehefteter Commit); behoben ist, was an ihr vorbei ging.

Was die Kritik fand, und was sich ändert

  1. Code aus dem PR lief im Job mit dem Recht auf ein Identity-Token. GitHub gibt ACTIONS_ID_TOKEN_REQUEST_* jedem Schritt eines Jobs mit id-token: write, also auch pnpm install und pnpm run build des PRs; dazu passwortloses sudo und offenes Netz. Jetzt:
    • Der Workflow installiert und baut nichts mehr. Die Shell des Agenten (nur bei PRs von Mitgliedern) läuft in der Sandbox von Claude Code: failIfUnavailable, allowUnsandboxedCommands: false, eigener Prozessraum (CLAUDE_CODE_SUBPROCESS_ENV_SCRUB), die Variablen des Tokens entfernt, Netz nur zu registry.npmjs.org, Lesen des Temp-Verzeichnisses des Runners gesperrt, Schreiben dort, in _actions und _tool gesperrt.
    • sudo ist abgeschaltet, bevor Claude Code startet; der Schritt bricht ab, wenn es noch geht.
    • Die Testdatenbank entfällt: die Sandbox hat ein eigenes localhost. Tests mit Datenbank laufen in der CI des PRs.
  2. Write war nicht auf das Arbeitsverzeichnis begrenzt. Write, Edit und NotebookEdit sind jetzt verboten, Lesen ist mit blockReadsOutsideWorkingDirectories auf das Arbeitsverzeichnis begrenzt. Der Bericht ist die letzte Antwort des Agenten (Ereignis result im Stream), keine Datei mehr, die ein Test überschreiben könnte.
  3. Einstellungen aus dem PR. Zu --safe-mode kommt --setting-sources user: eine .claude/settings.json im PR wird nicht geladen.
  4. Vorbestehende Lücken standen im öffentlichen Bericht. Der Agent schreibt sie in einen eigenen Block; der Schritt "Bericht prüfen" nimmt ihn heraus (auch einen nicht geschlossenen), er kommt nicht ins Artefakt, und "Private Befunde als Code-Scanning-Alerts ablegen" lädt ihn als SARIF auf den Basiszweig hoch. Die Alerts sehen in einem öffentlichen Repository nur Personen mit Schreibrecht.
  5. Insider. Ein Mitglied kann den Aufruf im eigenen PR ändern; der Status bleibt ein Signal gegen Fehler, kein Schutz gegen ein Mitglied. CODEOWNERS und eine Regel für .github/** sind eine eigene Entscheidung.

Der Job "Review" braucht dafür security-events: write; die Aufrufe geben es mit, wenn sie auf diesen Stand gehoben werden. Die Eingaben postgres-user und postgres-port entfallen.

Geprüft

  • YAML lädt, die Textprüfungen der CI.
  • Die Auswertung des Berichts lokal mit Beispieldaten: der private Block landet nicht im öffentlichen Bericht, ein nicht geschlossener Block führt zu "kein Bericht" statt zu einem Leck.
  • Drei Testläufe an Security-Review in GitHub Actions aufrufen opengewerk-kanzlei#48 mit einem Prüfzweig, der dem Agenten Befehle gegen die Sandbox aufgab. Der letzte (Lauf 38068085142): keine Variablen des Tokens, Token-Datei und Temp-Verzeichnis nicht sichtbar, sudo gesperrt ("no new privileges"), example.com abgelehnt, vier Prozesse sichtbar, Schreiben außerhalb des Arbeitsverzeichnisses ohne Wirkung auf das echte Dateisystem. Der erste Lauf legte einen Testeintrag als Code-Scanning-Alert ab und nicht im Kommentar. Der zweite zeigte, dass eine Schreibsperre auf dem Home den Arbeitsbereich mit sperrt und bwrap dann nicht startet; die Sperre gilt seitdem nur für vorhandene Pfade unterhalb des Runners.
  • Kosten der Testläufe 0,09 bis 0,12 USD.

…t öffentlich

Kritik am ersten Stand: Code aus dem PR lief mit den Variablen, die ein
Identity-Token anfordern, im selben Job; Write war nicht auf das
Arbeitsverzeichnis begrenzt; Einstellungen aus dem PR wurden geladen;
vorbestehende Lücken standen im öffentlichen Bericht. Jetzt läuft keine Zeile
des PRs außerhalb der Sandbox von Claude Code, sudo ist vor dem Start
abgeschaltet, der Bericht ist die letzte Antwort statt einer Datei, und
vorbestehende Lücken werden Code-Scanning-Alerts. Die Testdatenbank entfällt,
weil die Sandbox sie nicht erreicht.
…ufnimmt

Ausdrücklich gesperrt: das Temp-Verzeichnis des Runners mit den Dateien hinter
GITHUB_ENV und GITHUB_PATH, der Code der Actions, der Tool-Cache und das
Home-Verzeichnis.
Unter dem Home liegt auch der Arbeitsbereich; gesperrt war damit das
Arbeitsverzeichnis, und bwrap startete nicht. Ein fehlender Pfad hielte bwrap
ebenso an.
@Musiker15
Musiker15 merged commit c6ed917 into main Oct 10, 2026
5 checks passed
@Musiker15
Musiker15 deleted the security-review-haerten branch October 10, 2026 16:36
MorlockNinja pushed a commit to opengewerk/opengewerk-haustechnik that referenced this pull request Oct 10, 2026
Der Workflow der Organisation (opengewerk/.github#31) führt keinen Code des
PRs mehr außerhalb der Sandbox aus, schreibt nichts und legt vorbestehende
Lücken als Code-Scanning-Alerts ab. Der Aufruf gibt dafür security-events
mit; die Testdatenbank entfällt.
MorlockNinja pushed a commit to opengewerk/opengewerk that referenced this pull request Oct 10, 2026
Der Workflow der Organisation (opengewerk/.github#31) führt keinen Code des
PRs mehr außerhalb der Sandbox aus, schreibt nichts und legt vorbestehende
Lücken als Code-Scanning-Alerts ab. Der Aufruf gibt dafür security-events
mit; die Testdatenbank entfällt.
MorlockNinja pushed a commit to opengewerk/opengewerk-api-spec that referenced this pull request Oct 10, 2026
Der Workflow der Organisation (opengewerk/.github#31) führt keinen Code des
PRs mehr außerhalb der Sandbox aus, schreibt nichts und legt vorbestehende
Lücken als Code-Scanning-Alerts ab. Der Aufruf gibt dafür security-events
mit; die Testdatenbank entfällt.
MorlockNinja pushed a commit to opengewerk/opengewerk-website that referenced this pull request Oct 10, 2026
Der Workflow der Organisation (opengewerk/.github#31) führt keinen Code des
PRs mehr außerhalb der Sandbox aus, schreibt nichts und legt vorbestehende
Lücken als Code-Scanning-Alerts ab. Der Aufruf gibt dafür security-events
mit; die Testdatenbank entfällt.
MorlockNinja pushed a commit to opengewerk/opengewerk-kanzlei that referenced this pull request Oct 10, 2026
Der Workflow der Organisation (opengewerk/.github#31) führt keinen Code des
PRs mehr außerhalb der Sandbox aus, schreibt nichts und legt vorbestehende
Lücken als Code-Scanning-Alerts ab. Der Aufruf gibt dafür security-events
mit; die Testdatenbank entfällt.
Musiker15 added a commit to opengewerk/opengewerk-api-spec that referenced this pull request Oct 10, 2026
Das Security-Review läuft für dieses Repository jetzt in GitHub Actions,
mit dem Workflow der Organisation (opengewerk/.github#27 bis #31), wie
seit opengewerk/opengewerk-haustechnik#224 schon in der Haustechnik.
Bisher lief es auf dem Rechner von Moritz mit einem kostenlosen Modell,
dessen Kontingent am 10.10.2026 aufgebraucht war. Entschieden von Moritz
am 10.10.2026.

## Was sich ändert

- `.github/workflows/security-review.yml` ruft den Workflow der
Organisation auf, auf `pull_request` und `pull_request_target`,
angeheftet an seinen Commit `c6ed917` auf `main`, den gehärteten Stand
aus opengewerk/.github#31:
- PR aus einem Branch dieses Repositorys von einem Mitglied: Review mit
einer Shell in der Sandbox von Claude Code, ohne Zugang zum
Identity-Token, ohne sudo und ohne Netz außer der npm-Registry. Tests
mit Datenbank laufen in der CI des PRs.
- PR von außen: nur lesend, in der Environment `security-review-extern`,
die auf die Freigabe von Moritz wartet.
- Ein neuer Push bricht den Lauf des vorigen ab, geprüft wird nur der
neueste Commit.
- Das Ergebnis steht als Kommentar am PR und als Status
`PR-Security-Review` auf dem Head; keine Pflichtprüfung.
- Claude Code meldet sich über Workload Identity Federation an, ohne
gespeicherten Schlüssel. Der Aufruf gibt `security-events: write` mit:
vorbestehende Lücken, die das Review findet, werden
Code-Scanning-Alerts, die nur Maintainer sehen, statt im öffentlichen
Kommentar zu stehen.
- `CHANGELOG.md` unter "Geändert", wo es eines gibt.

## Geprüft

- Die drei Textprüfungen der CI.
- Dieser PR kommt aus einem Branch des Repositorys, also läuft auf ihm
selbst schon das volle Review. Das ist der Test, dass der Aufruf hier
funktioniert.
Musiker15 added a commit to opengewerk/opengewerk-website that referenced this pull request Oct 10, 2026
* Security-Review in GitHub Actions aufrufen

Der Workflow der Organisation prüft jeden Pull Request, für Mitglieder voll,
von außen nur lesend. Er löst den Reviewer ab, der auf einem Rechner lief.

* Security-Review: Aufruf auf den gehärteten Stand heben

Der Workflow der Organisation (opengewerk/.github#31) führt keinen Code des
PRs mehr außerhalb der Sandbox aus, schreibt nichts und legt vorbestehende
Lücken als Code-Scanning-Alerts ab. Der Aufruf gibt dafür security-events
mit; die Testdatenbank entfällt.
Musiker15 added a commit to opengewerk/opengewerk-kanzlei that referenced this pull request Oct 10, 2026
Das Security-Review läuft für dieses Repository jetzt in GitHub Actions,
mit dem Workflow der Organisation (opengewerk/.github#27 bis #31), wie
seit opengewerk/opengewerk-haustechnik#224 schon in der Haustechnik.
Bisher lief es auf dem Rechner von Moritz mit einem kostenlosen Modell,
dessen Kontingent am 10.10.2026 aufgebraucht war. Entschieden von Moritz
am 10.10.2026.

## Was sich ändert

- `.github/workflows/security-review.yml` ruft den Workflow der
Organisation auf, auf `pull_request` und `pull_request_target`,
angeheftet an seinen Commit `c6ed917` auf `main`, den gehärteten Stand
aus opengewerk/.github#31:
- PR aus einem Branch dieses Repositorys von einem Mitglied: Review mit
einer Shell in der Sandbox von Claude Code, ohne Zugang zum
Identity-Token, ohne sudo und ohne Netz außer der npm-Registry. Tests
mit Datenbank laufen in der CI des PRs.
- PR von außen: nur lesend, in der Environment `security-review-extern`,
die auf die Freigabe von Moritz wartet.
- Ein neuer Push bricht den Lauf des vorigen ab, geprüft wird nur der
neueste Commit.
- Das Ergebnis steht als Kommentar am PR und als Status
`PR-Security-Review` auf dem Head; keine Pflichtprüfung.
- Claude Code meldet sich über Workload Identity Federation an, ohne
gespeicherten Schlüssel. Der Aufruf gibt `security-events: write` mit:
vorbestehende Lücken, die das Review findet, werden
Code-Scanning-Alerts, die nur Maintainer sehen, statt im öffentlichen
Kommentar zu stehen.
- `CHANGELOG.md` unter "Geändert", wo es eines gibt.

## Geprüft

- Die drei Textprüfungen der CI.
- Dieser PR kommt aus einem Branch des Repositorys, also läuft auf ihm
selbst schon das volle Review. Das ist der Test, dass der Aufruf hier
funktioniert.
Musiker15 added a commit to opengewerk/opengewerk that referenced this pull request Oct 10, 2026
Das Security-Review läuft für dieses Repository jetzt in GitHub Actions,
mit dem Workflow der Organisation (opengewerk/.github#27 bis #31), wie
seit opengewerk/opengewerk-haustechnik#224 schon in der Haustechnik.
Bisher lief es auf dem Rechner von Moritz mit einem kostenlosen Modell,
dessen Kontingent am 10.10.2026 aufgebraucht war. Entschieden von Moritz
am 10.10.2026.

## Was sich ändert

- `.github/workflows/security-review.yml` ruft den Workflow der
Organisation auf, auf `pull_request` und `pull_request_target`,
angeheftet an seinen Commit `c6ed917` auf `main`, den gehärteten Stand
aus opengewerk/.github#31:
- PR aus einem Branch dieses Repositorys von einem Mitglied: Review mit
einer Shell in der Sandbox von Claude Code, ohne Zugang zum
Identity-Token, ohne sudo und ohne Netz außer der npm-Registry. Tests
mit Datenbank laufen in der CI des PRs.
- PR von außen: nur lesend, in der Environment `security-review-extern`,
die auf die Freigabe von Moritz wartet.
- Ein neuer Push bricht den Lauf des vorigen ab, geprüft wird nur der
neueste Commit.
- Das Ergebnis steht als Kommentar am PR und als Status
`PR-Security-Review` auf dem Head; keine Pflichtprüfung.
- Claude Code meldet sich über Workload Identity Federation an, ohne
gespeicherten Schlüssel. Der Aufruf gibt `security-events: write` mit:
vorbestehende Lücken, die das Review findet, werden
Code-Scanning-Alerts, die nur Maintainer sehen, statt im öffentlichen
Kommentar zu stehen.
- `CHANGELOG.md` unter "Geändert", wo es eines gibt.

## Geprüft

- Die drei Textprüfungen der CI.
- Dieser PR kommt aus einem Branch des Repositorys, also läuft auf ihm
selbst schon das volle Review. Das ist der Test, dass der Aufruf hier
funktioniert.
Musiker15 added a commit to opengewerk/opengewerk-haustechnik that referenced this pull request Oct 10, 2026
* Security-Review: Aufruf auf den Stand mit Bau heben

Der Workflow der Organisation baut seit opengewerk/.github#30 die Pakete,
bevor er testet. Die ersten Reviews hier blieben ohne sie statisch.

* Security-Review: Aufruf auf den gehärteten Stand heben

Der Workflow der Organisation (opengewerk/.github#31) führt keinen Code des
PRs mehr außerhalb der Sandbox aus, schreibt nichts und legt vorbestehende
Lücken als Code-Scanning-Alerts ab. Der Aufruf gibt dafür security-events
mit; die Testdatenbank entfällt.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant