In diesem Artikel geht es um das Passware Kit Forensic, Klartext-Paßworte, die Mac OS X im Hauptspeicher hält, wie man sie findet, was sonst noch unverschlüsselt im Speicher liegt und was das alles bedeutet.
Es gab Nachrichten, in denen es hieß, Mac OS X würde Paßworte im Klartext im Hauptspeicher halten während man eingeloggt ist. Das hat mich gewundert. Angeblich sollte ein Paßwort-Tool von Passware, das "Passware Kit Forensic", die Paßworte per Firewire extrahieren können. Auch das weckte meine Neugier und ich fragte bei Passware nach. Am Ende der Diskussion stellten sie mir ihr Tool zur Evaluierung netterweise zur Verfügung.
Daß Firewire-Geräte direkten Zugriff auf den Hauptspeicher haben, ist prinzipbedingt klar, denn das ist ein Grund, warum Firewire so schnelle Transfers leisten kann, ohne die CPU dafür während des Transfers selbst einspannen zu müssen. Dieser Zugriff läßt sich allerdings unterbinden, indem man ein Firmware-Paßwort setzt.
Per Firewire wird die Hardware ausgelesen, der physikalische Speicher, also das, was sich konkret in den grün-schwarzen Speicherriegeln befindet. Der viel größere virtuelle Speicher wird nicht gelesen, denn ein Firewire-Gerät adressiert rein auf Hardware-Ebene. Es befinden sich immer die aktuell benötigten Teile des virtuellen Speichers im RAM. Ich weise extra darauf hin, weil selbst auf Vorträgen des Chaos Computer Clubs in diesem Punkt schon fehlerhafterweise publiziert wurde, Firewire habe "Zugriff auf den gesamten virtuellen Speicher".
Man ist jedoch nicht auf Firewire angewiesen, denn es gibt diverse Wege, um den physikalischen Speicher auszulesen. Den Speicher kann man also so oder so auslesen. Der interessante Punkt, der übrigbleibt, ist folglich: Was findet sich im RAM?
Zum Auslesen des RAM kann das "Passware Kit Forensic" einen auf PCs bootfähigen USB-Stick erstellen, auf dem es ein Programm "Firewire Memory Imager" platziert, das ein Memory-Image von einem per Firewire angeschlossenen Mac erstellen kann wie in diesem Video.
Ich habe zwar dank Bootcamp auf einem iMac eine Windows 7 Installation, aber dieser kann nur von USB-Laufwerken starten, die OS X enthalten. Also habe ich ein anderes (OS X-) Tool genommen, um die 2GB RAM des MacBooks auszulesen: MacMemoryReader. Das Programm muß unter root laufen und erzeugte ein Mach-O Dump-File des physikalischen Hauptspeichers, das auf meinem USB-Stick gespeichert wird:
./MacMemoryReader /Volumes/PFMI/ram_dump.mach-o Dumping memory regions: available 0000000000000000-000000000008f000 [WRITTEN] ACPI_NVS 000000000008f000-0000000000090000 [WRITTEN] available 0000000000090000-00000000000a0000 [WRITTEN] LoaderData 0000000000100000-000000000010f000 [WRITTEN] available 000000000010f000-0000000000200000 [WRITTEN] LoaderData 0000000000200000-0000000000768000 [WRITTEN] available 0000000000768000-0000000000800000 [WRITTEN] LoaderData 0000000000800000-0000000001c57000 [WRITTEN] RT_code 0000000001c57000-0000000001c7d000 [WRITTEN] RT_data 0000000001c7d000-0000000001ca8000 [WRITTEN] RT_data 0000000001ca8000-0000000001ca9000 [WRITTEN] LoaderData 0000000001ca9000-0000000001ce0000 [WRITTEN] available 0000000001ce0000-000000007bfdf000 [WRITTEN] BS_data 000000007bfdf000-000000007c027000 [WRITTEN] available 000000007c027000-000000007c655000 [WRITTEN] LoaderCode 000000007c655000-000000007c6c2000 [WRITTEN] available 000000007c6c2000-000000007c794000 [WRITTEN] BS_data 000000007c794000-000000007dc19000 [WRITTEN] available 000000007dc19000-000000007dc28000 [WRITTEN] BS_data 000000007dc28000-000000007dc51000 [WRITTEN] available 000000007dc51000-000000007dc56000 [WRITTEN] BS_data 000000007dc56000-000000007dd11000 [WRITTEN] available 000000007dd11000-000000007dd64000 [WRITTEN] BS_data 000000007dd64000-000000007dd65000 [WRITTEN] available 000000007dd65000-000000007dd66000 [WRITTEN] BS_data 000000007dd66000-000000007dd88000 [WRITTEN] available 000000007dd88000-000000007dd8a000 [WRITTEN] BS_data 000000007dd8a000-000000007dd8c000 [WRITTEN] available 000000007dd8c000-000000007dd8e000 [WRITTEN] BS_data 000000007dd8e000-000000007e0f8000 [WRITTEN] ACPI_NVS 000000007e0f8000-000000007e2f9000 [WRITTEN] BS_data 000000007e2f9000-000000007ecf8000 [WRITTEN] available 000000007ecf8000-000000007ed3a000 [WRITTEN] BS_code 000000007ed3a000-000000007ee42000 [WRITTEN] available 000000007ee42000-000000007ee4b000 [WRITTEN] available 000000007ee4b000-000000007ee71000 [WRITTEN] available 000000007ee71000-000000007ee80000 [WRITTEN] available 000000007ee80000-000000007eeab000 [WRITTEN] available 000000007eeab000-000000007eeb7000 [WRITTEN] ACPI_recl 000000007eeb7000-000000007eebc000 [WRITTEN] available 000000007eebc000-000000007eebe000 [WRITTEN] ACPI_NVS 000000007eebe000-000000007eeef000 [WRITTEN] ACPI_recl 000000007eeef000-000000007eeff000 [WRITTEN] available 000000007eeff000-000000007ef00000 [WRITTEN] Reported physical memory: 2147483648 bytes (2048.00MB) Statistics for each physical memory segment type: reserved: 2 segments, 17956864 bytes (17.12MB) -- ignored LoaderCode: 1 segment, 446464 bytes (436.00KB) -- WRITTEN LoaderData: 4 segments, 27283456 bytes (26.02MB) -- WRITTEN BS_code: 1 segment, 1081344 bytes (1056.00KB) -- WRITTEN BS_data: 9 segments, 36958208 bytes (35.25MB) -- WRITTEN RT_code: 1 segment, 155648 bytes (152.00KB) -- WRITTEN RT_data: 2 segments, 180224 bytes (176.00KB) -- WRITTEN available: 21 segments, 2060767232 bytes (1965.30MB) -- WRITTEN ACPI_recl: 2 segments, 86016 bytes (84.00KB) -- WRITTEN ACPI_NVS: 3 segments, 2306048 bytes (2.20MB) -- WRITTEN MemMapIO: 3 segments, 217088 bytes (212.00KB) -- ignored Total memory written: 2129264640 bytes (2030.62MB) Total memory ignored: 18173952 bytes (17.33MB) Reported memory not in the physical memory map: 45056 bytes (44.00KB)
Die Memory-Dump-Datei, die ein PC auch mit dem "Firewire Memory Imager" erstellen könnte, habe ich dann an das Passware-Tool übergeben, das verschiedene Formate von Memory-Dumps einlesen kann:
Passware versucht nun, in dieser Datei Klartext-Login-Namen und -Paßworte zu finden sowie die zugehörigen Hashwerte. Anhand der Hashwerte kann die Korrektheit des Paßwortes geprüft werden.
Hier findet Passware ein sehr einfaches Paßwort und den zugehörigen Hash, was in der Zeit theoretisch auch problemlos per Brute-Force kombiniert mit einer Wörterbuch-Attacke entschlüsselt werden könnte. Es muß also nicht zwingend im Klartext vorgelegen haben, denn gängige Tools wie "John the Ripper password cracker, version 1.7.8-jumbo-4" rekonstruieren Paßworte dieser Stärke im Sekundenbereich.
Um sicherzustellen, daß wirklich Klartext-Paßworte gefunden werden, und kein "Knacken" stattfindet, probiere ich ein schwierigeres Paßwort aus.
Hier findet Passware ein etwas komplizierteres Paßwort und den zugehörigen Hash, was in der Zeit nicht mit Brute-Force kombiniert mit einer Wörterbuch-Attacke entschlüsselt werden könnte. Es muß also im Klartext vorliegen.
Ich habe diverse weitere Tests gemacht.
Hier war beispielsweise ein User mit leerem Paßwort per GUI eingeloggt und MacMark per SSH:
Das leere Paßwort wurde ironischerweise nicht gefunden. Der ausschließlich per SSH eingeloggte User und dessen Paßwort allerdings auch nicht. Anscheinend findet Passware also zwar Paßworte von GUI-Logins, aber keine Paßworte von SSH-Logins.
Hier war ein User mit komplexerem Paßwort per GUI eingeloggt und MacMark per SSH:
Wieder wurde das korrekte Paßwort des GUI-Users ausgegeben, das mit dem zugehörigem Hash, der offenbar ebenfalls gefunden wurde, verifiziert wurde. Der SSH-User blieb wieder unentdeckt.
Nach dem Passware-Test wollte ich es genau wissen und sehe mir die RAM-Datei an.
Ich hatte eines meiner 2GB Memory-Dump-Files mit dem Shell-Kommando "split" in Teile von maximal 600 MB Größe zerlegt, um den Inhalt leichter analysieren zu können ohne in Speicherprobleme zu geraten, und dann mit vim nach Paßworten gesucht, die ich kenne. Dabei fiel auf, daß dort ebenfalls das Paßwort für mein WLAN und für per SSH eingeloggte User, die nicht mal per GUI "drin" waren, im Klartext auffindbar sind. Davon habe ich aus verständlichen Gründen, keine Screenshots gemacht. Passware plant für ein zukünftiges Release auch die Suche nach diesen Paßworten mit reinzunehmen.
In den folgenden Screenshots sind jeweils gefundene Paßworte und andere interessante Daten markiert. Man sieht leicht, daß das Paßwort, in diesem Fall war es "c8&vS73_;J/-d?fRU", im Klartext vorliegt und zwar an Stellen, die man auch ohne das Paßwort zu kennen, auffinden kann. Ebenso lassen sich recht leicht die Stellen mit den Hashwerten und dem Usernamen "joeuser" auffinden. Alle drei Werte sind mit sprechenden Namen in unmittelbarer Nähe markiert: "password", "username" und "ShadowHash", "SHA1" sowie "HASHLIST".
Passware hat also die Wahrheit gesagt: Mac OS X speichert Paßworte von angemeldeten Benutzern im Klartext im RAM. Und die zugehörigen Hashwerte und Benutzernamen.
Daß die Paßworte im RAM unverschlüsselt liegen, ist nicht optimal, denn verschlüsselt oder nach Login gelöscht wäre besser. Der Zugriff auf den kompletten Speicher erfordert allerdings root-Rechte und wenn man die eh schon hat, dann braucht man keine Paßworte mehr.
Ein weiterer Gesichtspunkt sind verschüsselte Festplatten. Da jeder entsprechend berechtigte User bei FileVault 2 die Entschlüsselung der Festplatte mit seinem Login-Paßwort auslöst, kann ein Angreifer nach Extraktion des Paßwortes natürlich die Platte entschlüsseln. Allerdings braucht er das nicht, denn um das Paßwort auslesen zu können, muß der Opfer-User angemeldet sein, wodurch die Platte bereits entschlüsselt vorliegt und man mit den root-Rechten, die man für den RAM-Zugriff braucht, oder wahlweise mit physikalischem Zugriff (Firewire) auf den Rechner, auch anders an den Platteninhalt kommen kann.
Nützlich sind solche Tools, um bei einer Hausdurchsuchung am laufenden Rechner die Paßworte abzugreifen, mit denen man dann später nicht nur problemlos wieder an die Userdaten kommt, sondern auch bei Paßwortgleichheit den Schlüsselbund öffnen kann und andere verschlüsselte Medien.
Wer paranoid ist, sollte sich also ausloggen oder noch besser, den Rechner ausschalten, wenn er Kaffeepause macht.
Apple ist das Problem bekannt und sie kümmern sich darum.
Mit Mac OS X 10.7.2 hat Apple unter anderem Fehler bezüglich Firewire behoben. Firewire kann jetzt nur noch, wenn man eingeloggt ist und arbeitet, auf das RAM zugreifen. Hier hat das auch jemand getestet.
Der Chef von Passware (Dmitry) war übrigens sehr nett, höflich und hilfsbereit, so daß ich ihm sogar glaube, daß er es ehrlich meinte, als er sagte, er hoffe, daß Apple diesen Punkt fixt. Ich bedanke mich bei Dmitry für die Unterstützung und daß er mir das Passware Kit Forensic zur Verfügung gestellt hat.
Ist Firewire böse? Nein, denn das Speicherauslesen ist ein Feature von Firewire, USB (wie beim Jailbreak), Thunderbolt, PCI, PCMCIA und so weiter. Apple hat vor langer Zeit DMA per Firmware-Kennwort ausschaltbar gemacht.
Wie kann ich mein Paßwort suchen?
MacMemoryReader runterladen. In sein Verzeichnis gehen und mit
sudo ./MacMemoryReader ~/Desktop/ram_dump.mach-o
das Dump-File erstellen und mit
grep -abo DeinPaßwort ~/Desktop/ram_dump.mach-o
die Treffer suchen. Oder die Datei zerlegen mit
split -b 500m ~/Desktop/ram_dump.mach-o
, dann mit
grep DeinPaßwort xa*
die Dateien mit Treffern suchen und diese dann mit einem Texteditor
öffnen und damit suchen.