TrueCrypt

USBDLM

 

TrueCrypt / VeraCrypt


 

TrueCrypt ist eine bewährte Open-Source-Software zur Datenträger-Verschlüsselung. Die verschlüsselten Daten werden entweder in einer Datei, einer Partition oder einem ganzen Laufwerk gespeichert.

 

Leider hatten die Entwickler der Software keine Lust mehr, die Software weiter zu pflegen und haben sie kurzerhand für potentiell unsicher erklärt, weil sie Fehler enthalten könnte. Ein zur selben Zeit laufendes externes Review der Quelltexte hat aber keine nennenswerten Problem zu Tage gefördert, der letzten funktionsfähigen Version 7.1a kann somit wohl weiter vertraut werden:

http://www.heise.de/download/truecrypt.html

 

Auf Basis der TrueCrypt-Quelltexte wurde das VeraCrypt-Projekt ins Leben gerufen, Funktionalität, Bedienung und Kommandozeilenparameter entsprechen weitgehend denen von TrueCrypt, nur das Mounten von Volumes ist etwas langsam, um Bruteforce-Angriffe zu erschweren. Seit man beim Mounten den Hashalgorithmus vorwählen kann, geht es hinreichend schnell.

https://veracrypt.codeplex.com

 

Wenn im Folgenden von TrueCrypt die Rede ist, gilt das so auch für VeraCrypt.

 

Ein TrueCrypt-Container wird mit Zufallsdaten initialisiert - die verschlüsselten Daten sehen dann ebenso zufällig aus. Wird eine ganze Partition als TrueCrypt-Container benutzt, hat diese kein Dateisystem und damit auch keine Datenträgerbezeichnung, bekommt von Windows aber dennoch einen Laufwerksbuchstaben. Als Dateisystem zeigt Windows dann vielsagend "RAW".

 

Nur die TrueCrypt-Anwendung mit ihrem Treiber kann den Container als zusätzliches Laufwerk mit den entschlüsselten Daten einbinden.

 

 

Datei als Container

 

USBDLM kann beim Anschließen eines Laufwerks nach dem Vorhandensein einer Datei schauen und diese dann durch TrueCrypt mounten lassen:

 

[OnArrival]

FileExists=%drive%\geheim.tc

open="%ProgramFiles%\TrueCrypt\TrueCrypt.exe" /q /v "%drive%\geheim.tc" /letter J

 

Ab besten nur dann, wenn der Zielbuchstabe auch frei ist - sonst sagt TrueCrypt "Volume is already mounted":

 

[OnArrival]

FileExists=%drive%\geheim.tc

DirNotExists=J:\

open="%ProgramFiles%\TrueCrypt\TrueCrypt.exe" /q /v "%drive%\geheim.tc" /letter J

 

Andererseits ist eine Fehlermeldung gar nicht schlecht, ohne wird der TrueCrypt-Container einfach nicht eingebunden.

 

 

Partition als Container

 

Den Laufwerksbuchstaben einer als TrueCrypt-Container benutzen Partition sollte man entfernen - er ist nutzlos und birgt das Risiko, dass das Laufwerk fix mal formatiert wird... Das kann man in der Windows Datenträger-Verwaltung erledigen oder USBDLM überlassen.

 

USBDLM kann den Buchstaben jeder als TrueCrypt-Container genutzten Partition entfernen. Die Erkennung eines TrueCrypt-Containers ist simpel gestickt: Wenn die Daten im ersten Sektor eine Volumes nach Zufallsdaten aussehen gibt USBDLM dem Volume den DeviceType TrueCrypt.

Wenn der Container bereits durch TrueCrypt gemountet ist, kann USBDLM keine Test-Daten lesen, weil TrueCrypt sich exklusiven Zugriff gönnt. Der Lese-Versuch wird mit dem Fehlercode ERROR_SHARING_VIOLATION verweigert. USBDLM vergibt dann den DeviceType ReadSharingViolation. Das passiert typischerweise, wenn USBDLM neu gestartet wird und somit das TrueCrypt-Volume beim Test bereits gemountet ist.

 

Die typische Behandlung von TrueCrypt-Partitionen sieht so aus: Laufwerksbuchstaben entfernen und TrueCrypt zum Mounten starten.

