Wie kann 'rm -rf /' alle Dateien im System löschen?

80

Ich habe diesen Befehl unter Ubuntu (aus offensichtlichen Gründen) nicht ausprobiert, daher bin ich mir nicht sicher, ob Ubuntu die Ausführung erlauben wird. Aber es ist berühmt dafür, alles zu löschen. Nur aus Neugier, was passiert, wenn der Kernel und /bin gelöscht werden? Wie behält rm einen Laufzeit-Stack bei? Wie kann rm mit dem Dateisystem kommunizieren und das Löschen abschließen? Wie kommuniziert es mit Hardware?

    
Muye 02.04.2015, 10:13

6 Antworten

76

Es spielt keine Rolle, dass /bin/rm gelöscht wird. Es wird nur einmal ausgeführt und zu diesem Zeitpunkt ist alles im Speicher geladen, genauso wie alles, was sonst noch benötigt wird, um Löschungen an das Dateisystem und die Festplatte zu senden.

Sidebar / Update: Pro David Hoelzers Antwort (und in den Kommentaren erwähnt), der Inode, auf den der Hardlink /bin/rm zeigt, würde bis zu rm stehen bleiben (weil Linux in einem offenen Zustand ist) aber das ist irrelevant; Der Zustand der Festplatte spielt keine Rolle.

Die Binärdatei wird vor der Ausführung in den Speicher geladen. Selbst wenn Sie die rm -Disc-Daten manuell löschen könnten, würde dies die Beendigung des Löschvorgangs nicht beeinträchtigen oder stoppen (vorausgesetzt, Sie machen die Diskette nicht anderweitig verfügbar).

Keine Ahnung, was ein Inode oder Hardlink ist? Dies ist die Antwort, wo ich es ausgearbeitet habe.

Wie auch immer, das ist auch der Grund, warum Sie das Paket für den aktuellen Kernel löschen können, ohne dass der Computer implodiert. Solange Sie eine andere Version installieren, können Sie hochfahren.

Auch das funktioniert, weil rm nur einmal aufgerufen wird. Das folgende würde fehlschlagen, nachdem /bin/rm gestorben ist, weil es für jeden Dateinamen einmal aufgerufen wird:

find / -exec rm {} \;

Das heißt, dass auch find / -exec rm -rf {} + und find / -print0 | xargs -0 rm -rf wahrscheinlich beide fehlschlagen, weil sie beide Argumentgrenzen haben, was bedeutet, dass sie nur einige Dateien löschen, bevor sie erneut aufgerufen werden. An einem bestimmten Punkt der Reise konnte /bin/rm ablaufen ( und wird freigegeben), bevor der Rest der Dateien gelöscht wurde. Es ist jedoch nicht garantiert. Wenn /bin/ das letzte eingegebene Verzeichnis wäre, könnten diese Methoden funktionieren.

    
Oli 02.04.2015, 10:26
54
  

Ich habe diesen Befehl unter Ubuntu (aus offensichtlichen Gründen) nicht ausprobiert, daher bin ich mir nicht sicher, ob Ubuntu die Ausführung erlauben wird.

Ich habe es getan. rm -rf / --no-preserve-root wurde in einer Root-Sitzung ausgeführt, die direkt auf der Maschine geöffnet wurde, während ich auch über ssh von einer anderen Maschine aus verbunden war, auch mit dem root-Konto.

Was passiert, ist, dass Sie viele Nachrichten wie:

bekommen
  

rm: kann '/ ...' nicht entfernen: Operation nicht erlaubt

oder:

  

rm: kann '/ ...' nicht entfernen: Gerät oder Ressource beschäftigt

Überraschenderweise blieb ssh connection bis zum Ende der Operation geöffnet. Erst als ich die Verbindung schloss und versuchte, sie wieder zu öffnen, erschien ein Fehler:

  

Lesen von Socket fehlgeschlagen: Verbindung durch Peer zurückgesetzt

Auf dem Computer bleiben vier Verzeichnisse:

  • /dev . Hier werden Gerätedateien gespeichert.
  • /proc -Im-Speicher-Dateisystem, das vom Kernel erstellt wurde.
  • /run , ein standardisierter Speicherort für Daemons.
  • /sys . Dadurch erhalten Sie Informationen über das System und seine Komponenten.

Das bedeutet, dass nicht viel übrig ist und nicht viel zu tun ist. Sie können nicht ls (obwohl bei Verwendung von Tab die Namen von Verzeichnissen und Dateien weiterhin angezeigt werden). Sie können cd in verschiedenen Verzeichnissen und auch echo stuff verwenden, aber Befehle wie cat sind nicht mehr verfügbar.

Es gibt auch kein sudo .

shutdown -h now und reboot sind ebenfalls verschwunden, also scheint Ihre einzige Option den Rechner manuell auszuschalten. Logout ( exit ) funktioniert nicht, auch wenn es einen schönen "Logout" -Text anzeigt.

Sobald Sie versuchen, den Rechner neu zu starten, erhalten Sie einen netten GRUB-Fehler 15, und dann passiert nichts. An diesem Punkt könnten Sie denken, dass Ihr rm möglicherweise etwas Schlimmes an Ihrem System verursacht hat / p>

