Skip to content

Bash-Sandbox auf Linux (bubblewrap) #80

Description

@webmatze

Abgespalten von #30, das die macOS-Hälfte trägt und mit #79 geschlossen wurde. Die Linux-Hälfte war dort nie belegt: Es stand keine Linux-Maschine zur Verfügung, auf der bubblewrap zu prüfen gewesen wäre, und ein Feature auf Verdacht zu bauen war ausdrücklich nicht der Zuschnitt.

Was schon da ist

Die Naht ist gelegt und die schwierigen Entscheidungen sind auf macOS getroffen und gemessen. Eine Linux-Strategie ist eine Klasse, kein Umbau:

  • Sandbox::Strategy (src/smith/sandbox.cr:117) — name, active?, wrap(command) : {String, Array(String)}, sandboxed?, describe. MacOS und Off implementieren sie; Sandbox.build wählt aus.
  • Policy trägt bereits alles, was eine zweite Umsetzung braucht: write, write_defaults, deny_read, network (allow/deny/ports), unsandboxed, auto_approve, required.
  • Sandbox.absolute löst ~ und Symlinks auf — beides sind stille Fehlerquellen und auf Linux nicht anders.
  • BashJobs#start ist der einzige Ort, an dem ein Shell-Prozess entsteht; das Wrapping sitzt dort und deckt Hintergrund-Jobs mit ab.
  • SandboxApprover, smith sandbox, die Warnung beim Start und required = true sind plattformunabhängig und funktionieren, sobald active? true liefert.

Zu schreiben ist also im Kern: Sandbox::Linux < Strategy plus ein Zweig in Sandbox.build.

Zu klären, bevor Code entsteht — am besten als Spike wie #65

  1. bubblewrap oder Landlock? bwrap ist ein Prozess-Wrapper und passt exakt auf wrap, braucht aber unprivilegierte User-Namespaces, die manche Distributionen abschalten (und Debian/Ubuntu über AppArmor-Profile einschränken). Landlock ist im Kernel (ab 5.13, mehrere ABI-Versionen mit unterschiedlichem Funktionsumfang), braucht keine Namespaces — aber Syscalls statt eines Binaries, also Bindings. Die Antwort entscheidet, ob das ein Wrapper oder eine Bibliotheksanbindung wird.
  2. Wie wird auf „nicht verfügbar" erkannt? Auf macOS reicht File.exists?. Auf Linux ist bwrap vorhanden und kann trotzdem scheitern, wenn Namespaces gesperrt sind. Der Test muss also ein echter Probelauf sein, wie es die Specs für die Schachtelung schon tun (SANDBOX_EXEC_USABLE, spec/smith/sandbox_spec.cr:29) — sonst meldet smith Schutz, den es nicht hat.
  3. Die Schreib-Allowlist ist eine andere. Die macOS-Voreinstellungen (~/Library/Caches, $TMPDIR als /var/folders/…) sind dort sinnlos; Linux braucht $XDG_CACHE_HOME, ~/.cache, /tmp, ~/.local/{share,state}, ~/.npm, ~/.cargo. Der Lackmustest ist derselbe: make test innerhalb der Sandbox. Auf macOS hat genau das zwei Verzeichnisse aufgedeckt, ohne die die Toolchain obskur scheitert.
  4. Netzwerk. bwrap --unshare-net ist ein ganzes Netz-Namespace, also alles oder nichts — die Portebene, die SBPL kann, gibt es dort nicht. Entweder network = "ports:…" ist auf Linux nicht unterstützt und sagt das, oder es braucht mehr Maschinerie (eigenes Namespace plus Filter). Ersteres wäre konsistent damit, wie die Hostnamen-Grenze auf macOS behandelt wird.
  5. Lesen. macOS erlaubt Lesen pauschal und nimmt deny_read gezielt heraus. Mit bwrap ist es umgekehrt: Was nicht gebindet ist, ist nicht da. Ein --ro-bind / / mit gezielten --tmpfs-Überdeckungen für deny_read kommt der macOS-Semantik am nächsten — zu prüfen, ob das trägt.
  6. Was passiert mit /proc, /dev und dem TTY? bwrap braucht --dev, --proc und meist --die-with-parent; ohne das Letzte überlebt ein Hintergrund-Job seinen Aufrufer. smith bringt Jobs beim Sessionende selbst um (BashJobs#shutdown_all), aber die Interaktion gehört geprüft.

Akzeptanzkriterien

  • Sandbox::Linux implementiert Strategy; Sandbox.build wählt sie auf Linux
  • Verfügbarkeit wird durch einen echten Probelauf festgestellt, nicht durch die bloße Existenz eines Binaries
  • Voreingestellte Schreibpfade sind für Linux gewählt und mit make test innerhalb der Sandbox belegt
  • Ein Schreibversuch außerhalb scheitert, und der Spec beweist es durch echte Ausführung — wie die vier macOS-Specs es tun
  • Was der Netz-Modus auf Linux nicht kann, wird benannt statt stillschweigend anders ausgelegt
  • README: der Abschnitt Bash Sandbox heißt dann nicht mehr „(macOS)" und sagt pro Plattform, was gilt
  • smith sandbox zeigt die Linux-Strategie so an, dass erkennbar ist, was tatsächlich greift

Nicht-Ziele

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestprio:3Gross, strategisch, spaeterready-for-humanRequires human implementation

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions