ein Kapitel zurück                                           ein Kapitel weiter

Dieses Kapitel behandelt das absolute Löschen einer Datei von der Festplatte. Die Beispiele und Kommandos wurden auf Linux getestet und demonstriert. Die Programme dürften aber überall laufen. Auch wenn diese Kapitel, wegen der Shellkommandos und anderer Differenzen, nicht auf, M$-Systemen Übertragbar ist lohnt es sich dennoch es zu lesen.

Einfaches Szenario : Sie haben übel nachredendes Material über Ihrem Chef verbreitet und das ganze als Textdatei auf Ihrem Computer gespeichert. Nun hat Ihr Chef davon Wind bekommen und läßt Ihren Computer Beschlagnahmen.

Clever wie sie sind haben sie diese Datei nochmals schnell gelöscht. Wenn Sie sich nun in Sicherheit denken, haben sie sich getäuscht. Sollange der nlink-Zähler nicht auf 0 gefallen ist, ist diese Datei noch Lange nicht von der Platte verschwunden. Man kann sie nur nicht mehr unter Ihrem Namen ansprechen, da der Verweis darauf verschwunden ist.

Im Prinzip heißt ja gelöscht nur, dass die alten Blöcke, auf denen sich diese für Sie Belastende Datei befindet, freigegeben wurden. Diesen soeben freigewordenen Blöcken werden irgendwann mal einer anderen neuen Datei zugewiesen. Und bis dies, bzw. bis wann dies, geschieht hängt vom Betriebsystem und der Anordnung der Blöcke ab. Jeder kennt doch das Defragmentierungsprogramm von M$. Genauso können sie sich die einzelnen Blöcke vorstellen.

Nun da sie kurz bevor ihr PC beschlagnahmt wurde die Daten gelöscht haben, können sie davon ausgehen das die einzelnen Blöcke leicht für einen Speziallisten auslesbar sind. Beispielsweise mit den Funktionen seek() oder lseek() ist ein direktes Lesen der alten Inhalte möglich.

Am besten kann ich Ihnen das Anhand eines Links auf diese Datei demonstrieren. Zuerst wollen wir diese Datei erzeugen...

cat > meinChef.txt
Mein Chef ist ein Penner.
<STRG><D>  

Nun befindet sich die Textdatei meinChef.txt in Ihrem Verzeichnis. Jetzt wollen wir zu dieser Datei einen Link anlegen....

ln ./meinChef.txt ./meinChef.link  

Nun haben wir einen Link zu meinChef.txt angelegt. Bitte verwechseln sie das nicht meiner einer Kopie. Einfacher Beweis. Ändern sie die Datei meinChef.txt um. Diese Veränderung findet sich logischerweise in meinChef.link auch wieder. Ich will zu den Links jetzt nicht mehr genauer Eingehen. Ich hatte dies Thema schon in einem anderem Kapitel durchgenommen.

Jetzt wollen wir die Datei meinChef.txt löschen....

rm ./meinChef.txt  

Ob sie nun in der Konsole rm benutzen oder die C-Funktionen unlink() oder remove(), es kommt immer dasselbe dabei raus. Es wird nur der Name gelöscht und die Datenblöcke freigegeben. Nun können sie sich den Link meinChef.link ansehen der ja immer noch auf diese Datenblöcke verweist. Logischerweise ist das belastende Material also immer noch Rekonstruierbar.

Was hätten sie also tun können, damit die Daten ganz von der Platte verschwunden wären?

Die Daten mit einer starken Kryptographie Verschlüsseln bevor diese auf die Platte geschrieben werden. Programme wie PGP zum Beispiel sind für eine solche Aufgabe geeignet. Aber sie könnten es ja mal Vergessen die Datei zu Verschlüsseln..........

Wir können aber auch die Daten wirklich von der Platte löschen. Auf den 2.Punkt wollen wir etwas genauer eingehen. Wobei der Begriff löschen, wie sie von oben wissen, nicht immer das heißt was man darunter versteht.

