Wie stiehlt vim root-Dateien?

39

Beobachten Sie Folgendes:

sh-3.2$ mkdir testcase
sh-3.2$ cd testcase
sh-3.2$ sudo touch temp
sh-3.2$ ls -al
total 0
drwxr-xr-x   3 glen  staff  102 19 Dec 12:38 .
drwxr-xr-x  12 glen  staff  408 19 Dec 12:38 ..
-rw-r--r--   1 root  staff    0 19 Dec 12:38 temp

sh-3.2$ echo nope > temp
sh: temp: Permission denied

sh-3.2$ vim temp
# inside vim
itheivery
# press [ESC]
:wq!
# vim exits

sh-3.2$ ls -al
total 8
drwxr-xr-x   3 glen  staff  102 19 Dec 12:38 .
drwxr-xr-x  12 glen  staff  408 19 Dec 12:38 ..
-rw-r--r--   1 glen  staff    7 19 Dec 12:38 temp

Irgendwie hat vim diese root-Datei in eine benutzereigene Datei umgewandelt!

Dies scheint nur zu funktionieren, wenn der Benutzer das Verzeichnis besitzt - aber es scheint immer noch so, als ob es nicht möglich sein sollte. Kann mir jemand erklären, wie das gemacht wird?

Glenjamin
quelle

Antworten:

51

Sie glensind der Eigentümer des Verzeichnisses (siehe .Datei in Ihrer Auflistung). Ein Verzeichnis ist nur eine Liste von Dateien, und Sie haben die Berechtigung, diese Liste zu ändern (z. B. Dateien hinzufügen, Dateien entfernen, Eigentümer ändern, um sie wieder zu Ihren eigenen zu machen usw.). Möglicherweise können Sie den Inhalt der Datei nicht direkt ändern , aber Sie können die Datei als Ganzes lesen und die Verknüpfung aufheben (entfernen) und anschließend neue Dateien hinzufügen. 1 Wenn Sie nur das Vorher und Nachher sehen, sieht es möglicherweise so aus, als ob die Datei geändert wurde.

Vim verwendet Auslagerungsdateien und verschiebt Dateien unter Wasser. Dies erklärt, warum scheinbar in dieselbe Datei geschrieben wird wie in Ihrer Shell, dies ist jedoch nicht dasselbe. 2

Also, was Vim macht, ist folgendes:

cat temp > .temp.swp          # copy file by contents into a new glen-owned file
echo nope >> .temp.swp        # or other command to alter the new file
rm temp && mv .temp.swp temp  # move temporary swap file back

1 Dies ist ein wichtiger Unterschied im Umgang mit Dateiberechtigungen zwischen Windows und Unices. In Windows kann man normalerweise keine Dateien entfernen, für die Sie keine Schreibberechtigung haben.

2 Update: Wie in den Kommentaren vermerkt, macht Vim das nicht so, um den Eigentümer zu ändern, da sich die Inode-Nummer in der tempDatei nicht ändert ( ls -livorher und nachher). Mit können stracewir genau sehen, was vimtut. Der interessante Teil ist hier:

open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = -1 EACCES (Permission denied)
unlink("temp")                               = 0
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 4
write(4, "more text bla\n", 14)              = 14
close(4)                                     = 0
chmod("temp", 0664)                          = 0

Dies zeigt, dass die Verknüpfung nur aufgehoben wird , der Dateideskriptor jedoch nicht geschlossen wirdtemp . Es überschreibt vielmehr nur den gesamten Inhalt ( more text bla\nin meinem Fall). Ich denke, das erklärt, warum sich die Inode-Nummer nicht ändert.

gertvdijk
quelle
3
FWIW Sie können überprüfen, ob dies geschieht, indem Sie ls -ildavor und danach ausführen. Wenn sich tempdie Inode-Nummer geändert hat, wissen Sie, dass es sich um eine andere Datei mit demselben Namen handelt.
Nutzlos
3
Man könnte hinzufügen, dass rm die Datei nicht wirklich entfernt, sondern nur einen Link zu der Datei entfernt und die Datei nicht gelöscht wird, bevor die Anzahl der Links auf 0 gesunken ist. Rm entfernt nur den Eintrag zu der Datei im Verzeichnis. Wenn root einen anderen Link (Hardlink) zu der Datei in einem anderen Verzeichnis hat, kann der Benutzer die Datei nicht entfernen.
Gerrit
1
@Useless Ich habe es versucht, und die Nummer hat sich nicht geändert, obwohl sich der Besitzer und der Zeitstempel geändert haben!
Amyassin
1
@amyassin Du hast recht! Ich habe meine Antwort mit einem Strace-Auszug aktualisiert, der sie erklärt.
gertvdijk
1
Neben Ihrem Hinweis zu Windows- und Unix-Berechtigungen können Sie, wenn Sie ein Windows-ähnliches Verhalten in Unix wünschen, ein Stammverzeichnis erstellen (oder ein anderer Benutzer, der über universelle Berechtigungen zum Entfernen / Umbenennen / usw. verfügen sollte) und das Sticky festlegen Bit auf dem Verzeichnis. Dann können Benutzer nur ihre eigenen Dateien löschen.
Matthew Crumley
16

Vor:

-rw-r--r-- 1 root staff 0 19 Dec 12:38 temp

nach:

-rw-r--r-- 1 glen staff 7 19 Dec 12:38 temp

Das Ziel durchbricht nicht die Berechtigungsgrenze. Schauen Sie sich die Dateiinformationen genau an, und stellen Sie fest, dass vim die ursprüngliche Datei tatsächlich gelöscht hat (da Sie die Berechtigung haben, die Datei zu entfernen, obwohl Sie ihren Inhalt nicht ändern können). Erstellen Sie dann eine eigene neue Datei ( siehe der Besitzer ist nicht mehr "root").

Und während Sie die Originaldatei in vim bearbeiten, wird gewarnt, dass Sie eine schreibgeschützte Datei ändern. Wenn Sie also den Befehl eingeben :wq!(die Operation erzwingen), können Sie nur die vorhandene Datei löschen und eine neue Datei mit dem gleichen Namen erstellen.

Ich hoffe, das hilft.

ymfoi
quelle
1

Verwenden Sie die -iOption ls, um die Inode-Nummer anzuzeigen, bei der es sich um eine eindeutige Kennung (innerhalb des Dateisystems) einer Datei oder eines anderen Objekts handelt.

Sie werden sehen, dass die Datei durch ein anderes Objekt ersetzt wurde: Die Inode-Nummer wird sich wahrscheinlich ändern.

Die Anzeige derselben Inode-Nummer ist kein Beweis für irgendetwas: Eine Inode-Nummer kann recycelt werden. Wenn wir den letzten Link zu einer Datei entfernen und dann eine neue Datei erstellen, erhalten wir möglicherweise eine mit derselben Inode-Nummer. Dies kann jedoch nicht passieren, wenn die alte Datei entfernt wird, nachdem die neue erstellt wurde. Eg mv file file.tmp; touch file; rm file.tmp. Ich vermute, dass vim tatsächlich etwas Ähnliches tut echo new_content > tmpfile; mv tmpfile file. Die mvOperation wird in einen renameSystemaufruf übersetzt , sodass die Zuweisung von Inode-Nummern davon abhängt, wie das Dateisystem eine Umbenennung durchführt, die die Verknüpfung eines Ziels aufhebt.

Kaz
quelle