Wenn der USBDLM-Dienst neu gestartet wird, während eine TrueCrypt-Partition gemountet ist, soll zwar der Laufwerksbuchstaben entfernt werden bzw. entfernt bleiben, TrueCrypt aber nicht erneut aufgerufen werden. Genau das macht das folgende Beispiel:

 

; Buchstabe entfernen, da nutzlos

[DriveLetters]

DeviceType1=TrueCrypt

DeviceType2=ReadSharingViolation

Letter=-

 

; Container auf J: mounten

[OnArrival]

DeviceType=TrueCrypt

open="%ProgramFiles%\TrueCrypt\TrueCrypt.exe" /q /v %PartitionName% /letter J

 

; und ein Explorer-Fenster mit dem gemounteten TrueCrypt-Laufwerk öffnen

[OnArrival]

DeviceType=TrueCryptVolume

open="%windir%\explorer.exe" %root%

 

%PartitionName% ist eine USBDLM-Variable die USBDLM durch sowas wie \Device\Harddisk2\Partition1 ersetzt, so wie TrueCrypt das erwartet.

 

Für VeraCrypt ist der DeviceType des gemouteten Volumes VeraCryptVolume.

Der DeviceType eines Partitions-Containers ist aber auch bei VeraCrypt TrueCrypt, da es immer nur Zufallsdaten sind, die sich äußerlich nicht unterscheiden und TrueCrypt war zuerst da...

 

 

Unbekannte Partition als Container

 

Um von vornherein zu verhindern, dass Windows einer TrueCrypt-Container-Partition einen Laufwerksbuchstaben zuordnet, kann man der Partition einen unbekannten Partitionstyp verpassen, z.B. 0x7C. Es gibt dann trotzdem ein Kernel-Objekt wie \Device\Harddisk2\Partition1, Windows erzeugt aber kein Standard-Volume, somit hat man auch keinen Laufwerksbuchstaben. Allerdings wird dann auch USBDLMs OnArrival nicht ausgeführt - es gibt ja kein Volume. Hier kann man ab USBDLM V4.8 auf OnDiskArrival usw. zurückgreifen, siehe unten, "Ganzes Laufwerk als Container".

Das Ändern des Partitions-Typs geht z.B. mit dem Active@ Partition Manager 3.0: Rechtsklick auf das Laufwerk, Partition Table..., hier den Wert "File system [hex]" auf 7C setzten.

 

 

Ganzes Laufwerk als Container

 

Im ersten Sektor wird eigentlich ein Partitionstabelle erwartet. Die Windows Datenträgerverwaltung meint dann auch, ein TrueCrypt-Laufwerk "initialisieren" zu müssen, was dem Container sicher nicht gut bekommt. Schlimmer als die Empfehlung des Windows-Explorers eine TrueCrypt-Partition zu formatieren ist das aber auch nicht.

Ab V4.8 gibt es die Ereignisse OnDiskArrival, OnDiskRemovalRequest und OnDiskRemoval, so dass ganze TrueCrypt-Laufwerke behandelt werden können.

Die nötige Disk-Nummer ist bekannt, sie ist identisch mit der DeviceNumber. Partition0 steht unter Windows für die ganze Disk:

 

; Disk auf J: mounten

[OnDiskArrival]

DeviceType=TrueCrypt

open="%ProgramFiles%\TrueCrypt\TrueCrypt.exe" /q /v \Device\Harddisk%DeviceNumber%\Partition0 /letter J

 

; J: beim "Sicher entfernen" der Disk dismounten

[OnDiskRemovalRequest]

DeviceTypes=TrueCrypt,ReadSharingViolation

open="%ProgramFiles%\TrueCrypt\TrueCrypt.exe" /q /dJ

 

Beim Entfernen kann der DeviceType ReadSharingViolation oder TrueCrypt sein, abhängig davon, ob das Volume beim Start des USBDLM-Dienstes schon gemountet war oder nicht.

 

 

Das TrueCrypt-Volume

 

Wenn TrueCrypt einen Container mountet, dann macht es dessen Inhalt unter einem neuen Laufwerksbuchstaben verfügbar. Dabei handelt es sich nicht um ein "vollwertiges" Laufwerk - einige Interna wurden entweder eingespart oder es ging nicht anders.

USBDLM sieht die Ankunft des neuen Laufwerksbuchstaben und kann dann einen OnArrival auslösen. Der DeviceType des gemounteten TrueCrypt-Laufwerks ist TrueCryptVolume, der eines VeraCrypt-Laufwerks ist VeraCryptVolume.

