Offengelegter Docker-Daemon
Ein Docker-Daemon, der im Netzwerk antwortet, ist Remote Root.
Was ist Offengelegter Docker-Daemon?
Die Docker-API ist Root-äquivalent und verfügt über keine eigene Authentifizierung. Ein an einen einfachen TCP-Port gebundener Daemon ermöglicht es jedem, der ihn erreichen kann, Container zu starten, das Host-Dateisystem zu mounten und die Maschine zu lesen. Es liegt keine Schwachstelle vor. Sie prüfen Port 2375 ohne Authentifizierung von außen, listen Produktionscontainer auf und mounten den Host-Root per Bind-Mount, um seine Umgebungsdatei zu lesen. Dann entfernen Sie die tcp://0.0.0.0:2375-Bindung, erfordern TLS-Client-Zertifikate und sehen, dass derselbe Prüfpunkt abgelehnt wurde. Die Übung behandelt auch das Mounten von /var/run/docker.sock in einen Container.
Was Sie lernen in Offengelegter Docker-Daemon
- Beachten Sie, dass die Docker-API Root-äquivalent ist und über keine eigene Authentifizierung verfügt
- Identifizieren Sie einen Daemon, der an tcp://0.0.0.0:2375 gebunden ist, als entfernten, nicht authentifizierten Root, der keine Schwachstelle und keinen vorherigen Halt benötigt
- Verfolgen Sie, wie ein Angreifer den Host-Root per Bind-Mount in einen Container einbindet und die Produktionsumgebungsdatei darüber liest
- Konfigurieren Sie den Daemon so, dass die einfache TCP-Bindung gelöscht wird und gegenseitige TLS-Client-Zertifikate erforderlich sind. Bestätigen Sie dann, dass derselbe Test abgelehnt wird
- Erklären Sie, warum das Mounten von /var/run/docker.sock in einen Container diesem Container die gleiche Root-äquivalente API verleiht
Offengelegter Docker-Daemon — Trainingsschritte
-
Die öffentliche Statusseite lesen
Bob ist in nichts eingedrungen. Er sitzt an seinem eigenen Laptop und liest Pallistons öffentliche Betriebsseite. Sie soll Kunden versichern, dass die Plattform funktionsfähig ist, und nennt dabei die Produktions-Knoten, deren öffentliche IPs und die Docker-Engine, die jeder von ihnen ausführt. Sieh dir an, was sie preisgibt, bevor Bob es sich zunutze macht.
-
Die Zeile, die zu viel verrät
Es braucht nur eine Zeile. Die öffentliche IP eines Produktions-Knotens und die Tatsache, dass er Docker ausführt, sind alles, was Bob für den billigsten Angriff überhaupt braucht.
-
Beim Daemon anklopfen
Der Docker-Daemon kann so konfiguriert werden, dass er an einem Netzwerk-Port lauscht statt nur am lokalen Socket. Ist das der Fall und TLS ist deaktiviert, antwortet er jedem. Bob richtet seine eigene Docker-CLI auf Port 2375 dieses Knotens und stellt ihm die harmloseste Frage überhaupt: welche Version bist du. Wenn er antwortet, ist das Spiel bereits vorbei.
-
Die Produktionsflotte auslesen
Die Docker-API ist keine schmale Sache. Sie listet, startet, stoppt und baut Container, und all das als root. Bobs erster Zug damit ist einfach hinzusehen: Was läuft auf diesem Host eigentlich.
-
Den Host einbinden, die Secrets stehlen
Bob muss nicht in die laufenden Container einbrechen. Der Daemon startet ihm einen brandneuen, und der bindet ein, was auch immer Bob verlangt. Er fordert das gesamte Root-Dateisystem des Hosts unter /host an und liest dann die Produktions-Umgebungsdatei direkt durch den Mount. Der Container gehört ihm. Der Host liegt darunter. Es gab nie eine Wand zwischen den beiden.
-
Was das möglich gemacht hat
Ein kurzer Moment beim Mechanismus, bevor die Reaktion beginnt.
-
Der Daemon protokolliert einen Fremden
Palliston versendet seine Docker-Daemon-Logs an einen zentralen Collector. Es braucht kein Intrusion-Detection-Produkt, um zu bemerken, was da auftauchte: API-Aufrufe an den Daemon auf ops-node-01, von einer IP, die niemandem bei Palliston gehört.
-
Bestätigen, dass die Tür offen ist
Bevor sie etwas ändert, reproduziert Alice, was die Logs beschreiben. Wenn eine nicht authentifizierte Versionsabfrage von ihrer eigenen Maschine aus beantwortet wird, ist der Daemon genau so offengelegt, wie Priya befürchtet hat.
-
Die Daemon-Konfiguration öffnen
Das Verhalten des Daemons wird in einer einzigen Datei festgelegt, /etc/docker/daemon.json. Was auch immer ihn angewiesen hat, ohne TLS am Netzwerk zu lauschen, ist eine Zeile hier drin.
-
Finde heraus, was den Port geöffnet hat
Zwei Einstellungen, direkt nebeneinander, sind die gesamte Offenlegung. Die eine bringt die API ans Netzwerk; die andere weist sie an, nicht zu prüfen, wer anruft.
Abdeckung der Sicherheits-Frameworks
CWE
- CWE-306 Missing Authentication for Critical Function
- CWE-284 Improper Access Control
MITRE ATT&CK
- T1610 Deploy Container
- T1133 External Remote Services
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