it-swarm.com.de

Ist es möglich, Berechtigungen zu eskalieren und aus einem Docker-Container zu entkommen?

Ich lerne viel über Docker. Ich übe das Erstellen von Docker-Clustern mit Docker-Schwarm, Registrierung, Werft usw.

Ich habe gesehen, wie einfach es ist, auf einem Docker-Host-Computer root zu werden, wenn Sie mit einem eingeschränkten Benutzer mit Docker-Berechtigungen auf den Host zugegriffen haben. Ich habe mich gefragt, ob es stattdessen möglich sein könnte, von einem Docker-Container-Service auf den Docker-Host-Computer zu "entkommen" (egal ob als Root oder nicht).

Kann das gemacht werden?

Irgendein Proof of Concept? Ich habe gegoogelt und nichts aussagekräftiges gefunden.

33
OscarAkaElvis

Ein Benutzer auf einem Docker-Host, der Zugriff auf die Docker-Gruppe oder Berechtigungen für Sudo-Docker-Befehle hat, ist effektiv root (da Sie beispielsweise Docker verwenden können, um einen privilegierten Container auszuführen oder das Root-Dateisystem in einem Container zu mounten) sehr wichtig, um dieses Recht zu kontrollieren.

Das Ausbrechen eines Docker-Containers zum Host ist ein anderes Spiel und wird abhängig von einer Reihe von Faktoren mehr oder weniger schwierig. Mögliche Vektoren sind:

  • Kernel-Schwachstellen. Container, die auf einem Host ausgeführt werden, verwenden denselben Kernel wie der Host. Wenn also ein ausnutzbares Problem im Kernel vorliegt, das möglicherweise zum Ausbrechen des Containers für den Host verwendet wird
  • Schlechte Konfiguration. Wenn ein Container, auf den Sie Zugriff haben, mit --privileged Sie können wahrscheinlich auf den zugrunde liegenden Host zugreifen.
  • Bereitgestellte Dateisysteme. Wenn ein Container, über den Sie verfügen, ein Host-Dateisystem bereitstellt, können Sie wahrscheinlich Elemente in diesem Dateisystem ändern, wodurch Sie möglicherweise Berechtigungen für den Host festlegen können.
  • Montierte Docker-Buchse. Eine relativ häufige (und gefährliche) Praxis in Docker-Containern besteht darin, den Docker-Socket in einen Container einzubinden, damit der Container den Status des Docker-Daemons verstehen kann. Dies ermöglicht einen trivialen Ausbruch zum Host. Weitere Informationen hier

Wenn Sie nach weiteren Informationen suchen, würde ich diese Whitepaper von NCC empfehlen. Missbrauch von privilegierten und nicht privilegierten Linux-Containern und Grundlegendes und Härten von Linix-Containern . Es gibt auch eine Präsentation, die ich gemacht habe und die einige dieser Dinge behandelt hier .

Wenn Sie an Docker-Härtung interessiert sind, empfehlen wir Ihnen auch einen Blick auf CIS-Sicherheitsstandard .

49
Rory McCune

Mit normalen Mitteln nein. Docker wurde absichtlich nach diesem Sicherheitskonzept entwickelt.

Es verwendet die Namespace-Funktionalität des Kernels, um die in einem Container ausgeführten Prozesse von den auf dem Host ausgeführten Prozessen zu trennen. Wenn ein Weg gefunden würde, würde er als Sicherheitslücke betrachtet und so schnell wie möglich geschlossen.

Obwohl es systemweite Konfigurationseinstellungen geben könnte. In der Regel werden Docker-Container mit SYS_ADMIN Ausgeführt, was im Wesentlichen bedeutet, dass sie IP-Adressen und viele andere Funktionen ändern können, die normalerweise auf dem Host-Computer verfügbar sind. Wenn ein Container mit SYS_ADMIN Ausgeführt wird, ist er als eine in chroot ausgeführte Aufgabe im Wesentlichen nicht wirklich besser geschützt.

Obwohl diese Konfiguration hauptsächlich verwendet wird, wenn ein Docker-Container als Dienst ausgeführt wird, wie ein Daemon auf einem Linux-Server. Auf normalen Laptops wird bei bestimmungsgemäßer Verwendung alles standardmäßig ausgeführt. Wenn dies nicht der Fall wäre, müssten die Docker-Benutzer allen von ihnen verwendeten Container-Entwicklern vertrauen. Jetzt müssen sie nur noch den Docker-Entwicklern vertrauen.

In der Windows-Version des Dockers würde dies nicht ausreichen. Windows Docker startet ein Linux VM mit HyperV und führt die Docker-Container in dieser Linux-VM aus. Ein Ausbruch aus einem Container würde nur eine Root-Berechtigung auf dieser VM bedeuten, um auf den Client auszubrechen, den Sie haben musste auch im hyperV ein loch finden.