Mehr kann USBDLM mit einem TrueCrypt-Volume nicht machen. Es kennt dessen Laufwerkbuchstaben und macht ihn auch in den USBDLM-Variablen wie %drive% und %root% verfügbar. Das Ändern des Laufwerksbuchstaben wäre zwar möglich aber dann verliert TrueCrypt den Überblick - deshalb unterstützt USBDLM das nicht.

 

Das TrueCrypt-Laufwerk zusätzlich in einem (bereits vorhandenen) NTFS-Ordner bereitzustellen, kann man sich aber basteln:

 

[OnArrival]

DeviceType=TrueCryptVolume

 

open="%windir%\System32\mountvol.exe" "C:\TrueCrypt" %VolumeName%

system=1

 

open="%windir%\explorer.exe" %root%

 

 

USBDLM weiß nichts vom Zusammenhang zwischen dem TrueCrypt-Volume und dessen Container - es arbeitet nur aufeinanderfolgende Ereignisse ab.

 

 

Sicheres Entfernen

 

Beim "Vorbereiten zum sicheren Entfernen" des Wirtslaufwerks kann USBDLM das TrueCrypt-Volume unmounten lassen, TrueCrypt will dafür den Laufwerksbuchstaben des TrueCrypt-Volumes sehen:

 

[OnRemovalRequest]

FileExists=%drive%\geheim.tc

DirExists=J:\

open="%ProgramFiles%\TrueCrypt\TrueCrypt.exe" /q /dismount J

 

Der Parameter /q oder /quit ist wichtig: USBDLM beantwortet die Anfrage zum "Sicheren Entfernen" erst, wenn die gestartete TrueCrypt.exe beendet wurde.

Ohne /quit zeigt TrueCrypt nach dem Dismounten ein Fenster und USBDLM wartet und wartet... Letztlich wird Windows dann sagen "Der Dienst USBDLM verhindert das Entfernen"...

 

Zum Abmelden eines TrueCrypt-Volumes (TrueCrypt nennt das "Dismount") habe ich ein Kommandozeilen-Tool geschrieben, dass auch den Containernamen als Laufwerksinfo akzeptiert. Außerdem kann es endlos weiter versuchen bis es klappt und auch offene Handles auf dem TrueCrypt-Volume anzeigen.

Ab USBDLM V5.0 gibt es das Kriterium IsMountedTrueCryptContainer, das zutreffend ist, wenn der angegebene Container (eine Datei, eine Partition oder eine Disk) als TrueCrypt-Laufwerk gemountet ist:

 

; wenn geheim.tc auf dem zu entfernenden Laufwerk von TrueCrypt gemountet ist, dieses freigeben

[OnRemovalRequest]

IsMountedTrueCryptContainer=%drive%\geheim.tc

open="C:\Tools\EjectTcv.exe" %drive%\geheim.tc -L -H

 

; wenn das zu entfernende Volume von TrueCrypt gemountet ist, dieses freigeben

[OnRemovalRequest]

IsMountedTrueCryptContainer=%PartitionName%

open="C:\Tools\EjectTcv.exe" %PartitionName% -L -H

 

Mit einem gepatchten Partitions-Typ oder wenn die ganze Disk als Container genutz wird, gibt es kein Volume, somit auch kein OnRemovalRequest. Hier muß OnDiskRemovalRequest genutzt werden, die Partitionsnummer muß bekannt sein und Partitionsname selbst gebaut werden:

 

; TrueCrypt-Container in Paritition1 freigeben

[OnDiskRemovalRequest]

IsMountedTrueCryptContainer=\Device\Harddisk%DeviceNumber%\Partition1

open="C:\Tools\EjectTcv.exe" \Device\Harddisk%DeviceNumber%\Partition1 -L -H

 

; TrueCrypt-Container der Disk freigeben

[OnDiskRemovalRequest]

IsMountedTrueCryptContainer=\Device\Harddisk%DeviceNumber%\Partition0

open="C:\Tools\EjectTcv.exe" \Device\Harddisk%DeviceNumber%\Partition0 -L -H

 

EjectTrueCryptVolume

 

Ab V2.7 funktioniert EjectTcv auch mit VeraCrypt.