Skip to content

Security-Review: Docker abschalten, Checkout nach dem Agenten entfernen - #36

Merged
Musiker15 merged 1 commit into
mainfrom
security-review-docker-checkout
Oct 10, 2026
Merged

Musiker15 merged 1 commit into
mainfrom
security-review-docker-checkout

Conversation

@Musiker15

@Musiker15 Musiker15 commented Oct 10, 2026 •

Copy link
Copy Markdown
Member

Härtet das Security-Review nach einer zweiten Kritik am gehärteten Stand.

Was sich ändert

  • Docker ist abgeschaltet. Der Läufer gehört zur Gruppe docker, und docker run -v /:/host ist so gut wie root. Der Schritt heißt jetzt "sudo und Docker abschalten": er stoppt docker.socket, docker.service und containerd.service, solange sudo das noch kann, und bricht ab, wenn danach sudo -n true oder docker info noch gelingt.
  • Der Checkout geht gleich nach dem Agenten. Er ist der einzige Ort, an dem der Agent schreiben kann, .git eingeschlossen. Der Post-Schritt von actions/checkout ruft dort am Ende des Jobs git und git submodule foreach auf, außerhalb der Sandbox und mit der Umgebung des Jobs. Ein neuer Schritt "Checkout entfernen" (if: always()) entfernt pr/; nach dem Agenten braucht ihn kein Schritt mehr.
  • Kein hängender Status mehr. Lehnt die API das Review ab (Freigabe durch Actions abgeschaltet, Text zu lang, API gestört), brach der Schritt bisher vor dem Setzen des Status ab, und PR-Security-Review blieb auf "läuft". Jetzt steht er dann auf error mit einem Verweis auf den Lauf, und der Job wird rot.
  • Restrisiko benannt. kernel.apparmor_restrict_unprivileged_userns=0 öffnet den Kern über User Namespaces wieder für jeden Prozess des Jobs. Das steht jetzt als Kommentar am Schritt "Sandbox vorbereiten": bewusst getragen, nur für PRs von Mitgliedern, ein PR von außen bekommt keine Shell.

