Hallo allerseits. Wir beteiligen uns aktiv an der Arbeit und bereiten im Januar viele kraftvolle Starts vor. Unter anderem wurde ein Set für einen neuen Stream des Linux Administrator- Kurses angekündigt, den alle lieben. Im Vorgriff auf den Start teilen wir traditionell die Übersetzung von nützlichem Material.
Dateiberechtigungen bieten eine sichere Alternative zu SUID-ausführbaren Dateien, können jedoch auf den ersten Blick etwas verwirrend wirken.
Wir alle wissen, dass
SUID- Binärdateien eine
schlechte Sicherheitslösung sind . Glücklicherweise gibt es eine effizientere Methode, die als
Dateiberechtigungen bezeichnet wird , wenn für Ihre Anwendung einige eingeschränkte Berechtigungen erforderlich sind.
Ich werde Ihnen Zeit sparen, wenn Sie das Lesen des obigen Artikels im Detail vermeiden möchten: Im Wesentlichen ermöglichen Dateiberechtigungen Prozessen, die als Root ausgeführt werden, und haben daher das Recht, bestimmte durch
diese Liste begrenzte Funktionen zu speichern, wenn sie ausgeführt werden Rechte zurücksetzen und als nicht privilegierter Benutzer ausführen. Dies bedeutet, dass ein Angreifer, der es schafft, einen Prozess durch Überlaufen eines Puffers oder eines anderen Exploits zu gefährden, nur bestimmte Mindestberechtigungen ausnutzen kann, die der Prozess wirklich benötigt.
Berechtigungen eignen sich hervorragend für Dienste, die normalerweise immer als Root ausgeführt werden. Was ist jedoch mit Befehlszeilendienstprogrammen? Glücklicherweise wird dies auch unterstützt, sofern Sie die richtigen Dienstprogramme installiert haben. Wenn Sie beispielsweise Ubuntu verwenden, benötigen Sie das Paket
libcap2-bin
. Sie müssen auch einen nicht-archaischen Kernel
ausführen (ab Version
2.6.24 ).
Mit diesen Funktionen können Sie Berechtigungen ausführbaren Dateien zuordnen, ähnlich wie beim Festlegen des SUID-Bits, jedoch nur für einen bestimmten Berechtigungssatz. Das Dienstprogramm
setcap
dient zum Hinzufügen und Entfernen von Berechtigungen zu einer Datei.
Der erste Schritt besteht darin, die Berechtigungen auszuwählen, die Sie benötigen. Für diesen Artikel
tracewalk
ich davon aus, dass es ein Netzwerkdiagnosetool namens
tracewalk
, das
tracewalk
Sockets verwenden kann . Dies setzt normalerweise
CAP_NET_RAW
, dass die Anwendung als Root ausgeführt wird. Beim Anzeigen der
Liste wird jedoch nur die
CAP_NET_RAW
.
Angenommen, Sie befinden sich in dem Verzeichnis, in dem sich die
tracewalk
Binärdatei befindet, können Sie diese Berechtigung wie folgt hinzufügen:
sudo setcap cap_net_raw=eip tracewalk
Ignorieren Sie
=eip
das Suffix
=eip
um die Erlaubnis zu erhalten. Ich werde in ein paar Sekunden darüber sprechen. Bitte beachten Sie, dass der Berechtigungsname in Kleinbuchstaben geschrieben ist. Jetzt können Sie überprüfen, ob Sie die Berechtigungen korrekt konfiguriert haben:
setcap -v cap_new_raw=eip tracewalk
Oder Sie können alle Berechtigungen auflisten, die für diese ausführbare Datei festgelegt wurden:
getcap tracewalk
Als Referenz können Sie auch alle Berechtigungen aus der ausführbaren Datei entfernen, indem Sie Folgendes verwenden:
setcap -r tracewalk
Zu diesem Zeitpunkt sollten Sie in der Lage sein, die ausführbare Datei als nicht privilegierter Benutzer auszuführen, und er sollte in der Lage sein, mit unformatierten Sockets zu arbeiten, aber keine anderen Berechtigungen des Root-Benutzers zu besitzen.
Was bedeutet dieses seltsame Suffix
=eip
? Dies setzt ein gewisses Verständnis der Art der Berechtigungen voraus. Jeder Prozess verfügt über drei Berechtigungssätze -
effektiv, vererbbar und zulässig (effektiv, vererbbar und zulässig) :
- Effektive Berechtigungen sind diejenigen, die bestimmen, was ein Prozess tatsächlich tun kann. Beispielsweise kann es nicht mit
CAP_NET_RAW
Sockets CAP_NET_RAW
wenn sich CAP_NET_RAW
nicht in einer effizienten Menge befindet. - Zulässige Berechtigungen sind diejenigen, über die ein Prozess verfügen darf, wenn er sie über einen entsprechenden Aufruf anfordert. Sie erlauben keinem Prozess, tatsächlich etwas zu tun, es sei denn, es wurde speziell geschrieben, um die angegebene Berechtigung anzufordern. Auf diese Weise können Sie Prozesse schreiben, um dem effektiven Satz wichtige Berechtigungen nur für den Zeitraum hinzuzufügen, in dem sie wirklich benötigt werden.
- Vererbbare Berechtigungen sind diejenigen, die in der verfügbaren Auflistung des untergeordneten Prozesses vererbt werden können. Während des Vorgangs
fork()
oder clone()
erhält der untergeordnete Prozess immer eine Kopie der Berechtigungen des übergeordneten Prozesses, da er in diesem Moment immer noch dieselbe ausführbare Datei ausführt. Eine geerbte Menge wird verwendet, wenn exec()
(oder ein Äquivalent) aufgerufen wird, um die ausführbare Datei durch eine andere zu ersetzen. Zu diesem Zeitpunkt wird die verfügbare Prozessmenge von der geerbten Menge maskiert, um die verfügbare Menge zu erhalten, die für den neuen Prozess verwendet werden soll.
setcap
Dienstprogramm
setcap
ermöglicht es uns daher, Berechtigungen für diese drei Sätze unabhängig für eine bestimmte ausführbare Datei hinzuzufügen. Beachten Sie, dass die Bedeutung von Gruppen für Dateiberechtigungen etwas anders interpretiert wird:
- Verfügbare Dateiberechtigungen sind diejenigen, die für die ausführbare Datei immer verfügbar sind, auch wenn der aufgerufene übergeordnete Prozess sie nicht hatte. Früher wurden sie als "erzwungene" Berechtigungen bezeichnet.
- Geerbte Dateiberechtigungen definieren eine zusätzliche Maske, mit der auch Berechtigungen aus dem Satz des aufrufenden Prozesses entfernt werden können. Sie werden zusätzlich zu der geerbten Menge des aufrufenden Prozesses verwendet, sodass die Berechtigung nur geerbt wird, wenn sie in beiden Mengen vorhanden ist.
- Effektive Dateiberechtigungen sind eigentlich nur ein Bit und keine Menge. Wenn sie installiert sind, bedeutet dies, dass die gesamte verfügbare Menge auch in die effektive Menge des neuen Prozesses kopiert wird. Dies kann verwendet werden, um Berechtigungen zu Prozessen hinzuzufügen, die nicht speziell dafür geschrieben wurden, diese anzufordern. Da dies ein Bit ist, muss es für alle Berechtigungen festgelegt werden, wenn Sie es für eine Berechtigung festlegen. Sie können es sich als Legacy-Bit vorstellen, da es verwendet wird, um Berechtigungen für Anwendungen zuzulassen, die diese nicht unterstützen.
Wenn Sie Berechtigungen über
setcap
drei Buchstaben
e
,
i
und
p
auf
effiziente, geerbte und zugreifbare Mengen. Also eine frühere Spezifikation:
sudo setcap cap_net_raw=eip tracewalk
... gibt an, dass die
CAP_NET_RAW
zu den verfügbaren und geerbten Mengen hinzugefügt werden soll und dass auch das effektive Bit gesetzt werden soll. Dadurch werden alle zuvor festgelegten Berechtigungen in der Datei ersetzt. Verwenden Sie eine durch Kommas getrennte Liste, um mehrere Berechtigungen gleichzeitig festzulegen:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalk
Im Berechtigungsleitfaden wird dies alles ausführlicher behandelt, aber hoffentlich hat dieser Beitrag den Vorfall ein wenig entmystifiziert. Es bleiben nur einige Warnungen und Tricks zu erwähnen.
Erstens funktionieren Dateifunktionen nicht mit Symlinks - Sie müssen sie auf die Binärdatei selbst anwenden (dh auf das Ziel des Symlinks).
Zweitens funktionieren sie nicht mit interpretierten Skripten. Wenn Sie beispielsweise ein Python-Skript haben, dem Sie Berechtigungen zuweisen möchten, müssen Sie es dem Python-Interpreter selbst zuweisen. Dies ist offensichtlich ein potenzielles Sicherheitsproblem, da dann alle mit diesem Interpreter ausgeführten Skripte die angegebene Berechtigung haben, obwohl dies immer noch viel besser ist als die SUID. Die häufigste Problemumgehung besteht anscheinend darin, eine separate ausführbare Datei in C oder eine analoge Datei zu schreiben, mit der die erforderlichen Vorgänge ausgeführt und über ein Skript aufgerufen werden können. Dies ähnelt dem Ansatz von Wireshark, der die Binärdatei
/usr/bin/dumpcap
, um privilegierte Operationen auszuführen:
$ getcap /usr/bin/dumpcap /usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip
Drittens werden Dateiberechtigungen deaktiviert, wenn Sie die Umgebungsvariable
LD_LIBRARY_PATH
aus offensichtlichen Sicherheitsgründen verwenden
(1) .
LD_PRELOAD
gilt
LD_PRELOAD
für
LD_PRELOAD
.
1. Da der Angreifer offensichtlich eine der Standardbibliotheken ersetzen und LD_LIBRARY_PATH
verwenden LD_LIBRARY_PATH
zu erzwingen, dass seine Bibliothek dem System LD_LIBRARY_PATH
wird, und daher seinen eigenen willkürlichen Code mit den gleichen Berechtigungen wie die aufrufende Anwendung ausführen lässt.
Das ist alles. Details zum Kursprogramm finden Sie im Webinar, das am 24. Januar stattfindet.