Linux-Dateiberechtigungen

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.

Source: https://habr.com/ru/post/de483934/


All Articles