aus ein
Ansicht umschalten Baum an
Avatar von seppig2002
  • seppig2002

mehr als 1000 Beiträge seit 21.07.2002

Details und weitere Schwachstellen

1. Die Umstaende, unter denen das Problem auftritt, sind
*ALTERNATIV*:

a) Der Storage-Treiber steht nicht auf der internen Liste von
TrueCrypt.
Dazu gehoert unter anderem der Intel Matrix Storage Manager im
RAID-Modus.

b) Der Treiber unterstuetzt nur die Methode WriteRoutine. Da
TrueCrypt
ausschliesslich die Routine WritePendingRoutine hookt, geht alles
vorbei.

c) Windows 2000, weil dort zuerst WriteRoutine und dann erst
WritePendingRoutine probiert wird.

Mithin reicht bereits *einer* dieser Faktoren aus,

Das Posting findet man unter
<http://www.pgpru.com/novosti/2008/kriticheskajaujazvimostjvtruecrypt
51>,
Google liefert unter
<http://translate.google.com/translate?u=http%3A%2F%2Fwww.pgpru.com%2
Fnovosti%2F2008%2Fkriticheskajaujazvimostjvtruecrypt51&langpair=ru%7C
en&hl=en&ie=UTF8>
ein recht gut verstaendliche Uebersetzung, leider mit etwas kaputter
Formatierung.

2. Die Behauptung in der vorherigen News, dass nur unkritische Fehler
gefixt wurden, ist eine
dreiste Luege. Ich selbst habe naemlich einen Buffer Overflow in der
Methode
GetDriveLabel() gemeldet, wo GetModuleFileNameW() mit einem
Byte-Count statt
einem Character-Count bedient wurde. An der Stelle steht jetzt ein
korrektes
"/ 2", auch wenn es eher "/ sizeof(WCHAR)" heissen sollte.

3. Weiterhin wurden diverse Fehler, die von mir gemeldet wurden,
nicht
gefixt. Beispielsweise wird in DispatchPnP() zweimal auf
DeviceObject->AttachedDevice zugegriffen; einmal, um es gegen NULL zu
checken, und das zweite mal zum Auslesen der Flags. Wenn in der
Zwischenzeit
das Attached Device verschwindet (z.B. weil man ein Removable Medium
entfernt), stuerzt alles wunderbar ab. Die korrekte Vorgehensweise
ist die
Verwendung der Methode IoGetRelatedDeviceObject(), welche den
Reference
Count des Attached Device erhoeht, womit das Device Object selbst bei
entferntem Medium erst dann vom I/O Manager geloescht wird, wenn man
nach
der Verwendung mit ObDereferenceObject() den Reference Counter wieder
verringert.
Aus gleichem Grunde ist DeviceObject->NextDeviceObject gefaehrlich,
hier
kann es allerdings sogar auch noch zu einem Deadlock im I/O-Manager
kommen,
wenn zwischendrin neue Device-Treiber eingeschoben werden. Ausserdem
ist es
viel leichter exploitbar, da einfach das hinreichend hartnaeckige
Senden von
Mount- und Dismount-Requests an den TrueCrypt-Treiber zur Ausnutzung
der
Luecke ausreicht. Die korrekte Vorgehensweise ist, mit
IoEnumerateDeviceObjectList eine Liste der DeviceObjects erzeugen zu
lassen,
mit gleichzeitiger Erhoehung der Reference-Counts, diese zu
enumerieren, und
anschliessen nochmalig zu enumerieren und dabei die Reference-Counts
wieder
zu verringern.
Von der genau der gleichen Natur ist der Aufruf von
IoAttachDeviceToDeviceStack(), was doch eigentlich trivial in
IoAttachDeviceToDeviceStackSafe() umgeschrieben werden kann.

4. In der aktuellen Version wurde sogar ein neuer Fehler eingefuehrt:
Wenn
man mit TrueCryptSetup.exe mit dem Parameter /p aufruft, um ein
komplettes
Setup-Paket zu erzeugen, wird gzip mit dem Parameter --best
gestartet.
Findet es kein gzip, so schlaegt es fehl; kann ja vorkommen, dass man
das zu
dem Zeitpunkt noch nicht wusste, aber immer kommt eine deutliche
Fehlermeldung.
Allerdings: Existiert stattdessen eine Datei namens "gzip --best.exe"
entweder im gleichen Pfad oder irgendwo in %PATH%, so wird diese
stattdessen
aufgerufen, was definitiv unewartetes Verhalten und potentiell
gefaehrlich ist.
Die Loesung ist, dass man "gzip" noch einmal zusaetzlich quotet, oder
gleich
von lpCommandLine nach lpApplicationName schiebt, wenn man
CreateProcess()
aufruft. Also CreateProcess(NULL,"\"gzip\"" --best",...) oder
CreateProcess("gzip","--best",...).

Ich habe die Entwickler von TrueCrypt zu alle diesen Problemen
bereits kontaktiert. Auf Antwort braucht man erfahrungsgemaess nicht
zu hoffen, die Anmerkung im Bug-Report-Formular, dass man nur
kontaktiert wird, wenn es wirklich notwendig ist, ist also
begruendet.
Bewerten
- +