Warum ist eine Datei mit 400 Berechtigungen für root beschreibbar, für Benutzer jedoch schreibgeschützt?

10

Wenn ich eine Datei als nicht privilegierter Benutzer erstelle und den Berechtigungsmodus auf ändere 400, wird sie von diesem Benutzer korrekt als schreibgeschützt angesehen:

$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro

Alles ist gut.

Aber dann kommt die Wurzel:

# [ -w somefile ] && echo rw || echo ro
rw

Was zum Teufel? Sicher, root kann in schreibgeschützte Dateien schreiben, aber es sollte nicht zur Gewohnheit werden: Best Practice würde tendenziell vorschreiben, dass ich in der Lage sein sollte, das Schreibberechtigungsbit zu testen, und wenn dies nicht der Fall ist, wurde es gesetzt auf diese Weise aus einem Grund.

Ich möchte wohl verstehen, warum dies geschieht und wie ich beim Testen einer Datei, für die das Schreibbit nicht gesetzt ist, einen falschen Rückkehrcode erhalten kann.

Reich
quelle
Übrigens verwende ich sowohl RHEL6 ( 4.1.2(1)-release) als auch RHEL7 ( 4.2.46(2)-release).
Rich
16
"Best Practice würde in der Regel vorschreiben, dass ich in der Lage sein sollte, das Schreibberechtigungsbit zu testen. Wenn dies nicht der Fall ist, wurde es aus einem bestimmten Grund so eingestellt." - Tatsächlich ist die beste Vorgehensweise "Führen Sie keine Inhalte als Root aus". Wenn Sie als Root ausgeführt werden, haben Sie bereits beschlossen, Berechtigungsprüfungen zu umgehen. Die manuelle Neuimplementierung dieser Berechtigungsprüfungen im Benutzerbereich ist ein Rezept für eine Katastrophe .
Kevin
@ Kevin Gut für dich, wenn du Sachen ohne Privileg ausführen kannst. Dies dient zur Manipulation /etc/dhcp/dhcpd.conf, die root gehört. Ich verwende den vom Hersteller gelieferten dhcpd. Totale Katastrophe, oder? Die Datei wird in RCS aktiviert ist, ich bin die Automatisierung Verwendung rcsdiff, ciund coweil wir Betreiber , dass Notwendigkeit, ... arbeiten. Die Berechtigungsbitprüfung ( -wwie von detailliert beschrieben test(1)) war eine erste Fehlerzeile, die auf der Grundlage arbeitete, dass ci -ueine Datei schreibgeschützt bleibt. Ich lasse das fallen und gehe direkt zu rcsdiff -qund überprüfe $?. Undisastrous dhcpd? Es würde im Besitz von sein dhcpd.
Rich
1
Dies ist eine potenzielle Katastrophe, da Sie jetzt zwei verschiedene Implementierungen von Berechtigungsprüfungen haben: eine im Kernel und eine im Userspace. Schlimmer noch, diese Implementierungen sollen nicht einmal identische Ergebnisse liefern, sodass Sie sie nicht einfach fuzz gegeneinander testen können. Jetzt haben Sie zwei Zugriffspfade, die unabhängig voneinander gesperrt und gesichert werden müssen.
Kevin
@ Kevin Sicher, sie liefern keine identischen Ergebnisse und waren nicht dazu gedacht (trotz des Mangels an Details auf den Manpages), aber ich möchte ausdrücklich das Schreibberechtigungsbit überprüfen . und die Manpages für bashund veranlassten testmich zu glauben, dass das [ -wist , wofür ist.
Rich

Antworten:

26

test -waka [ -wüberprüft den Dateimodus nicht. Es prüft, ob es beschreibbar ist. Für root ist es.

$ help test | grep '\-w'
  -w FILE        True if the file is writable by you.

Die Art und Weise, wie ich testen würde, wäre ein bitweiser Vergleich mit der Ausgabe von stat(1)(" %a Zugriffsrechte in Oktal").

(( 0$(stat -c %a somefile) & 0200 )) && echo rw || echo ro

Beachten Sie, dass die Unterschale $(...)ein 0Präfix benötigt, damit die Ausgabe von statals oktal von interpretiert wird (( ... )).

Patrick
quelle
Vielen Dank für Ihre Prägnanz. Gute Verwendung von (( ... & ... )). Ein Tippfehler korrigiert :-)
Rich
Machen Sie das 3 ... Keine iferforderlich, Ausgabe von Oktalberechtigungen ist %anicht %dund (( ... ))benötigt ein Präfix 0, um die Ausgabe von statals Oktal zu interpretieren .
Rich
@Patrick my man statsagt "% d Gerätenummer in Dezimalzahl", aber was wir wollen, sind die "Zugriffsrechte", nein? Ihr Punkt über die Notwendigkeit des 0-Präfix ist gut gemacht, aber ich denke, wir müssen es nur dort ausweichen :).
Sourcejedi
2
stat -c 0%a...
sourcejedi
@sourcejedi ack, du hast recht. Aus irgendeinem Grund dachte ich,% d sei Zugriffsrechte in Dezimalzahl. Die Bearbeitung wurde wiederhergestellt. danke :-)
Patrick
30

