Ungepatchter Docker-Fehler ermöglicht Lese- und Schreibzugriff auf das Host-Betriebssystem

Es gibt viele Bücher über Tools und Techniken zum Sichern von Softwarecontainern, aber was passiert, wenn jemand einen grundlegenden Architekturfehler entdeckt? Und was machst du, wenn es keinen funktionierenden Patch dafür gibt?

Dies ist die Situation im Docker-Universum in dieser Woche, nachdem der Suse-Entwickler Aleksa Sarai einen Fehler in der Art und Weise aufgedeckt hat, wie das Container-Framework mit Pfadnamen umgeht.

Der Fehler liegt in FollowSymlinkInScope, das Dateipfade auflöst, die an das Docker-Containersystem übergeben wurden. Da die Funktion den Dateipfad nach dem Auflösen nicht sofort verwendet, wird eine Race-Bedingung erstellt. Ein Angreifer, der in den aufgelösten Dateipfad eingreifen kann, kann ihn ändern und ihm als Root-Benutzer Lese- und Schreibzugriff auf das Host-Betriebssystem gewähren.

Container sind Softwarepakete, die eine Anwendung und ihre Abhängigkeiten enthalten. Sie sind so konzipiert, dass sie unabhängig von der Infrastruktur und der Arbeitsweise durch Virtualisierung eines Betriebssystems genau gleich ausgeführt werden (im Gegensatz zu virtuellen Maschinen, die Hardware virtualisieren). Container dürfen wie virtuelle Maschinen keinen Einfluss auf ihren Host-Container haben.

Dies alles klingt sehr ernst und die National Vulnerability Database (NVD) stuft den Schweregrad des Fehlers als hoch ein. Trotzdem hatte der Docker-Sicherheitsingenieur Justin Cormack seinen eigenen Kontext für den Fehler:

The vulnerability is a rare/unlikely scenario that would require an already compromised container, a copy being made without pausing the container, and a bad actor that knows when that copy is being made.

Jemand müsste docker cp verwenden, einen Docker-Befehl, der zum Kopieren von Dateien zwischen dem Host-Betriebssystem und dem Container verwendet wird. Der Angreifer müsste die Dateien zur gleichen Zeit ändern, zu der die Kopie erstellt wurde. Das Fenster ist nur wenige Millisekunden lang, betonte das Unternehmen in seiner Mail.

Laut Sarai gibt es zum Zeitpunkt des Schreibens keine funktionierende Softwarefixes für dieses Problem, obwohl er einen Patch eingereicht hat, der derzeit evaluiert wird. Dadurch wird Docker während der Verwendung des Dateisystems automatisch angehalten.

Dies hört sich nach dem Patch an, mit dem Docker das Problem behebt, wenn es die nächste monatliche Version herausgibt, indem automatisch ein Docker-Pausenbefehl eingefügt wird. Dadurch wird der Container eingefroren, wenn eine Kopie erstellt wird. Dies bedeutet, dass die Daten nicht geändert werden können.

In der Zwischenzeit können Benutzer das Problem manuell beheben, indem Sie den Befehl docker pause ausführen, bevor Sie docker cp zum Kopieren von Dateien verwenden, fügte das Unternehmen hinzu. Sie können Docker nach dem Erstellen der Kopie ohne Unterbrechung ausführen. Sie könnten docker cp auch deaktivieren, sagte Sarai, obwohl er vermutet, dass es andere Möglichkeiten gibt, FollowSymlinkInScope auszunutzen.

In einer E-Mail schlug Sarai eine andere Abhilfemaßnahme sowie einen möglichen Weg für Docker vor:

It would be good idea to run Docker underneath a restrictive AppArmor profile or with the correct SELinux configuration (which will restrict the scope of bad things that dockerd can do). The next release of Docker has experimental rootless containers support, and I hope in the medium-term people will start using that more often for deployments.

AppArmor ist ein Linux-Kernel-Sicherheitsmodul, mit dem Administratoren die Möglichkeiten von Programmen einschränken können. SELinux ist eine Reihe sicherer Kernelmodifikationen für Maßnahmen wie obligatorische Zugriffskontrollen.

Sarai hat Docker dies vor einem Jahr privat gemeldet, und das Unternehmen hat der Veröffentlichung der Fehlerinformationen zugestimmt, bevor ein Patch verfügbar war. Sarai sagte:

We agreed going through the embargo process would be overkill for a somewhat unlikely attack scenario, not to mention that there was a suspicion this vulnerability existed for quite a few years.