Privilegierte Container
Root im Container ist Root im Host-Kernel.
Was ist Privilegierte Container?
Ein Container ist nicht automatisch eine Sicherheitsgrenze. Ein darin als root laufender Prozess wird vom Host-Kernel als root behandelt. Mit privilegiertem Modus und einem eingebundenen Host-Dateisystem fällt die Isolation weitgehend weg. Sie prüfen die Capabilities, lesen über den Mount das Host-Dateisystem, entwenden den privaten Root-SSH-Schlüssel und hinterlegen Ihren eigenen Schlüssel für dauerhaften Zugang. Die Lösung umfasst zwei Dateien: eine USER-Anweisung für einen Benutzer ohne Root-Rechte im Dockerfile sowie das Entfernen des privilegierten Modus und aller Capabilities in Compose.
Was Sie lernen in Privilegierte Container
- Erklären Sie, dass die Container-Isolation auf Kernel-Funktionen beruht und keine absolute Grenze bildet: Root im Container wird vom Host-Kernel als root behandelt
- Ermitteln Sie anhand der Capability-Bitmaske in der Prozessstatusdatei des Containers, welche Rechte --privileged gewährt
- Verfolgen Sie einen Host-Escape durch einen Bind-Mount, von der Auflistung des Host-Dateisystems über den Diebstahl seines Root-SSH-Schlüssels bis hin zum Einschleusen Ihres eigenen
- Fügen Sie dem Dockerfile eine USER-Anweisung für einen Benutzer ohne Root-Rechte hinzu, damit eine Lücke in der Isolation dem laufenden Prozess weniger Möglichkeiten eröffnet
- Entfernen Sie in Compose den privilegierten Modus und den Host-Mount, entziehen Sie mit cap_drop ALL alle Capabilities, machen Sie das Root-Dateisystem schreibgeschützt und versuchen Sie den Ausbruch in der Staging-Umgebung erneut
Privilegierte Container — Trainingsschritte
-
Eine Shell im Container
Bob greift Vosswark an. Dessen Medienservice passt die Größe hochgeladener Kundenbilder an und wandelt deren Format um. Eine ungepatchte Bildbibliothek in diesem Dienst ermöglicht ihm, Code aus der Ferne auszuführen. Jetzt hat er eine Shell im Container. Wie er hineingelangt ist, ist hier weniger wichtig als die Frage, was er mit den Rechten des Containers tun kann.
-
Wer bin ich, und was kann ich tun
Zwei Fragen entscheiden, ob dieser erste Zugang eine Sackgasse oder ein Weg zum Host ist: Unter welchem Benutzer läuft der Prozess, und welche Rechte gewährt ihm der Kernel? Eine Datei beantwortet beides.
-
Was der privilegierte Modus ermöglicht
Privilegiert bedeutet, dass die üblichen Einschränkungen weitgehend entfallen. Bob prüft, ob dem Container außerdem direkt Dateien des Hosts zugänglich gemacht wurden.
-
Den SSH-Schlüssel des Hosts stehlen
Der Container war nur das Mittel zum Zweck. Bobs Ziel liegt auf dem Host: in einem Verzeichnis, dessen Inhalt ihm den Zugang zu weiteren Rechnern der Flotte verschaffen kann.
-
Was den Ausbruch möglich machte
-
Eine Hintertür hinterlassen
Den Schlüssel zu lesen, ist Datendiebstahl. Auf den Host zu schreiben, verschafft Bob dauerhaften Zugang. Da der Mount nicht schreibgeschützt ist, kann er seinen öffentlichen Schlüssel an die Datei authorized_keys des Hosts anhängen. Danach braucht er den gestohlenen Schlüssel nicht mehr. Bei Erfolg gibt der Befehl nichts aus, wie in einer echten Shell. Die fehlende Ausgabe macht den Angriff leicht zu übersehen.
-
Prüfen, worauf ein einziger Container Zugriff hatte
Bob besitzt nun den privaten Schlüssel des Hosts und hat seinen eigenen öffentlichen Schlüssel hinterlegt. Der Media-Worker sollte nur hochgeladene Kundenbilder bearbeiten. Mit dieser Konfiguration bot er aber Zugang zu jedem Rechner, der dem gestohlenen Schlüssel vertraut, sowie einen jederzeit nutzbaren Zugang zum Host.
-
Der Host meldet einen Lesezugriff
Vosswark überwacht die Integrität von Dateien auf seinen Hosts. Das System muss nicht wissen, welcher Container etwas getan hat: Es meldet, dass der private Schlüssel des Hosts gelesen wurde.
-
Die Startkonfiguration des Containers prüfen
Das Dockerfile beschreibt den Inhalt des Images, aber nicht die Optionen, mit denen der Container gestartet wurde. Genau diese Optionen verursachten den Vorfall. Aufschluss darüber gibt die Konfiguration des laufenden Containers auf dem Host.
-
Das Dockerfile öffnen
Die beiden Teile der Lösung liegen in verschiedenen Dateien: Das Image legt fest, unter welchem Benutzer der Prozess läuft. Die Deployment-Konfiguration bestimmt, auf welche Host-Ressourcen er zugreifen darf. Beginnen Sie beim Image.
Abdeckung der Sicherheits-Frameworks
CWE
- CWE-250 Execution with Unnecessary Privileges
- CWE-269 Improper Privilege Management
MITRE ATT&CK
- T1611 Escape to Host
CIS Controls
- CIS 4 Secure Configuration of Enterprise Assets and Software
- CIS 6 Access Control Management
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security
- PR.AA Identity Management, Authentication, and Access Control