Hallo zusammen. Wir steigen aktiv in die Arbeit ein und bereiten bereits im Januar viele leistungsstarke Starts vor. Unter anderem wurde ein neuer Kurs angeboten, der allen gefallen hat. . Im Vorfeld des Starts teilen wir traditionell die Übersetzung nützlicher Materialien.

Dateiberechtigungen bieten eine sichere Alternative zu SUID-executablen Dateien, können aber auf den ersten Blick etwas verwirrend erscheinen.
Wir alle wissen, dass binäre Dateien zu bevorzugen. Zum Glück gibt es einen effizienteren Weg, den Ihre Anwendung benötigt, nämlich .
Ich erspare Ihnen die Zeit, wenn Sie eine detaillierte Lektüre des obigen Artikels vermeiden möchten: Im Wesentlichen ermöglichen Dateiberechtigungen Prozessen, die im Namen des Root-Benutzers ausgeführt werden und daher das Recht haben, irgendetwas zu tun, bestimmte begrenzte Möglichkeiten beizubehalten, die auf , eingeschränkt sind, wenn sie ihre Berechtigungen zurücksetzen und als nicht privilegierter Benutzer ausgeführt werden. Das bedeutet, dass, wenn ein Angreifer es schafft, einen Prozess durch einen Pufferüberlauf oder einen anderen Exploit zu kompromittieren, er nur von den bestimmten minimalen Berechtigungen profitieren kann, die der Prozess wirklich benötigt.
Berechtigungen sind hervorragend geeignet für Dienste, die normalerweise immer im Namen des Root-Benutzers gestartet werden, aber wie steht es um die Kommandozeilen-Utilities? Zum Glück wird dies ebenfalls unterstützt, vorausgesetzt, Sie haben die richtigen Utilities installiert. Wenn Sie Ubuntu verwenden, benötigen Sie beispielsweise das Paket libcap2-bin. Sie müssen auch einen nicht-archaischen Kernel ausführen (beginnend mit der Version 2.6.24).
Diese Funktionen ermöglichen es, Berechtigungen mit ausführbaren Dateien ähnlich wie das Setzen des SUID-Bits zu verknüpfen, jedoch nur für eine bestimmte Menge von Berechtigungen. Das Utility setcap wird verwendet, um Berechtigungen zu einer Datei hinzuzufügen oder zu entfernen.
Der erste Schritt besteht darin, die benötigten Berechtigungen auszuwählen. Für diesen Artikel nehme ich an, dass es ein Netzwerkdiagnosetool gibt, das tracewalk, genannt wird, das in der Lage sein sollte, . Normalerweise erfordert dies, dass die Anwendung im Namen des Root-Benutzers ausgeführt wird, aber beim Betrachten Es stellt sich heraus, dass nur eine Berechtigung erforderlich ist CAP_NET_RAW.
Vorausgesetzt, Sie befinden sich im Verzeichnis, in dem sich die Binärdatei befindet tracewalk, können Sie diese Berechtigung wie folgt hinzufügen:
sudo setcap cap_net_raw=eip tracewalk Ignorieren Sie vorerst das Suffix =eip für die Berechtigung, ich werde gleich darüber sprechen. Beachten Sie, dass der Name der Berechtigung in Kleinbuchstaben geschrieben ist. Jetzt können Sie überprüfen, ob Sie die Berechtigungen korrekt eingerichtet haben, mit:
setcap -v cap_new_raw=eip tracewalkOder Sie können eine Liste aller Berechtigungen anzeigen, die für diese ausführbare Datei festgelegt sind:
getcap tracewalk
Zur Information, Sie können auch alle Berechtigungen aus der ausführbaren Datei mit folgendem Befehl entfernen:
setcap -r tracewalkZu diesem Zeitpunkt sollten Sie in der Lage sein, die ausführbare Datei als nicht privilegierter Benutzer auszuführen, und sie sollte in der Lage sein, mit Raw-Sockets zu arbeiten, jedoch keine weiteren Privilegien wie der Root-Benutzer haben.
Was bedeutet also dieses seltsame Suffix? =eip? Здесь потребуется толика понимания природы разрешений. Каждый процесс имеет три набора разрешений — effektiv, vererbbar und verfügbar (effective, inheritable und permitted):
- Effektiv (Effective) Berechtigungen sind diejenigen, die bestimmen, was der Prozess tatsächlich tun kann. Zum Beispiel kann er nicht mit Raw-Sockets umgehen, wenn
CAP_NET_RAWes sich nicht im effektiven Satz befindet. - Verfügbare (Permitted) Berechtigungen sind diejenigen, die einem Prozess erlaubt sind, wenn er sie über einen entsprechenden Aufruf anfordert. Sie erlauben dem Prozess nicht, tatsächlich etwas zu tun, es sei denn, er wurde speziell geschrieben, um die angegebene Berechtigung anzufordern. Dadurch können Prozesse erstellt werden, die besonders wichtige Berechtigungen nur für den Zeitraum hinzufügen, in dem sie wirklich benötigt werden.
- Vererbbare (Inheritable) Berechtigungen sind diejenigen, die im verfügbaren Satz des erzeugten Kindprozesses vererbt werden können. Während der Operation
fork()oderclone()erhält der Kindprozess immer eine Kopie der Berechtigungen des Elternprozesses, da er zu diesem Zeitpunkt immer noch die gleiche ausführbare Datei ausführt. Der vererbbare Satz wird verwendet, wennexec()(oder Ähnliches) aufgerufen wird, um die ausführbare Datei durch eine andere zu ersetzen. Zu diesem Zeitpunkt wird der verfügbare Satz des Prozesses durch den vererbbaren Satz maskiert, um den verfügbaren Satz zu erhalten, der für den neuen Prozess verwendet wird.
Auf diese Weise wird das Dienstprogramm setcap ermöglicht es uns, die Berechtigungen dieser drei Sätze unabhängig für die betreffende ausführbare Datei hinzuzufügen. Beachten Sie, dass der Wert der Gruppen für die Datei Berechtigungen etwas anders interpretiert wird:
- Verfügbare Dateiberechtigungen sind die, die für die ausführbare Datei immer verfügbar sind, auch wenn der übergeordnete Prozess, der sie aufgerufen hat, nicht über diese verfügte. Früher wurden sie als "erzwungene" Berechtigungen bezeichnet.
- Vererbt Die Dateiberechtigungen definieren eine zusätzliche Maske, die ebenfalls verwendet werden kann, um Berechtigungen aus dem Satz des aufrufenden Prozesses zu entfernen. Sie gelten zusätzlich zu dem vererbten Satz des aufrufenden Prozesses, sodass eine Berechtigung nur in der Vererbung stattfindet, wenn sie in beiden Sätzen vorhanden ist.
- Effektiv Die Dateiberechtigungen bestehen tatsächlich nur aus einem einzigen Bit und nicht aus einem Satz, und wenn dieses gesetzt ist, bedeutet das, dass der gesamte verfügbare Satz auch in den effektiven Satz des neuen Prozesses kopiert wird. Dies kann verwendet werden, um Berechtigungen für Prozesse hinzuzufügen, die nicht speziell darauf ausgerichtet sind, diese anzufordern. Da dies ein einzelnes Bit ist, muss, wenn Sie es für eine beliebige Berechtigung setzen, dies für alle Berechtigungen gesetzt werden. Sie können sich das als ein Legacy-Bit vorstellen, da es verwendet wird, um die Verwendung von Berechtigungen für Anwendungen zu ermöglichen, die sie nicht unterstützen.
Bei der Angabe von Berechtigungen über setcap drei Buchstaben e, i und p beziehen sich auf effektiv, vererbt und verfügbar Mengen entsprechend. Also, die frühere Spezifikation:
sudo setcap cap_net_raw=eip tracewalk ... gibt an, dass eine Berechtigung CAP_NET_RAW zu den verfügbaren und vererbten Sätzen hinzugefügt werden muss und dass auch das effektive Bit gesetzt werden muss. Dies ersetzt alle zuvor festgelegten Berechtigungen in der Datei. Um mehrere Berechtigungen auf einmal festzulegen, verwenden Sie eine durch Kommas getrennte Liste:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalkdiskutiert all dies ausführlicher, aber hoffentlich hat dieser Beitrag die Vorgänge etwas entschlüsselt. Es bleiben nur noch einige Warnhinweise und Tricks zu erwähnen.
Erstens funktionieren Dateiberechtigungen nicht mit symbolischen Links - Sie müssen sie auf die ausführbare Datei selbst anwenden (also auf das Ziel des symbolischen Links).
Zweitens arbeiten sie nicht mit interpretierten Skripten. Wenn Sie beispielsweise ein Python-Skript haben, dem Sie Berechtigungen zuweisen möchten, müssen Sie dies dem Python-Interpreter selbst zuweisen. Offensichtlich ist dies ein potenzielles Sicherheitsproblem, da dann alle Skripte, die mit diesem Interpreter ausgeführt werden, die angegebene Berechtigung haben, obwohl dies immer noch deutlich besser ist, als SUID zu verwenden. Der gängigste Workaround scheint die Erstellung einer separaten ausführbaren Datei in C oder einem ähnlichen Format zu sein, die die erforderlichen Operationen ausführen kann und aus dem Skript heraus aufgerufen wird. Dies ähnelt dem Ansatz, der von Wireshark verwendet wird, das eine Binärdatei verwendet. /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 eine Umgebungsvariable verwenden LD_LIBRARY_PATH aus verständlichen Sicherheitsgründen(1). Das gleiche gilt für LD_PRELOAD, soweit ich weiß.
1. Da ein Angreifer offensichtlich eine der Standardbibliotheken ersetzen und verwenden kann, LD_LIBRARY_PATH, um seine eigene Bibliothek bevorzugt vor der Systembibliothek aufzurufen, und somit eigenen beliebigen Code mit denselben Berechtigungen wie die aufrufende Anwendung ausführen kann.
Das war's. Detaillierte Informationen zum Programm des Kurses erhalten Sie auf
Quelle: habr.com