Sie können es auch tun

Nein, warte, mach es nicht auf deiner Maschine!

Stattdessen können Sie eine virtuelle Maschine ausführen. VMs haben den Vorteil, das Experimentieren wirklich einfach zu machen. Da Sie Ubuntu verwenden, könnten Sie an vmbuilder interessiert sein. Dies ist ein Tool, mit dem Sie virtuelle Maschinen innerhalb von Minuten bereitstellen können (die offizielle Dokumentation behauptet, dass dies "in einer Minute" erledigt werden kann, aber die tatsächliche Zeit, selbst auf schneller Hardware, beträgt mehr als zwei bis drei Minuten .

Sobald die Bereitstellung beendet ist, haben Sie eine Umgebung, mit der Sie spielen können. Wenn Sie es zerstören, spielt es keine Rolle: Sie stellen den Computer erneut bereit und zwei Minuten später können Sie fortfahren.

Wenn Sie Software wie VMWare verwenden, könnten Sie auch an Snapshots interessiert sein (beachten Sie, dass der kostenlose VMWare Player diese Funktion nicht besitzt; Sie müssen VMware Workstation erwerben). Beachten Sie, dass Hyper-V kostenlos ist und Snapshots unterstützt (Sie müssen jedoch Windows ausführen).

Der Vorteil von Snapshots liegt darin, dass Sie einen Snapshot innerhalb von Millisekunden aufnehmen können. Ein Rollback auf einen Snapshot dauert länger, ist jedoch oft eine Angelegenheit von Sekunden. Dies macht das Experimentieren noch einfacher und schneller.

Dieses Experimentieren ist nicht auf das Betriebssystem selbst beschränkt. Sie können alle möglichen Dinge mit Software tun. Haben Sie eine verdächtige Anwendung? Teste es in einer VM - wenn es ein Virus ist, wird es keinen Schaden anrichten. Möchten Sie eine Operation in einer Datenbank testen, da sich dies auf die Umgebung auswirken könnte? Testen Sie es in einer VM.

Was ist, wenn Sie das auf einer realen Maschine ohne Test gemacht haben?

Schlechte Dinge passieren. Beachten Sie, dass rm Sie vor sich selbst schützt: rm -rf / funktioniert nicht: Sie müssen --no-preserve-root verwenden. Was aber, wenn Sie tatsächlich versehentlich alles entfernen?

rm löscht nur Dateien , aber die Daten sind immer noch auf Ihrer Festplatte vorhanden. Dies macht es möglich, sie später wiederherzustellen (deshalb sollten Sie Ihre Festplatten nicht einfach mit sensiblen Daten wegwerfen, wenn sie nicht mehr funktionieren).

Dies bedeutet, dass Sie nur einen Ersatz-PC mit einem Festplattengehäuse haben müssen, um tatsächlich alle Dateien wiederherzustellen. Wichtig ist, dass Sie nichts auf die Festplatte schreiben, um wiederhergestellt zu werden: Die Daten, die Sie schreiben, überschreiben die nicht verknüpften Dateien.

Wie im Artikel in 200_success's Kommentar erwähnt , wenn Sie klug handeln , Sie können die Maschine auch ohne einen Ersatz-PC zurückbekommen.Wenn Sie nur an Daten interessiert sind, würde ich nicht stören - die Wiederherstellung mit einem Ersatz-PC ist viel einfacher.

    
Arseni Mourzenko 02.04.2015 20:06
25

Der Grund dafür ist, dass der Dateibenennungs-Layer (was Sie mit ls sehen) wirklich nur Ihrer Bequemlichkeit dient. Der Dateisystemtreiber und der Kernel kümmern sich nur darum, was der Inode ist. Wenn eine Datei namentlich referenziert wird, wird sie sofort in den Inode übersetzt, der alle Metadaten einschließlich der Berechtigungen, der Datenblöcke auf dem Datenträger, der Besitzer-ID, der Gruppen-ID und der Link-Anzahl enthält.

Hier zählt die Anzahl der Links. Wenn Sie eine Datei auf einem UNIX-System löschen, ist der tatsächliche Systemaufruf unlink . Was unter der Haube passiert, ist, dass die Linkzahl (die Anzahl von Dateinamen in der Dateibenennungsschicht), die auf diesen Inode zeigt, dekrementiert wird. Das Dateisystem weiß, dass eine Datei gelöscht wird, wenn die Linkanzahl Null erreicht.

Wenn eine Datei von rm gelöscht wird, wird auch die Verzeichnisdatei bearbeitet (ja, es ist nur eine Datei, die den Dateinamen und den Inode zusätzlich zu einigen anderen Bits enthält, die für diese Antwort nicht wichtig sind). Es ist jedoch die Aufhebung der Verknüpfung, die tatsächlich die Datenträgerressourcen freigibt.

Dies führt zu einigen anderen interessanten Effekten. Erstens ist es möglich, eine Datei geöffnet zu haben, deren Link-Anzahl Null ist. Dies geschieht, wenn rm -rf / den Eintrag für /bin/rm löscht. Die Datei ist geöffnet (es gibt eine Dateikennung), aber der Inode wird als gelöscht markiert (Linkanzahl = 0). Die Datenträgerressourcen werden nicht freigegeben und solange wiederverwendet, bis die Dateikennung geschlossen wird.

Ein weiterer interessanter Effekt ist, was passiert, wenn Sie einen Inode mit einer Linkanzahl größer als Null haben, aber nichts in der Dateibenennungs-Ebene, die auf ihn zeigt. Dies ist in gewisser Weise eine sehr gut versteckte Datei :). Um darauf zugreifen zu können, müßte man etwas Low-Level verwenden, um es mit der Inode-Nummer statt mit dem Namen zu referenzieren (weil es keinen gibt) oder einen Verzeichniseintrag mit einem Hex-Editor auf den Inode zu editieren.