Eigene Festlegungen, die Moritz noch nicht gesehen hat

  • Die Freigabe (APPROVE) bei einem Review ohne Befund bleibt, wie Moritz es entschieden hat. Sie ist auf main kein Tor: das Ruleset verlangt keine Freigabe (required_approving_review_count: 0), und PR-Security-Review steht nicht unter den Pflichtprüfungen. Eine Freigabe, die ein Mitglied über einen eigenen Workflow erzeugt, öffnet deshalb nichts; einen Status mit demselben Namen könnte es genauso setzen. Wirksam dagegen wäre CODEOWNERS für .github/** mit Pflicht zur Freigabe durch den Eigentümer, das liegt bei Moritz.
  • systemctl stop darf scheitern (|| true), etwa wenn ein Abbild Docker nicht mitbringt; maßgeblich ist die Prüfung mit docker info danach.

Geprüft

  • YAML liest sich, die drei Textprüfungen der CI sind grün.
  • Ein Test-PR in opengewerk-kanzlei (Test: Security-Review auf dem Prüfzweig von .github#36 opengewerk-kanzlei#51), dessen Aufruf auf 426c2cc zeigt: alle drei Jobs grün, "sudo und Docker abschalten" mit beiden Prüfungen durch, "Checkout entfernen" vor dem Post-Schritt von actions/checkout, der danach ohne Fehler endet, Status gesetzt. Rot war der Status allein am erwarteten Befund "Pin liegt nicht auf main"; den Inhalt dieses Zweigs bewertet das Review dort als Härtung ohne Befund.

Der Läufer gehört zur Gruppe docker, und ein Container mit der Wurzel des
Hosts wäre ein zweiter Weg zu root. Der Daemon stoppt jetzt vor sudo, und
beides wird geprüft. Den Checkout, in dem der Agent schreiben kann, entfernt
ein Schritt gleich nach ihm, bevor der Post-Schritt von actions/checkout dort
git aufruft. Lässt sich das Review am PR nicht ablegen, steht der Status auf
error statt dauerhaft auf "läuft". Das Restrisiko der wieder erlaubten User
Namespaces steht als Kommentar im Workflow.
@Musiker15
Musiker15 merged commit 450efc1 into main Oct 10, 2026
5 checks passed
@Musiker15
Musiker15 deleted the security-review-docker-checkout branch October 10, 2026 18:25
Musiker15 added a commit to opengewerk/opengewerk-api-spec that referenced this pull request Oct 10, 2026
)

- Docker stoppt, bevor sudo abgeschaltet wird, und beides wird geprüft:
Der Läufer gehört zur Gruppe docker, und ein Container mit der Wurzel
des Hosts wäre ein zweiter Weg zu root.
- Den Checkout, in dem der Agent schreiben kann, entfernt ein Schritt
gleich nach ihm, bevor der Post-Schritt von `actions/checkout` dort git
aufruft.
- Lässt sich das Review am PR nicht ablegen, steht der Status auf
`error` statt dauerhaft auf "läuft".
- Das Restrisiko der wieder erlaubten User Namespaces steht als
Kommentar im Workflow.
- Mit dabei: opengewerk/.github#35, der Nachweis eines neuen Pins
enthält die ganze Workflow-Datei.

Geprüft auf dem Läufer mit dem Test-PR opengewerk/opengewerk-kanzlei#51,
dessen Aufruf auf den Prüfcommit zeigte: alle Jobs grün, Docker und sudo
abgeschaltet, Checkout vor dem Post-Schritt entfernt, Status gesetzt.
Das Review dieses PRs liest den Diff des neuen Pins aus `.github`.
Musiker15 added a commit to opengewerk/opengewerk-website that referenced this pull request Oct 10, 2026
Musiker15 added a commit to opengewerk/opengewerk-kanzlei that referenced this pull request Oct 10, 2026
)

- Docker stoppt, bevor sudo abgeschaltet wird, und beides wird geprüft:
Der Läufer gehört zur Gruppe docker, und ein Container mit der Wurzel
des Hosts wäre ein zweiter Weg zu root.
- Den Checkout, in dem der Agent schreiben kann, entfernt ein Schritt
gleich nach ihm, bevor der Post-Schritt von `actions/checkout` dort git
aufruft.
- Lässt sich das Review am PR nicht ablegen, steht der Status auf
`error` statt dauerhaft auf "läuft".
- Das Restrisiko der wieder erlaubten User Namespaces steht als
Kommentar im Workflow.
- Mit dabei: opengewerk/.github#35, der Nachweis eines neuen Pins
enthält die ganze Workflow-Datei.

Geprüft auf dem Läufer mit dem Test-PR #51,
dessen Aufruf auf den Prüfcommit zeigte: alle Jobs grün, Docker und sudo
abgeschaltet, Checkout vor dem Post-Schritt entfernt, Status gesetzt.
Das Review dieses PRs liest den Diff des neuen Pins aus `.github`.
Musiker15 added a commit to opengewerk/opengewerk that referenced this pull request Oct 10, 2026
…590)

- Docker stoppt, bevor sudo abgeschaltet wird, und beides wird geprüft:
Der Läufer gehört zur Gruppe docker, und ein Container mit der Wurzel
des Hosts wäre ein zweiter Weg zu root.
- Den Checkout, in dem der Agent schreiben kann, entfernt ein Schritt
gleich nach ihm, bevor der Post-Schritt von `actions/checkout` dort git
aufruft.
- Lässt sich das Review am PR nicht ablegen, steht der Status auf
`error` statt dauerhaft auf "läuft".
- Das Restrisiko der wieder erlaubten User Namespaces steht als
Kommentar im Workflow.
- Mit dabei: opengewerk/.github#35, der Nachweis eines neuen Pins
enthält die ganze Workflow-Datei.

Geprüft auf dem Läufer mit dem Test-PR opengewerk/opengewerk-kanzlei#51,
dessen Aufruf auf den Prüfcommit zeigte: alle Jobs grün, Docker und sudo
abgeschaltet, Checkout vor dem Post-Schritt entfernt, Status gesetzt.
Das Review dieses PRs liest den Diff des neuen Pins aus `.github`.
Musiker15 added a commit to opengewerk/opengewerk-haustechnik that referenced this pull request Oct 10, 2026
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