AppArmor
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
AppArmor ist eine Kernel-Erweiterung, die entwickelt wurde, um die Ressourcen, die Programmen zur Verfügung stehen, durch programmspezifische Profile einzuschränken, und implementiert effektiv Mandatory Access Control (MAC), indem Zugriffssteuerungsattribute direkt an Programme anstelle von Benutzern gebunden werden. Dieses System funktioniert, indem es Profile in den Kernel lädt, normalerweise beim Booten, und diese Profile bestimmen, auf welche Ressourcen ein Programm zugreifen kann, wie z.B. Netzwerkverbindungen, Rohsocket-Zugriff und Dateiberechtigungen.
Es gibt zwei Betriebsmodi für AppArmor-Profile:
Durchsetzungsmodus: Dieser Modus setzt aktiv die im Profil definierten Richtlinien durch, blockiert Aktionen, die gegen diese Richtlinien verstoßen, und protokolliert alle Versuche, diese zu verletzen, über Systeme wie syslog oder auditd.
Beschwerdemodus: Im Gegensatz zum Durchsetzungsmodus blockiert der Beschwerdemodus keine Aktionen, die gegen die Richtlinien des Profils verstoßen. Stattdessen protokolliert er diese Versuche als Richtlinienverletzungen, ohne Einschränkungen durchzusetzen.
Kernelmodul: Verantwortlich für die Durchsetzung der Richtlinien.
Richtlinien: Legen die Regeln und Einschränkungen für das Verhalten von Programmen und den Zugriff auf Ressourcen fest.
Parser: Lädt Richtlinien in den Kernel zur Durchsetzung oder Berichterstattung.
Hilfsprogramme: Dies sind Programme im Benutzermodus, die eine Schnittstelle zur Interaktion mit und Verwaltung von AppArmor bereitstellen.
AppArmor-Profile werden normalerweise in /etc/apparmor.d/ gespeichert.
Mit sudo aa-status
können Sie die Binärdateien auflisten, die durch ein bestimmtes Profil eingeschränkt sind. Wenn Sie das Zeichen "/" im Pfad jeder aufgelisteten Binärdatei durch einen Punkt ersetzen, erhalten Sie den Namen des AppArmor-Profils im genannten Ordner.
Zum Beispiel wird ein AppArmor-Profil für /usr/bin/man in /etc/apparmor.d/usr.bin.man gespeichert.
Um die betroffene ausführbare Datei anzugeben, sind absolute Pfade und Platzhalter (für die Dateiglobierung) zur Angabe von Dateien erlaubt.
Um den Zugriff anzugeben, den die Binärdatei über Dateien haben wird, können die folgenden Zugriffssteuerungen verwendet werden:
r (lesen)
w (schreiben)
m (Speicherkarten als ausführbar)
k (Dateisperrung)
l (Erstellung harter Links)
ix (um ein anderes Programm auszuführen, wobei das neue Programm die Richtlinie erbt)
Px (unter einem anderen Profil ausführen, nach Bereinigung der Umgebung)
Cx (unter einem Kindprofil ausführen, nach Bereinigung der Umgebung)
Ux (unbeschränkt ausführen, nach Bereinigung der Umgebung)
Variablen können in den Profilen definiert und von außerhalb des Profils manipuliert werden. Zum Beispiel: @{PROC} und @{HOME} (füge #include <tunables/global> zur Profildatei hinzu)
Ablehnungsregeln werden unterstützt, um Erlaubensregeln zu überschreiben.
Um das Erstellen eines Profils zu erleichtern, kann apparmor Ihnen helfen. Es ist möglich, apparmor die von einer Binärdatei durchgeführten Aktionen zu inspizieren und Ihnen dann zu ermöglichen, zu entscheiden, welche Aktionen Sie erlauben oder ablehnen möchten. Sie müssen nur Folgendes ausführen:
Dann führen Sie in einer anderen Konsole alle Aktionen aus, die die Binärdatei normalerweise ausführen wird:
Dann drücken Sie in der ersten Konsole "s" und geben Sie dann in den aufgezeichneten Aktionen an, ob Sie ignorieren, erlauben oder etwas anderes möchten. Wenn Sie fertig sind, drücken Sie "f" und das neue Profil wird in /etc/apparmor.d/path.to.binary erstellt.
Mit den Pfeiltasten können Sie auswählen, was Sie erlauben/ablehnen/whatever möchten.
Sie können auch eine Vorlage eines AppArmor-Profils einer Binärdatei mit erstellen:
Beachten Sie, dass standardmäßig in einem erstellten Profil nichts erlaubt ist, sodass alles verweigert wird. Sie müssen Zeilen wie /etc/passwd r,
hinzufügen, um beispielsweise das Lesen der Binärdatei /etc/passwd
zu erlauben.
Sie können dann das neue Profil durchsetzen mit
Das folgende Tool liest die Protokolle und fragt den Benutzer, ob er einige der erkannten verbotenen Aktionen erlauben möchte:
Mit den Pfeiltasten können Sie auswählen, was Sie erlauben/ablehnen/was auch immer möchten
Beispiel für AUDIT- und DENIED-Protokolle aus /var/log/audit/audit.log der ausführbaren service_bin
:
Sie können diese Informationen auch mit folgendem Befehl abrufen:
Beachten Sie, wie das Profil docker-profile von Docker standardmäßig geladen wird:
By default Apparmor docker-default profile wird generiert von https://github.com/moby/moby/tree/master/profiles/apparmor
docker-default profile Zusammenfassung:
Zugriff auf alle Netzwerke
Keine Fähigkeit ist definiert (Allerdings werden einige Fähigkeiten durch das Einfügen grundlegender Basisregeln kommen, d.h. #include <abstractions/base>)
Schreiben in eine /proc-Datei ist nicht erlaubt
Andere Unterverzeichnisse/Dateien von /proc und /sys haben verweigerten Lese-/Schreib-/Sperr-/Link-/Ausführungszugriff
Mount ist nicht erlaubt
Ptrace kann nur auf einem Prozess ausgeführt werden, der durch das gleiche apparmor-Profil eingeschränkt ist
Sobald Sie einen Docker-Container ausführen, sollten Sie die folgende Ausgabe sehen:
Beachten Sie, dass apparmor sogar die Berechtigungen für Fähigkeiten blockiert, die standardmäßig dem Container gewährt werden. Zum Beispiel wird es in der Lage sein, die Berechtigung zum Schreiben in /proc zu blockieren, selbst wenn die SYS_ADMIN-Fähigkeit gewährt wird, da das standardmäßige docker apparmor-Profil diesen Zugriff verweigert:
Sie müssen apparmor deaktivieren, um seine Einschränkungen zu umgehen:
Beachten Sie, dass AppArmor standardmäßig auch verhindert, dass der Container Ordner von innen mountet, selbst mit der SYS_ADMIN-Fähigkeit.
Beachten Sie, dass Sie Fähigkeiten zum Docker-Container hinzufügen/entfernen können (dies wird weiterhin durch Schutzmethoden wie AppArmor und Seccomp eingeschränkt):
--cap-add=SYS_ADMIN
gibt die SYS_ADMIN
-Fähigkeit
--cap-add=ALL
gibt alle Fähigkeiten
--cap-drop=ALL --cap-add=SYS_PTRACE
entfernt alle Fähigkeiten und gibt nur SYS_PTRACE
In der Regel, wenn Sie feststellen, dass Sie eine privilegierte Fähigkeit innerhalb eines Docker-Containers zur Verfügung haben, aber ein Teil des Exploits nicht funktioniert, liegt das daran, dass Docker AppArmor es verhindern wird.
(Beispiel von hier)
Um die Funktionalität von AppArmor zu veranschaulichen, habe ich ein neues Docker-Profil „mydocker“ mit der folgenden Zeile hinzugefügt:
Um das Profil zu aktivieren, müssen wir Folgendes tun:
Um die Profile aufzulisten, können wir den folgenden Befehl ausführen. Der untenstehende Befehl listet mein neues AppArmor-Profil auf.
Wie unten gezeigt, erhalten wir einen Fehler, wenn wir versuchen, “/etc/” zu ändern, da das AppArmor-Profil den Schreibzugriff auf “/etc” verhindert.
Sie können herausfinden, welches AppArmor-Profil einen Container ausführt, indem Sie Folgendes verwenden:
Dann können Sie die folgende Zeile ausführen, um das genaue Profil zu finden, das verwendet wird:
In dem seltsamen Fall, dass Sie das AppArmor-Docker-Profil ändern und neu laden können. Könnten Sie die Einschränkungen entfernen und sie "umgehen".
AppArmor ist pfadbasiert, das bedeutet, dass selbst wenn es möglicherweise Dateien in einem Verzeichnis wie /proc
schützt, wenn Sie konfigurieren können, wie der Container ausgeführt wird, könnten Sie das proc-Verzeichnis des Hosts innerhalb von /host/proc
einbinden und es wird nicht mehr von AppArmor geschützt.
In diesem Bug sehen Sie ein Beispiel dafür, wie selbst wenn Sie verhindern, dass Perl mit bestimmten Ressourcen ausgeführt wird, wenn Sie einfach ein Shell-Skript erstellen, das in der ersten Zeile #!/usr/bin/perl
spezifiziert und Sie die Datei direkt ausführen, werden Sie in der Lage sein, alles auszuführen, was Sie wollen. Z.B.:
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)