Ein dritter interessanter Effekt ist, was passiert, wenn Sie die Anzahl der Verbindungen auf Null reduzieren, aber trotzdem auf einen Verzeichniseintrag im Inode zeigen. Ich überlasse das Ihnen zu experimentieren, wenn Sie möchten. Die beiden letzten führen jedoch dazu, dass das Dateisystem inkonsistent ist.

    
David Hoelzer 02.04.2015 15:08
18

Vorherige Antworten sind gut, aber ich möchte ein Detail klären:

rm ist nicht nur ein Befehl. Es ist ein Programm, das in PATH gefunden wird.

Daher passiert folgendes bei der Ausführung:

  • Sie nennen (als root) rm -rf /
  • Instanz des Programms rm wird im Speicher mit den Argumenten -rf und / geladen
  • basierend auf diesen Argumenten startet das Programm rm seine Operationen (durchläuft alles in eingehängter / Partition und entfernt rekursiv Referenzen darauf [Entschuldigung für die Technik;)])
  • sobald es fertig ist, wird die Instanz von rm program entladen
  • Zu diesem Zeitpunkt sind die einzigen Dinge im Speicher die Programme, die zuvor dort geladen wurden (z. B. Bash, wenn das Terminal in Ubuntu geöffnet ist, Desktop-Umgebung, Kernel, Treiber usw.)
  • Wenn Sie versuchen, einen anderen Befehl aufzurufen (was im Fall von Linux zu einem eigenständigen Programm führt), wird es fehlschlagen, weil in PATH-Speicherorten kein solches Programm gefunden wird (und PATH-Speicherorte nicht mehr existieren). Allerdings wird alles, was einmal geladen wurde, immer noch laufen

Um zu verstehen, wie es funktioniert, versuchen Sie LAMP auf Ubuntu (in Virtualbox), ein Skript und einen PHP-Opcode-Cache zu installieren und rufen Sie dann diesen bösen Befehl auf. Überraschenderweise (wenn Sie Glück haben und Ihr Opcode-Cache die Löschung von php-Dateien nicht bemerkt) können Sie immer noch von außen über den Apache-Webserver auf PHP-Skripte zugreifen!

PS: Dieser bösartige Befehl lief sogar als root löschte everything , er kann einige Kernel-privilegierte Prozesse nicht von /proc löschen und kann einige der Sachen von /dev devices nicht löschen, die auf Ihrem System als Dateien erscheinen. In der Tat ist Wurzel nicht so allmächtig wie wir denken, Kernel ist auf der anderen Seite.

PPS: Auch als zweiten Gedanken haben Sie immer noch Dateien, die zum Zeitpunkt des Löschversuchs locked von einem anderen Prozess waren.

    
Alexey Kamenskiy 02.04.2015 13:45
1

Sobald alles von den Festplatten gelöscht wurde, funktioniert der Kernel noch, aber es bleibt hängen, da keine Geräte und Programme, Befehle usw. übrig sind.

Das Betriebssystem wird nicht mehr funktionieren.

Und es stimmt, was Oli sagt, der Befehl wird in den Speicher geladen und ausgeführt, und nichts wird ihn stoppen, wenn Sie diesen Prozess nicht beenden (natürlich, wenn der Befehl kill noch vorhanden ist ^^).

    
s1mmel 02.04.2015 11:35
0

Bitte beachten Sie, dass wenn das System selinux und selinux im Erzwingungsmodus ist und die Richtlinien von selinux korrekt eingerichtet sind; dann wird nicht viel passieren.

Selinux ist eine obligatorische Zugriffskontrolle, was unter anderem bedeutet, dass der root-Benutzer wirklich nicht mehr Macht hat, das System zu zerstören als jeder andere Benutzer auf dem System.

Selinux wird im Kernel erzwungen; Sie müssten den Kernel kompromittieren, um es zu umgehen.

Auf einem gut entworfenen System mit guten Selinux-Richtlinien wäre root nicht in der Lage, viel auf dem System zu tun.

Die späteren Versionen von Android lassen Selinux nur aus diesem Grund durchsetzen.

    
Mark Allyn 03.04.2015 04:38

Tags und Links