Am einfachsten können wir unsere Daten unlesbar machen in dem wir den Inhalt zuerst überschreiben (z.B. mit \0 oder sonstigen Irreführenden Daten) und anschließend "löschen". Somit ist es fast nichtmehr möglich die Daten wieder zu Analysieren.

Machen wir doch zuvor noch einen Oktalen Dump bevor wir loslegen.......

od ./meinChef.txt
0000000 067516 064143 060555 071554 050040 047105 042516 005122
0000020  

So etwa sieht die Oktale Darstellung von meinChef.txt aus. Nun wollen wir ein Programm schreiben das unsere belastende Datei überschreibt.....

/*Download:munlink.c*/
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> enum{ERROR=-1,SUCCESS}; int main() { int FH; /*Filehandle*/ long size; /*Länge des Textes in Bytes*/ int i; char *puffer; /*Puffer für size*'\0' */ if( (FH=open("meinchef.txt", O_WRONLY)) == ERROR) { fprintf(stderr, "Fehler bei open......\n"); exit(0); } /*Schreibzeiger auf EOF; Ergebnis in size*/ size=lseek(FH, 0L, SEEK_END); /*Schreibzeiger wieder ganz zum Anfang*/ lseek(FH, 0L, SEEK_SET); /*Speicher für size Bytes reservieren....*/ if((puffer=(char *)(malloc(sizeof(size)))) == NULL) { fprintf(stderr, "Fehler bei malloc......\n"); exit(0); } /*Kompletten puffer mit '\0' belegen*/ for(i=0; i<size; i++) puffer[i]='\0'; /*size '\0' Bytes in FH schreiben*/ if(write(FH, puffer, size) != size) fprintf(stderr, "Fehler bei write.......\n"); /*Und jetzt entfernen wir die Datei, oder besser */ /* wir löschen den Namen und geben die Blöcke frei*/ unlink("meinchef.txt"); return 0; }

Dies Programm ist sicherlich nicht the state of art aber für unsere Zwecke reicht es völlig aus. Wir stellen die Länge der Datei fest und Überschreiben den Inhalt mit lauter '\0' - Zeichen. Am Ende des Programms "löschen" wir das Programm mittels unlink.

Nun wollen wir nochmals einen Oktalen Dump auf unseren meinChef.link ausführen und......

od ./meinChef.link
0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000 0000000
0000000  

...der Inhalt der Datei ist nicht mehr Nachzuvollziehen.

Es muss natürlich erwähnt werden das es mit ERHEBLICHEN Aufwand möglich sein kann, die frühere Magnetisierung teilweise wieder zu rekonstruieren. Aber da dies sehr Aufwending und Kostspielig ist und die Daten nicht mehr komplett hergestellt werden können, kann man diese Methode oben als recht Sicheres "Löschen" sehen.

Des weiteren sollten sie, unter Linux/Unix, darauf achten die Datei mit den Zugriffsrechten 0600 zu erzeugen. Da es sonst sein könnte, dass beim "löschen" der Datei, gerade jemand anderes die Datei lesen kann. Wenn sie herausfinden wollen welche Prozesse gerade gerade auf diese Datei zugreifen, können sie dies mit dem Befehl "fuser" herausfinden. Beispielsweise unser Link meinChef.link........

fuser ./meinChef.link
./meinChef.link: 1643 1654 1666  

In diesem Beispiel wird unsere Datei meinChef.link von drei Prozessen verwendet: 1643 1654 1666

Nun wollen wir natürlich auch Wissen welche Prozesse auf meinChef.link zugreifen....

ps 1643 1654 1666
1643 pts/2 R kwrite
1654 pts/5 T ./resure
1666 pts/3 T ./resure  

Prozess-ID 1643 wird gerade mit kwrite benutzt. Prozess 1654 von dem Programm ./resure usw. Falls genügend Rechte haben können sie diese Prozesse nun mittels....

kill -9 1643 1654 1666  

...töten. Das Problem an fuser ist nur das dieser Befehl Systemabhängig ist und meist nur als root ausführbar ist.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf