Warum können ausführbare Dateien in zB / usr / sbin von root geschrieben werden?

31

Könnten Sie bitte erklären, warum eine binär kompilierte Datei (z. B. in /usr/sbin) Schreibberechtigung für rootBenutzer hat?

Für mich ist dies zusammengestellt. Dies bedeutet, dass direktes Schreiben keine Verwendung hat und die Datei auf irgendeine Weise einem Sicherheitsproblem ausgesetzt sein kann.

Ein Skript (z. B. eine bashDatei) ist möglicherweise beschreibbar, da es sich im Grunde genommen um eine Textdatei handelt. Warum ist es jedoch für eine kompilierte Datei, für die meines Wissens eigentlich kein Schreiben erforderlich ist, dasselbe?

Vielen Dank im Voraus für Ihr Feedback.

t1m0th33
quelle
6
Sie fragen sich, warum der Benutzer rootSchreibzugriff auf eine Binärdatei hat. Wenn nichts anderes hilft es beim Upgrade dieses Pakets.
Eric Renouf
5
Beachten Sie, dass ironischerweise Binärdateien die einzigen Dateien sind, die wir normalerweise direkt auf die Festplatte schreiben / bearbeiten. Dies ist bei Textdateien wie Skripten nicht möglich, da bei Textänderungen nicht in die Datei geschrieben, sondern zusätzliche Bytes in der Mitte der Datei hinzugefügt oder Bytes in der Mitte der Datei gelöscht werden. Dies ist unmöglich mit fseek fwrite zu tun. Für Textdateien lesen wir normalerweise in den RAM, löschen dann die alte Datei und schreiben den Inhalt des RAM auf die Festplatte (dh wir überschreiben). Außerdem schreiben Sie beim Installieren, Verschieben oder Ersetzen von ausführbaren Dateien auf die Festplatte, sodass Sie Schreibberechtigungen benötigen.
Slebetman
1
@slebetman: Sie können Textdateien direkt bearbeiten. Öffnen Sie beispielsweise die Datei, erweitern Sie sie, ordnen Sie sie zu, memmove()verschieben Sie den letzten Teil zum Ende und öffnen Sie eine Lücke, und fügen Sie dann neuen Text in die Lücke ein. Oder Sie können eine Reihe von pread()/ verwenden pwrite(), um dasselbe zu tun.
Zan Lynx
6
@EricRenouf Tatsächlich sind keine Schreibberechtigungen für die Binärdatei erforderlich, um das Paket zu aktualisieren, das sie enthält. Bei einem Paket-Upgrade wird die alte Binärdatei nicht beschrieben. Tatsächlich ist dies unmöglich, wenn die Binärdatei gerade ausgeführt wird (Suche nach ETXTBSY). Stattdessen wird die alte Binärdatei entfernt und die neue Binärdatei in eine neue Datei mit demselben Namen geschrieben. Für das Entfernen von Dateien sind keine Schreibrechte erforderlich, lediglich für das enthaltene Verzeichnis (dh /usr/sbin/).
Marcelm
1
@marcelm: Genau genommen verwenden Sie nicht nur fseek und write, sondern puffern den Rest in den RAM. Sie können den Rest auch in eine andere Datei puffern. Oder Sie können neuen Inhalt in eine neue Datei schreiben. Mit keiner dieser Methoden können Sie Textdateien ohne großen Puffer erweitern.
Slebetman

Antworten:

50

Es spielt keine Rolle, ob die Dateien in /bin(oder einem anderen Standardverzeichnis, in dem ausführbare Dateien gespeichert sind) von root geschrieben werden können oder nicht. Auf einem Linux-Server, den ich verwende, sind sie von root schreibbar, auf meiner OpenBSD-Maschine jedoch nicht.

Solange sie nicht von der Gruppe oder von "anderen" beschreibbar sind!

Es gibt keine Sicherheitslücke, z

-rwxr-xr-x 1 root root 126584 Feb 18  2016 /bin/ls

Wenn jemand es überschreiben wollte, musste er root sein, und wenn er es ist rootund überschreibt, dann sind sie es auch

  1. Installieren einer neuen Version oder
  2. ungeschickt oder
  3. ein Angreifer mit Root-Berechtigungen bereits .

Eine andere zu berücksichtigende Sache ist, dass root in die Datei schreiben kann, egal ob sie schreibgeschützt ist oder nicht, weil ... root.

Beachten Sie auch, dass "ein Skript" genauso ausführbar ist wie eine Binärdatei. Ein Skript muss nicht beschreibbar sein, "weil es eine Textdatei ist". Wenn überhaupt, sollte es wahrscheinlich nur dieselbe Berechtigung haben wie die anderen ausführbaren Dateien im selben Verzeichnis.

Ändern Sie jetzt nicht die Berechtigungen für alles! Dies kann allerlei Chaos anrichten und Paketmanager verwirren, die möglicherweise überprüfen, ob die Berechtigungen ordnungsgemäß festgelegt wurden. Dies kann das System auch anfällig machen, wenn Sie die Berechtigungen für eine sicherheitskritische Anwendung versehentlich auf die falsche Weise ändern.

Gehen Sie einfach davon aus, dass die Berechtigungen für die ausführbaren Dateien korrekt eingestellt sind, es sei denn, Sie finden etwas wirklich Seltsames. In diesem Fall sollten Sie sich wahrscheinlich an den entsprechenden Paketbetreuer wenden, um zu überprüfen, anstatt Änderungen vorzunehmen.


In den Kommentaren und im Chat wurde nach etwas Geschichte gerufen.

Die Geschichte der Berechtigungen für Binärdateien unter Linux ist nichts, wovon ich etwas weiß. Es kann spekuliert werden, dass sie einfach die Berechtigungen aus dem Verzeichnis oder nur aus dem Standard umaskvon Linux geerbt haben , aber ich weiß es wirklich nicht.

Was ich weiß ist, dass OpenBSD die Binärdateien im Basissystem 1 standardmäßig mit dem Berechtigungsmodus 555 installiert ( -r-xr-xr-x). Dies wird in einem Makefile-Fragment angegeben, in /usr/share/mk/bsd.own.mkdem BINMODE555 festgelegt ist (sofern es nicht bereits festgelegt ist). Dies wird später bei der Installation der ausführbaren Dateien make buildin verwendet /usr/src.

Ich habe mir das mit Anmerkungen versehene CVS-Protokoll für diese Datei angesehen und festgestellt, dass diese Zeile in der Datei unverändert ist, seit sie 1995 aus NetBSD importiert wurde.

Unter NetBSD wurde die Datei 1993 zum ersten Mal in CVS gestellt und BINMODEauf 555 gesetzt.

Das FreeBSD-Projekt verwendet anscheinend seit mindestens 1994 genau dieselbe Datei wie NetBSD und fügt bei einem späteren Commit einen Hinweis in die Commit-Meldung ein, dass die alten Dateien aus der 4.4BSD-Version der Berkeley Software Distribution stammen.

Darüber hinaus hat die CSRG in Berkeley die Quellen in SCCS gespeichert, ihr Repository ist jedoch in Git-Form auf GitHub 2 verfügbar . Die Akte, die wir hier forencisch behandeln, scheint von Keith Bostic (oder jemandem in seiner Nähe) im Jahr 1990 begangen worden zu sein .

Das ist also diese Geschichte. Wenn Sie das Warum wollen , dann müssen wir wahrscheinlich Keith fragen. Ich hatte gehofft, eine Commit-Nachricht zu einer Änderung zu erhalten, in der stand: " Das muss 555 sein, weil ... ", aber nein.

1 BSD-Systeme sind strenger in "Basissystem" - und "3rd-Party-Pakete" (Ports / Pakete) unterteilt als Linux. Das Basissystem ist eine zusammenhängende Einheit, die einen vollständigen Satz von Funktionen zum Ausführen des Betriebssystems bereitstellt, während die Ports oder Pakete als "lokale Software" angesehen und unter installiert werden /usr/local.

2 Ein umfassenderes GitHub-Repository für Unix-Versionen ab den 70er Jahren ist ebenfalls verfügbar .

Kusalananda
quelle
1
Vielen Dank für Ihre Antwort. Schreibrechte sind normal, da sie als Root-Benutzer keine Rolle spielen (er kann alles). Aber, da es eigentlich egal ist, warum geben wir keine Schreibberechtigung, wenn es von Anfang an dasselbe ist? Ist es eine willkürliche Entscheidung?
t1m0th33
1
@ t1m0th33 Ich glaube, es kann eine willkürliche Entscheidung sein, die jemand getroffen hat, ja. Wie gesagt, auf meinem OpenBSD-System sind die Dateien an diesen Orten nicht beschreibbar root.
Kusalananda
1
Ich denke nicht, dass es eine bewusste Entscheidung von irgendjemandem ist. Der Paketmanager installiert standardmäßig die Datei mit den Berechtigungsbits, die er während des Erstellungsprozesses erhalten hat. Beim Erstellen des Linkers wurden die Dateien mit den Berechtigungen 755 erstellt, da dies der Fall ist, wenn Sie die umask von 777 subtrahieren und der umask-Stamm (auf den Build-Maschinen des Betriebssystemherstellers) beim Erstellen 022 lautete, da 022 die Standard-umask für alle Benutzer ist es wäre sinnlos, wenn root zusätzliche Arbeit leisten würde.
Henning Makholm
8
+1 für "Ändern Sie jetzt nicht die Berechtigungen für alles!" Ich sehe so viele Fragen wie diese auf Ask Ubuntu, wo der Benutzer sie chmod -R gestellt hat, /usroder /var, und Überraschung - sie sudofunktionieren nicht oder etwas anderes funktioniert nicht.
Sergiy Kolodyazhnyy
4
In der Vergangenheit hatte das Fehlen der Schreibberechtigung für root keine Auswirkung (root kann und muss nichts ändern, da root beim Öffnen oder Schreiben sowieso nie ein EPERM erhält). Ich frage mich, ob dieses 555-Zeug angefangen hat, weil es tatsächlich möglich geworden war, Roots einzuschränken (wann tauchten Sicherheitsstufen zum ersten Mal auf? Ungefähr zur selben Zeit wie 4.4BSD oder frühes 386BSD / NetBSD?)