Wann scheitert chmod?


8

Unter welchen Umständen wird chmodscheitern?

Ich habe mir die Manpage angesehen, aber sie gibt nur die Verwendung an und geht nicht auf Details darüber ein, unter welchen Umständen sie nicht funktioniert.

Ich würde annehmen, dass chmodes funktionieren wird, wenn:

  • Du bist Wurzel
  • Sie besitzen die Zieldatei (und setzen ein Bit für den profanen Modus, dh kein klebriges Bit, andere)

Können Benutzer die chmodBerechtigungen für eine Datei ändern, für die sie Gruppenzugriff haben? Bezieht es sich auf den Lese- / Schreibzugriff?


2
Es schlägt fehl, wenn der Inode nicht geändert werden kann, z. B. wenn das Dateisystem schreibgeschützt ist.
Jordanm

Antworten:


3

Nur der Eigentümer der Datei oder der Root-Benutzer dürfen die Berechtigungen einer Datei ändern. Die aktuellen Berechtigungen für die Datei oder das übergeordnete Verzeichnis sind irrelevant¹. Dies ist in POSIX angegeben :

Die Anwendung muss sicherstellen, dass die effektive Benutzer-ID des Prozesses mit dem Eigentümer der Datei übereinstimmt oder der Prozess über die entsprechenden Berechtigungen verfügt, um dies zu tun.

Auf den meisten Unices bedeutet "entsprechende Berechtigungen", dass sie als Root ausgeführt werden. Wenn diese Bedingungen nicht erfüllt sind, chmodschlägt dies normalerweise fehl EPERM, obwohl andere Verhaltensweisen wie das Abbrechen des Programms aufgrund einer Sicherheitsverletzung zulässig sind.

Darüber hinaus bieten einige Unix-Varianten systemspezifische Möglichkeiten zum Autorisieren oder Verbieten chmod. Beispielsweise verfügt Linux über eine Funktion ( CAP_FOWNER), mit der Prozesse die Berechtigungen und anderen Metadaten einer Datei unabhängig von ihrem Eigentümer ändern können.

Es gibt andere Gründe, die chmodmöglicherweise fehlschlagen, obwohl die Datei vorhanden ist, zugänglich ist und den entsprechenden Eigentümer hat. Zu den gängigen gehören ein schreibgeschütztes Dateisystem oder ein Dateisystem, das keine Berechtigungen wie FAT unterstützt. Weniger häufig sind systemspezifische Einschränkungen wie das unveränderliche Attribut des ext2-Dateisystems und der Nachfolger von Linux.

¹ Außer insofern, als der laufende Prozess chmodauf die Datei zugreifen kann, muss er über Ausführungsberechtigungen für das Verzeichnis verfügen, das die Datei enthält, sowie für jedes andere Verzeichnis, das er durchläuft, um dies zu tun.


2

Die gewünschten Details finden Sie auf der Handbuchseite für den Systemaufruf chmod (). Anstelle von man chmodGebrauch man 2 chmod. man chattrund man 2 setxattrwird dich auch interessieren; Die von chattr / setxattr () festgelegten Dateiattribute verbessern das Verhalten der von chmod festgelegten traditionellen Unix-Berechtigungen.


Ich werde es versuchen, wenn ich arbeitslos bin.
Wug

1

Gemäß dem UNIX-Standard muss "die effektive Benutzer-ID des Prozesses mit dem Eigentümer der Datei übereinstimmen oder der Prozess muss über die entsprechenden Berechtigungen verfügen, um dies zu tun."

Das bisschen über entsprechende Privilegien bedarf einiger Erklärung. Auf herkömmlichen Systemen ist chmod für alle Dateien zulässig, wenn die effektive UID (unter Linux die Dateisystem-UID, siehe unten) des Prozesses 0 [dh root] ist.

Linux verfügt über ein System namens Capabilities , und das CAP_FOWNERBit steuert die Fähigkeit, chmodalle Dateien zu verwenden. Standardmäßig werden alle Funktionen gewährt, wenn ein execve()Aufruf einen Root-Prozess erstellt (entweder durch Ausführen einer Setuid-Binärdatei oder wenn die reale UID 0 ist) oder wenn die effektive UID auf 0 gesetzt wird (und entfernt wird, wenn sie auf einen Wert ungleich Null gesetzt wird). und eine Reihe von Funktionen, einschließlich, CAP_FOWNERwerden aktiviert, wenn die UID des Dateisystems auf 0 gesetzt ist (und deaktiviert, wenn sie auf einen Wert ungleich Null gesetzt ist). Lesen Sie die Manpage für weitere Details.

Sie haben das Sticky-Bit erwähnt, aber die Tatsache weggelassen, dass Benutzer das Setgid-Bit möglicherweise auch nicht für eine Datei setzen, wenn sie nicht zu der Gruppe gehören, die der Datei zugewiesen ist. Das setuid- oder setgid-Bit kann auch unter zusätzlichen implementierungsdefinierten Umständen ignoriert werden.


0

Können Benutzer chmod verwenden, um Berechtigungen für eine Datei zu ändern, für die sie Gruppenzugriff haben?

Warum versuchst du nicht einfach zu sehen?

$ touch foo
$ sudo install -o root -g $(id -gn) -m660 foo bar
$ ls -la bar
-rw-rw----  1 root  staff  0 Oct 21 21:33 bar
$ chmod g-w bar
chmod: bar: Operation not permitted
$ chmod g+x bar
chmod: bar: Operation not permitted

Ich habe darüber gestochert, aber dies ist sicherheitsrelevant und ich möchte nicht versehentlich einen Randfall verpassen.
Wug

Wenn Sie sich über einen Randfall Sorgen machen, können Sie dies tun (zumindest um Risiken zu minimieren) chmodund dann die Berechtigungen dafür überprüfen. Wenn Sie sich paranoid fühlen, machen Sie eine fsyncvor der Überprüfung.
Nanofarad
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.