Sie berühren einen wunden Punkt ...
In der Vergangenheit waren Computer Mainframes , in denen viele unterschiedliche Benutzer Sitzungen und Prozesse auf dem Computer starteten gleiche physische Maschine. Unix-ähnliche Systeme (z. B. Linux), aber auch VMS und seine Verwandten (und diese Familie umfasst alle Windows der NT-Reihe, daher 2000, XP, Vista, 7, 8 ...) wurden strukturiert, um das zu unterstützen Mainframe-Modell.
Somit bietet die Hardware Berechtigungsstufen . Ein zentrales Element des Betriebssystems ist der Kernel , der auf der höchsten Berechtigungsstufe ausgeführt wird (ja, ich weiß, dass es Feinheiten in Bezug auf die Virtualisierung gibt) und die Berechtigungsstufen verwaltet. Anwendungen werden auf einer niedrigeren Ebene ausgeführt und vom Kernel gewaltsam daran gehindert, den Speicher des anderen zu lesen oder zu schreiben. Anwendungen erhalten RAM von Seiten (normalerweise 4 oder 8 kB) vom Kernel. Eine Anwendung, die versucht, auf eine Seite zuzugreifen, die zu einer anderen Anwendung gehört, wird vom Kernel blockiert und schwer bestraft ("Segmentierungsfehler", "allgemeiner Schutzfehler" ...).
Wenn eine Anwendung nicht mehr benötigt wird Bei einer Seite (insbesondere beim Beenden der Anwendung) übernimmt der Kernel die Kontrolle über die Seite und gibt sie möglicherweise an einen anderen Prozess weiter. Moderne Betriebssysteme "leeren" Seiten, bevor sie zurückgegeben werden, wobei "Ausblenden" "Füllen mit Nullen" bedeutet. Dies verhindert, dass Daten von einem Prozess zu einem anderen verloren gehen. Beachten Sie, dass Windows 95/98 / Millenium keine leeren Seiten hat und Lecks auftreten können. Diese Betriebssysteme waren jedoch für einen einzelnen Benutzer pro Computer gedacht.
Natürlich gibt es Möglichkeiten, dem Zorn des Kernels zu entkommen: Anwendungen, die "genug Privilegien" haben (nicht die gleichen Privilegien wie oben), stehen einige Türen zur Verfügung. Auf einem Linux-System ist dies ptrace (). Der Kernel ermöglicht es einem Prozess, den Speicher des anderen über ptrace () zu lesen und zu schreiben, vorausgesetzt, beide Prozesse werden unter derselben Benutzer-ID ausgeführt oder der Prozess, der ptrace () ausführt, ist ein "Root" -Prozess. Ähnliche Funktionen gibt es in Windows.
Unter dem Strich sind Kennwörter im RAM nicht sicherer als das, was das Betriebssystem zulässt. Per Definition durch Speichern einiger vertraulicher Daten im Speicher Bei einem Prozess vertrauen Sie dem Betriebssystem, dass es nicht an Dritte weitergegeben wird. Das Betriebssystem ist Ihr Freund , denn wenn das Betriebssystem ein Feind ist, haben Sie völlig verloren.
Jetzt kommt der lustige Teil. Da das Betriebssystem eine Prozesstrennung erzwingt, haben viele Menschen versucht, Wege zu finden, um diese Abwehrkräfte zu durchdringen. Und sie fanden ein paar interessante Dinge ...
-
Der "RAM", den die Anwendungen sehen, ist nicht unbedingt wahrer "Speicher". Der Kernel ist ein Meister der Illusionen und gibt Seiten, die nicht unbedingt existieren. Die Illusion wird aufrechterhalten, indem RAM-Inhalte gegen einen dedizierten Speicherplatz auf der Festplatte ausgetauscht werden, auf dem in größeren Mengen freier Speicherplatz vorhanden ist. Dies wird als virtueller Speicher bezeichnet. Anwendungen müssen sich dessen nicht bewusst sein, da der Kernel die Seiten bei Bedarf zurückbringt (aber die Festplatte ist natürlich viel langsamer als der Arbeitsspeicher). Eine unglückliche Folge ist, dass einige Daten, die angeblich im RAM gespeichert sind, auf ein physisches Medium gelangen, auf dem sie bis zum Überschreiben verbleiben. Insbesondere bleibt es dort, wenn die Stromversorgung unterbrochen wird. Dies ermöglicht Angriffe, bei denen der Bösewicht die Maschine greift und damit davonläuft, um die Daten später zu überprüfen. Oder es kann zu Undichtigkeiten kommen, wenn eine Maschine außer Betrieb genommen und bei eBay verkauft wird und der Systemadministrator vergessen hat, den Festplatteninhalt zu löschen.
Linux bietet ein System namens mlock (), das verhindert, dass der Kernel bestimmte Seiten an den Swap Space sendet. Da das Sperren von Seiten im RAM die verfügbaren RAM-Ressourcen für andere Prozesse erschöpfen kann, benötigen Sie einige Berechtigungen (erneut root), um diese Funktion zu verwenden.
Ein erschwerender Umstand ist, dass es nicht unbedingt einfach ist, den Überblick darüber zu behalten, wo Sie sich befinden Passwort ist wirklich im RAM. Als Programmierer greifen Sie über die von der Programmiersprache bereitgestellte Abstraktion auf RAM zu. Insbesondere Programmiersprachen, die Garbage Collection verwenden, können Objekte im RAM transparent kopieren (da dies für viele GC-Algorithmen wirklich hilfreich ist). Die meisten Programmiersprachen sind daher betroffen (z. B. Java, C # /. NET, Javascript, PHP, ... die Liste ist fast endlos).
-
Ruhezustand bringt die gleichen Themen mit aller Macht zurück. Der Ruhezustand muss von Natur aus den gesamten RAM auf die Festplatte schreiben - dies kann Seiten enthalten, die gesperrt wurden, und sogar den Inhalt der CPU-Register. Um Lecks im Ruhezustand zu vermeiden, müssen Sie drastische Maßnahmen wie die Verschlüsselung der gesamten Festplatte ergreifen. Dies bedeutet natürlich, dass Sie das Entsperrkennwort eingeben, wenn Sie den Computer aktivieren.
-
Das Mainframe-Modell geht davon aus, dass es mehrere Prozesse ausführen kann, die einander feindlich gegenüberstehen und dennoch vollkommenen Frieden und Isolation bewahren. Moderne Hardware macht das sehr schwierig. Wenn zwei Prozesse auf derselben CPU ausgeführt werden, teilen sie sich einige Ressourcen, einschließlich des Cache-Speichers. Speicherzugriffe sind im Cache viel schneller als anderswo, aber die Cache-Größe ist sehr begrenzt. Dies wurde ausgenutzt, um kryptografische Schlüssel wiederherzustellen, die von einem Prozess von einem anderen verwendet werden. Es wurden Varianten entwickelt, die andere cacheähnliche Ressourcen verwenden, z. Verzweigungsvorhersage in einer CPU. Während sich die Forschung zu diesem Thema auf kryptografische Schlüssel konzentriert, die hochwertige Geheimnisse sind, könnte sie wirklich auf alle Daten zutreffen.
In ähnlicher Weise können Grafikkarten direkten Speicherzugriff ausführen. Ob DMA nicht zum Lesen oder Schreiben von Speicher aus anderen Prozessen missbraucht werden kann, hängt davon ab, wie gut undokumentierte Hardware, Closed-Source-Treiber und Kernel zusammenarbeiten, um die entsprechenden Zugriffskontrollen durchzusetzen. Ich würde mein letztes Shirt nicht darauf wetten ...
Fazit: Ja, wenn Sie ein Passwort im RAM speichern, Sie vertrauen dem Betriebssystem, um dies vertraulich zu behandeln. Ja, die Aufgabe ist schwierig, auf modernen Systemen sogar nahezu unmöglich. Wenn einige Daten streng vertraulich sind, sollten Sie das Mainframe-Modell wirklich nicht verwenden und potenziell feindlichen Entitäten nicht erlauben, ihren Code auf Ihrem Computer auszuführen.
(Dies bedeutet übrigens, dass virtuelle Maschinen gehostet werden und Cloud Computing kann letztendlich nicht sicher sein. Wenn Sie die Sicherheit ernst nehmen, verwenden Sie dedizierte Hardware.)