25 Feb 2012

Angriffs-Vektor: Direct Memory Access

Wir bei Curesec haben uns mit Direct Memory Access (DMA) als Angriffsvektor auf Rechner beschäftigt. Dies haben wir vor allem getan, um die Sicherheit unserer eigenen Rechner entsprechend sicherstellen zu können. Dieser Blogartikel stellt die Ergebnisse dieser Untersuchung vor.

Viele moderne Schnittstellen, allen voran Firewire (IEEE1394), stellen DMA zwischen den verbundenen Geräten zur Verfügung. Das heißt, ein über Firewire angeschlossenes Gerät kann auf den Speicher des Gerätes, mit welchem es verbunden ist, zugreifen. Dieser Zugriff kann sowohl lesend als auch schreibend erfolgen. Im Prinzip geht das auch über andere Bus-Systeme wie z.B. Thunderbolt.

Einige Leser werden sich jetzt denken: “Gut, dass ich keine Firewire Schnittstelle an meinem Rechner habe.” Diese Schlussfolgerung ist leider falsch. Wenn der Rechner einen PCMCIA oder PCI-Express-Einschub hat, ist man trotzdem angreifbar. Dazu muss ein Angreifer lediglich eine Firewire-Karte einschieben. Üblicherweise laden die Betriebssysteme die benötigten Treiber automatisch.

Zur Illustration des Problems haben wir während unserer Untersuchungen ein kleines Demo-Video aufgenommen.

In dem Video wird ein DMA-Angriff auf ein MacBookPro mit Mac OS X 10.6.8 gezeigt. Das Verfahren funktioniert aber auch gegen Windows, Linux und andere Systeme, die eine Firewire-Unterstützung vorweisen.

Unter Mac OS X 10.7 (“Lion”) funktioniert das Auslesen des Arbeitsspeichers im gezeigten Szenario (Nutzer angemeldet, Bildschirm gesperrt) nicht mehr auf Anhieb. Allerdings kann ein Angreifer bei Lion vor dem Auslesen des Speichers den Nutzer auf einen anderen als den momentan angemeldeten Nutzer umschalten, und der Angriff funktioniert wieder. Dies ist nur möglich, wenn „Fast User Switching“ aktiviert wurde. Da dieses standardmäßig aktiviert ist, erhöht sich das Risiko eines erfolgreichen Angriffs.

Schutzmaßnahmen

Um den eigenen Rechner vor DMA-Angriffen zu schützen hat man verschiedene Möglichkeiten. Die beste Lösung ist natürlich wenn der eigene Rechner gar nicht erst über entsprechende Schnittstellen verfügt. Das ist allerdings bei modernen Geräten normalerweise nicht gegeben.

Geübte Bastler können natürlich ihren Rechner auseinander schrauben und mit dem Lötkolben anfangen Controller raus zu löten. Diese Methode hat den Nachteil dass damit die Schnittstelle dauerhaft lahmgelegt wird. Ferner kann bei solchen Aktionen mit dem Lötkolben auch viel schief gehen, wodurch man sich seinen Rechner zerstören kann.

Die zweitbeste Lösung ist dafür zu sorgen dass die entsprechende Software wie Kernelmodule nicht geladen sind und auch nicht nachgeladen werden können. Diese Möglichkeit bieten alle gängigen Betriebssysteme.

Mac OS X schützen – 10.7 Lion

In der Systemsteuerung ‘Fast User Switching’ ausschalten. Auf der Konsole die folgenden Einstellungen vornehmen:

sudo pmset -a destroyfvkeyonstandby 1 hibernatemode 25

Mac OS X schützen – 10.6 Snow Leopard

OpenFirmware Schutz installieren. Entweder per Software von Apple, mehr Informationen dazu unter unter: http://support.apple.com/kb/HT1352

Alternativ kann man das auch einfach über die Koommandozeile erledigen:

nvram security-password=mypass nvram security-mode=command

Beim Passwort sollte man sich bewusst sein, dass dieses von root-Nutzern ausgelesen werden kann. Hier gilt wie bei allen Passwörtern: Kein Passwort verwenden, das an anderer Stelle schon im Einsatz ist.

Mehr Informationen dazu finden Sie unter:

http://ilostmynotes.blogspot.com/2012/01/os-x-open-firmware-settings-use-nvram.html

Alternativ kann man das entsprechende Kernelmodul auch entladen:

sudo kextunload /System/Library/Extensions/IOFireWireFamily.kext/Contents/PlugIns/AppleFWOHCI.kext

Um dauerhaft geschützt zu sein, muss man das Modul allerdings auch löschen, sonst wird es nach einem reboot möglicherweise wieder geladen:

sudo rm /System/Library/Extensions/IOFireWireFamily.kext/Contents/PlugIns/AppleFWOHCI.kext

Linux schützen

Unter Linux ist es am besten, wenn man die entsprechenden Kernel-Module entlädt:

rmmod ohci1394

Man kann das ohci1394 modul auch ohne DMA Unterstützung laden, das geht mit:

modprobe ohci1394 phys_dma=0

Andernfalls wird das Modul nach einem Neustart wieder geladen.

Windows schützen

Im Gerätemanager die PCI- und 1394-Host-Controller deaktivieren.

Links

Uwe Hermann hat eine hilfreiche Übersicht über die bisherigen Vorträge und Dokumente zu diesem Thema verfasst.

Die ‘libforensic1394′ python library stammt von Freddie Witherden.

Das ‘ramdump.py’-Skript, welches ich im Demo-Video nutze. [LINK!]

Eine schöne Übersicht über die Änderungen in Lion.