Ich denke, Sie haben falsch verstanden, was -wtut. Es wird nicht überprüft, ob die Datei über "Schreibberechtigungen" verfügt. Es wird überprüft, ob die Datei vom aufrufenden Benutzer beschreibbar ist.

Genauer gesagt, es ruft access(2)oder ähnliches.

Wenn z. B. ein Skript vorhanden ist , wird möglicherweise eine ähnliche Zeile angezeigt, if [ -w /etc/shadow ]wenn Sie stracedas Skript ausführen

faccessat(AT_FDCWD, "/etc/shadow", W_OK)

Da rootkann in die Datei schreiben, gibt es 0 zurück.

zB als normaler Benutzer:

faccessat(AT_FDCWD, "/etc/shadow", W_OK) = -1 EACCES (Permission denied)

Als Wurzel

faccessat(AT_FDCWD, "/etc/shadow", W_OK) = 0

Dies trotz der Tatsache, dass /etc/shadowdie Erlaubnis 000auf meinem Computer hat.

---------- 1 root root 4599 Jan 29 20:08 /etc/shadow

Was Sie jetzt tun möchten, wird interessant und ist nicht so einfach.

Wenn Sie die einfachen Berechtigungen überprüfen möchten, überprüfen Sie die lsAusgabe oder rufen Sie statoder ähnliches auf. Beachten Sie jedoch, dass ACLs diese Berechtigungen überschreiben können. Nur weil eine Datei die Berechtigung 400 hat, kann sie nicht mehr beschreibbar sein ...

Stephen Harris
quelle
Nein, "Missverständnis" würde bedeuten, dass die Manpages falsch gelesen werden für -w: test(1)ist explizit: "DATEI existiert und Schreibberechtigung wird erteilt", nicht " Datei kann vom aktuellen Benutzer geschrieben werden ". Nichts über das Überschreiben von Berechtigungen oder ACLs. bash(1)is cagey: "True, wenn eine Datei vorhanden und beschreibbar ist ." ksh(1)macht einen subtilen Hinweis auf Shenanigans: "-w Datei // True, wenn Datei existiert und durch den aktuellen Prozess beschreibbar ist ." zsh(1)verschiebt test(1), zshmisc(1)formuliert als ksh(1)und zshexpn(1)beschreibt einige interessante auf Berechtigungen basierende Globbing. csh(1)ist unglaublich kurz: "Schreibzugriff".
Übrigens: Ich habe Patricks Antwort akzeptiert, 1. weil Sie die Leitfrage nicht angemessen beantwortet haben: Wie kann ich beim Testen einer Datei, für die das Schreibbit nicht gesetzt ist, einen falschen Rückkehrcode erhalten? und 2. wegen der snarky Einführung, dass ich die Manpages missverstanden habe.
Rich
3
@Rich So wie ich das lese, denke ich, dass deine Kommentare auch ein bisschen snarky rüberkommen. Ich sage nicht, dass alles, was Sie geschrieben haben, falsch war, nur dass es wahrscheinlich besser rübergehen würde, wenn es höflicher ausgedrückt würde.
David Z
3
"Ich denke du hast es falsch verstanden ..." ist nicht snarky. Ihre Antwort jedoch 100% snarky.
Barbecue
@Rich Auch wenn die Manpages möglicherweise nicht kristallklar waren, hat Stephen angegeben, dass Sie möglicherweise "falsch verstanden haben, was -w tut " und nicht, was Manpages sagen, wo erstere der Fall zu sein scheinen, daher die Frage
Sebi
1

Der Root-Benutzer kann tun, was er möchte. "Normale" Dateiberechtigungen sind keine Einschränkung. Es wird keine einfache Datei ohne eXecute-Berechtigungen direkt ausgeführt, nur um ein wenig gegen die Praxis der Fußziele zu versichern.

vonbrand
quelle