Backdoor in der Festplattenverschlüsselung (verifiziert)

  • Hi,


    im Rahmen einer Sicherheitsanalyse meiner Qnap 239 habe ich herausgefunden, dass ein Backupkey für die Festplattenverschlüsselung ins Flash gespeichert wird.
    Somit kann jemand mit Zugriff aufs Flash (braucht admin shell Zugang) ohne einen Passphrase Zugang zur verschlüsselten Platte bekommen.


    Eine genaue Beschreibung habe ich ins QNAP Forum gepostet:
    http://forum.qnap.com/viewtopic.php?f=11&t=18863


    kann jeder für sich ausprobieren und verifizieren ...

  • Hallöle,


    es wäre ausgesprochen nett, wenn Du Deinen englischen Beitrag hier in deutsch posten würdest, da leider nicht jeder der englischen Sprache mächtig ist und weil es halt das deutsche Forum ist.


    Für den Inhalt ein fettes Dankeschön :thumb:


    Grüße
    Jody


    EDIT:


    Wenn mich meine Linuxkenntnisse nicht täuschen, müsste ich doch mit "grep ENCK /dev/sdx6" doch den Inhalt von ENCK sehen können, unabhängig davon was drin steht, oder? (Sorry meine Linuxkenntnisse sind etwas eingerostet..) Alles hinter dem ersten "|"-Pipesymbol dient doch nur dazu den String zuzuschneiden, umzudrehen und in die Datei "testkey" zu schreiben, oder?


    Grüße
    Jody

  • Zitat von "jody"

    Wenn mich meine Linuxkenntnisse nicht täuschen, müsste ich doch mit "grep ENCK /dev/sdx6" doch den Inhalt von ENCK sehen können, unabhängig davon was drin steht, oder? (Sorry meine Linuxkenntnisse sind etwas eingerostet..) Alles hinter dem ersten "|"-Pipesymbol dient doch nur dazu den String zuzuschneiden, umzudrehen und in die Datei "testkey" zu schreiben, oder?


    Ja genau.
    so ungefähr sieht der output dann aus:


    # grep ENCK /dev/sdx6
    ENCK=ABCDEFGHIJKLMNOPQRSTUVWXYZ12345


    Die Keydatei muss dann folgenden Inhalt haben:
    543210ZYABCDEFGHIJKLMNOPQRSTUVWX
    (ohne Zeilenvorschub am Ende)
    Und dafür ist dann der "awk" Befehl und das kleine perl Skript da.


    So ist es bei meiner TS-239.
    Im Binärcode gab es auch Pfadmöglichkeiten, in dem der ENCK Output ohne die Byteverschiebungen benutzt wird, sondern genau so wie im ENCK abgebildet. Bei mir braucht es allerdings das Verschieben.

  • So, hier nochmal der Text in Deutsch, etwas verkürzt:


    Im Rahmen einer eigenen Sicherheitsüberprüfung des TS-239 Firmware Software, um zu schauen dass die Verschlüsselung wirklich sicher ist, habe ich eine Hintertür entdeckt, die es ermöglicht, für jemanden der Zugriff zum Flash des Geräts hat (also admin shell Zugriff), die verschlüsselten Laufwerke ohne den Passphrase des Besitzers zu entschlüsseln.


    Es wird ein Backup Key generiert und im Im Flash abgelegt.
    Der folgende Code benutzt die Hintertür:


    der folgende Code braucht perl für die Stringmanipulation. Perl ist normal nicht installiert, ausser wegen Squeezeboxserver (/share/MD0_DATA/SSODS/bin/perl) oder als ipkg Paket installiert. In diesem Fall dann entweder den perl Skript Teil auf einem anderen System ausführen, oder per Hand machen - wie es geht steht weiter unten

    Code
    [/] # grep ENCK /dev/sdx6 | awk -F= '{print$2}' | perl -e '$in=<STDIN>;$tmp1=substr($in,0,24);$tmp2=reverse(substr($in,24,8));print $tmp2 . $tmp1;' > /tmp/testkey[/] # /sbin/cryptsetup luksOpen /dev/md0 md0 --key-file=/tmp/testkeykey slot 0 unlocked.Command successful.


    Erklärung:
    Der Backdoor Schlüssel ist in der ENCK Variable im Flash abgelegt ("grep ENCK /dev/sdx6"). Eine einfache Stringmanipulation muss dann noch durchgeführt werden, dann ist der Key gültig:
    Key in ENCK : ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
    Key nach Stringmanipuation: 543210ZYABCDEFGHIJKLMNOPRQSTUVWX
    Der fertige Key muss ohne Zeilenvorschub in der Datei stehen.
    Und das ist schon alles.


    Zur Vollständigkeit: wenn mal jemand sein Cryptolaufwerk an einem anderen Linux/Windows system mounten will, geht das so:

    Code
    #[b]Der Code braucht ein funktionierendes crypt Kommando, das md5 unterstützt. Auf der Qnap ist das nicht installiert, daher muss das auf einem anderen Linux system gemacht werden. Oder es gibt bestimmt auch web interfaces im Internet[/] # crypt '$1$YCCaQNAP$' 'yourpassphrase' | tr -d '\n' > /tmp/testkey[/] # /sbin/cryptsetup luksOpen /dev/md0 md0 --key-file=/tmp/testkeykey slot 1 unlocked.Command successful.


    der Befehl "tr -d '\n'" entfernt lediglicht den Zeilenvorschub am Ende


    Hier ist der code für ein crypt Kommando im Eigenbau:


    Hoffentlich wird die Backdoor schnellstens entfernt vom Hersteller.
    Bis dahin: den ENCK key sich sichern und im Flash mit einem anderen Wert überschreiben, oder den Keyslot 0 löschen.

  • Hallöle,


    erstmal vielen Dank für die Übersetzung! :thumb:


    Nachdem ich das ganze hier gelesen (& hoffentlich auch verstanden habe) konnte ich dieses "Hintertürchen" auf meiner 639 nicht verifizieren.
    Zur Zeit benutze ich die FW TS-639_3.1.0_Build0627.
    Dies schließt jedoch nicht aus, das es auf anderen Systemen genauso ist!


    Danke nochmals und Grüße
    Jody

  • dann schau mal was anders ist.
    gibt es ENCK im flash? (bzw. vl. heisst dein flash auch anders)


    hast du den string so wie er ist, wie auch in der umgebauten variante probiert?


    wird überhaupt luks benutzt und ist der backup key registriert? (cryptsetup luksDump DEVICE ... device ist wahrscheinlich /dev/md0 ... wenn nur ein keyslot aktiv ist - gut, wenn zwei aktiv sind - backup schlüssel)


    wenn es zwei aktive keyslots gibt, aber du entweder den key im flash nicht findest oder aber das umbauen des strings nicht geht, dann schick mir mal folgende dateien:
    /usr/lib/libuLinux_Storage.so
    /usr/lib/libuLinux_Util.so
    und dann schau ich wie das in deiner version funktioniert.

  • Hallöle,


    soweit ich gestern Abend damit rumgehext habe, befand sich das Flash an genau der Position die Du angegeben hast,
    jedoch konnte ich dort kein "ENCK" finden.


    Zu luks kann ich gar nichts sagen :(


    Ich kann jedoch sagen, dass ich zwei Volumes verschlüsselt habe und die Key's nur im Kopf habe ;)


    Wenn ich wieder Zugriff auf mein NAS habe, werde ich mal die gewünschten Dateien suchen und hier posten.


    Grüße
    J :D dy


    EDIT:


    So, hier sind nun die Files...

  • Dein Code ist genau der gleiche.
    Warum der Backup Key nicht angelegt wurde ist mir allerdings nicht klar, vielleicht kam die "Funktionalität" ja später in die Firmware rein.


    Diverse Funktionen sieht wie folgt aus:
    Die Funktion "Create_Key_File" generiert das temporäre Keyfile in /tmp, diese ruft um den Key auszulesen die Funktion Get_Key_File auf.
    In Get_Key_File wird dann das Flash ausgelesen, und nach dem ENCK= Eintrag gesucht - den Teil des Dissassemblies habe ich mal als Screen Capture angehängt. Da sieht man es.
    (Oben wird "Get_Flash_Config" aufgerufen, danach mit strtok der jeweils nächste Eintrag im Flash gesucht, und schliesslich (unten im bild) vergleicht strncmp den Eintrag mit dem Wert ENCK - nicht mehr im Screen Capture ist wie der Wert von ENCK mit strcpy kopiert und ggf. umgewandelt wird)


    Und die Funktion Create_Key_File wird aufgerufen von ner Menge Funktionen:
    Open_Encrypt_Dev_With_Key_Flag, Add_Key_Encrypt_Dev, Add_Extra_Key_Encrypt, etc.


    Hilfreich wäre es, wenn du den Output von
    /sbin/cryptsetup luksDump /dev/md0 (oder was immer auch deine devices sind, bei mir ists /dev/md0 wegen Raid1)
    postest.

  • @ jody


    alles was du machen musst ist einloggen und dann folgenden befehl ausführen mit dem richtigen partitionsziel:
    /sbin/cryptsetup luksDump /dev/md0 (oder was immer auch deine devices sind, bei mir ists /dev/md0 wegen Raid1)


    luks ist installiert (damit wird ja deine parition verschlüsselt) und mit dem befehl wird die konfiguration ausgelesen, also ob 1 oder 2 keys gesetzt sind.

    Einmal editiert, zuletzt von christian () aus folgendem Grund: Zitate bitte kurz halten!

  • Hallöle,


    da ich nicht genau weiß, was sich aus der Infoformation herleiten lässt, Habe ich die Ausgabe hier "editiert":


    Ich hoffe es hilft Dir dennoch weiter..
    Grüße
    Jody

  • Zitat von "jody"
    Code
    LUKS header information for /dev/md0
    Key Slot 0: ENABLED
    ...
    Key Slot 1: ENABLED
    ...
    Key Slot 2: DISABLED
    Key Slot 3: DISABLED
    ...


    Ich hoffe es hilft Dir dennoch weiter..


    ja, tut es. du hast die backdoor auch drinnen.
    wie du siehst gibt es zwei keyslots die enabled sind. Keyslot 1 ist deine Passphrase, Keyslot 0 ist der Backup Key.
    Und der Key muss im Flash sein - zumindest soweit ich den Binärcode analysiert habe.
    schau mal ob du ein tool findest was gut in binärdaten suchen kann, denn grep findet nicht immer Textstrings darin.
    oder z.b. ein "cat /dev/sdx6 > /share/md0/Public/flash", die Datei auf dein Windows/Linux kopieren, und dann mit nem hexeditor gucken ob der ENCK key auftaucht.

  • Hallöle,


    also ich habe den Teil mit ENCK=Zeichenfolge gefunden, wenn ich den String jedoch umdrehe,
    kommt da alles andere, nicht jedoch meine Passphrase heraus....


    oder habe ich etwas übersehen?


    Grüße
    Jody

  • Zitat von "jody"

    Hallöle,


    also ich habe den Teil mit ENCK=Zeichenfolge gefunden, wenn ich den String jedoch umdrehe,
    kommt da alles andere, nicht jedoch meine Passphrase heraus....


    oder habe ich etwas übersehen?


    äh ja. du hast meinen ursprünglichen post überhaupt nicht kapiert ;)
    der ENCK ist ein ZUSÄTZLICHER Schlüssel, der hat gar nichts mit deinem zu tun.
    er öffnet nur eben auch deine verschlüsselte partition.


    den ENCK nimmst du, und das ABCDE ... steht jetzt einfach als beispiel für die position von dem ENCK key:
    Key in ENCK : ABCDEFGHIJKLMNOPQRSTUVWXYZ012345
    Key nach Stringmanipuation: 543210ZYABCDEFGHIJKLMNOPRQSTUVWX


    wenn du den string nach der stringmanipulation hast, dann machst du
    # echo -n "der string nach dem vertauschen des positionen" > /tmp/testkey
    # /sbin/cryptsetup luksOpen /dev/md0 md0 --key-file=/tmp/testkey


    das -n beim echo befehl schreibt den text ohne den zeilenvorschub.
    wenn die Ausgabe von cryptsetup dann
    key slot 0 unlocked.
    Command successful.
    dann siehst du dass der backup schlüssel funktioniert. kommt eine fehlermeldung - dann hast du etwas falsch gemacht, denn der funktioniert garantiert ;)



    Der fertige Key muss ohne Zeilenvorschub in der Datei stehen.

  • Zitat von "marc_marc"


    äh ja. du hast meinen ursprünglichen post überhaupt nicht kapiert ;)


    Also ich kann Dich auch nicht leiden, aber ich würde das nie so "laut" schreiben ;)


    Ohne Deine Beschreibung gestest zu haben, würde mich jetzt eigentlich nur interessieren, wie ich den Wert so überschreiben kann,
    dass er nicht mehr als "Zweitschlüssel" dienen kann, ich jedoch trotzdem an die Daten komme (mit meinem Key)


    Grüße
    Jody

  • Zitat von "jody"

    Ohne Deine Beschreibung gestest zu haben, würde mich jetzt eigentlich nur interessieren, wie ich den Wert so überschreiben kann,
    dass er nicht mehr als "Zweitschlüssel" dienen kann, ich jedoch trotzdem an die Daten komme (mit meinem Key)


    Dazu musst du entweder mit deinem Passphrase mit dem C Programm was ich in der Beschreibung gepostet habe ein valides Keyfile erzeugen, oder du machst aus dem ENCK Key durch die Zeichenumstellung den Backup key.
    Je nachdem welchen Key du also erzeugst ist es einer folgenden beiden Befehlen:


    /sbin/cryptsetup luksRemoveKey /dev/md0 /tmp/key_from_flash
    oder
    /sbin/cryptsetup luksKillSlot /dev/md0 0 --keyfile=/tmp/key_from_passphrase


    Gruss,
    Marc

  • Heute abend kam Email von Qnap:
    Sie haben versprochen nächsten Monat ein Firmware Update herauszubringen, dass die Backdoor entfernt.
    Ich werde dann prüfen, ob das wirklich der Fall ist.

  • Hallöle,


    sorry, war die letzten Tage etwas verhindert....
    Tja, was soll ich sagen... ich werde wohl auf das Update und Dein Statement dazu warten :thumb:


    Grüße
    Jody

  • I habe mal auf die schnelle die neue Firmware v3.1.2 Build1014 angeschaut.
    Das Firmware Update entfernt die Backdoor aus dem Crypto Volume und aus dem Flash.


    The grundsätzliche Code, der die Backdoor erzeugt etc. ist allerdings noch vorhanden. Ob die Programmierer da einfach ein "if (1 == 0) ..." vor die Backdoor gesetzt haben, eine neue Backdoor reinprogrammiert haben oder was auch immer - das zu prüfen habe ich leider momentan keine Zeit :(


    Was auf jeden Fall nicht OK ist, das ganze als "Provide Enhanced AES-256 encryption in data security" in der Update Beschreibung zu verstecken.

  • ...oder ein "if (whoami != marcmarc)" *g*...


    mich wundert es, dass dieses extrem wichtige Thema so wenig Beachtung findet.


    Auf jeden Fall vielen Dank an dich, marcmarc für die Mühe! Großartige Arbeit!