Skip to content

where - Das find des armen Windows Mannes

Ich gebe zu, ich benutze Windows. Sogar relativ gerne. Das liegt vor allem daran, dass ich es satt bin an meinem Desktop herumzuspielen (und keinen Zugang zu Macs habe). Aber als Linux developer kenne ich natürlich auch die Stärke einer Shell und der CLI tools. Deswegen habe ich auch immer ein Cygwin installiert so dass ich tools with find und grep nutzen kann. Ich finde die Windows Powershell sehr interessant und mächtig, bin es aber nicht gewohnt diese zu nutzen.

Deswegen lande ich auch oft in einem klassischen Windows Prompt (und ich nutze ConEmu um das erträglich zu machen). Ein Windows command das man auf jeden Fall kennen sollte ist where: es ist eine Kobination aus find, which und locate und erlaubt die Suche nach Files in Verzeichnissen oder Suchpfaden:


Suche ausführbare Befehle

Ohne zusätzliche Option durchsucht where das aktuelle Verzeichnis und den PATH. Das wird dazu benutzt um Befehle zu finden, dabei sind Suchmuster möglich:

C:\WINDOWS\system32>where java*
C:\Windows\System32\javaws.exe
C:\ProgramData\Oracle\Java\javapath\java.exe
C:\ProgramData\Oracle\Java\javapath\javaw.exe
C:\ProgramData\Oracle\Java\javapath\javaws.exe
C:\Program Files\Java\java-1.8.0-openjdk-1.8.0.111-1\bin\java-rmi.exe
C:\Program Files\Java\java-1.8.0-openjdk-1.8.0.111-1\bin\java.exe
C:\Program Files\Java\java-1.8.0-openjdk-1.8.0.111-1\bin\javac.exe
C:\Program Files\Java\java-1.8.0-openjdk-1.8.0.111-1\bin\javadoc.exe
C:\Program Files\Java\java-1.8.0-openjdk-1.8.0.111-1\bin\javah.exe
C:\Program Files\Java\java-1.8.0-openjdk-1.8.0.111-1\bin\javap.exe
C:\Program Files\Java\java-1.8.0-openjdk-1.8.0.111-1\bin\javaw.exe

Rekursive Suche

Um Dateien mit einem Suchmuster unterhalb eines Pfades zu suchen verwendet man die /r option. Mit der /t option gibt where dann gleich noch ein paar Datei Details aus:

C:\>where /T /R c:\Windows\System32 *.cmd
    843   30.10.2015   08:17:50  c:\Windows\System32\onlinesetup.cmd
    199   30.10.2015   08:17:43  c:\Windows\System32\winrm.cmd

Scripting Hilfe

Zudem gibt es noch seziellen Such Syntax, so kann ich alle in einer Environment Variable enthaltenen Verzeichnisse durchsuchen:

C:\>where $PATH:java
C:\ProgramData\Oracle\Java\javapath\java.exe
C:\Program Files\Java\java-1.8.0-openjdk-1.8.0.111-1\bin\java.exe

Oder aber in einer Liste von Verzeichnissen suchen:

C:\>where "C:\Windows\system32;C:\Windows\SysWOW64":mode
C:\Windows\System32\mode.com
C:\Windows\SysWOW64\mode.com

itblog Wiederbelebt

Nach unserem Server Umzug konnte ich mein Blog wiederbeleben. Zum Glück war der Update der Serendipity Blog Software so einfach, dass ich erst mal nicht die Platform wechseln werde (es gibt aber noch kleinere Probleme mit dem Syntax Highliter).

4096bit RSA Keys mit OpenPGP 2.1 Smartcards

Ich bereite die Einführung einer PGP PKI vor. Dazu habe ich mir ein paar Crypto Hardware Artikel beschafft und werde hier meine Erfahrungen verbloggen. Anfangen möchte ich mit den OpenPGP 2.1 Cards (von Zeitcontrol via Cryptoshop). Die Karten lassen sich direkt in dem connected Smart Card reader meines betagten Dell Latitude E6510 unter Windows 7 ansprechen. Dabei kommt der eingebaute Broadcom Reader zum Einsatz:

c:\Program Files\OpenSC Project\OpenSC\tools>opensc-tool -v -l
# Detected readers (pcsc)
Nr.  Card  Features  Name
0    Yes             Broadcom Corp Contacted SmartCard 0
     3b:da:18:ff:81:b1:fe:75:1f:03:00:31:c5:73:c0:01:40:00:90:00:0c CryptoStick v1.2 (OpenPGP v2.0)

c:\Program Files (x86)\GNU\GnuPG>gpg2.exe --card-status
Application ID ...: D27600012401020100050000xxxx0000
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 0000xxxx
Name of cardholder: Bernd Eckenfels
Language prefs ...: en
Sex ..............: männlich

Läßt sich also ohne Probleme sowohl mit OpenSC 0.15.0 Win64 sowie GnuPG 2.0.29 (GPG2Win 2.3.0) ansprechen. Ich konnte mit dieser Kombination auch 3072bit RSA Schlüssel erstellen und nutzen. Problematisch wird es allerdings wenn man 4096bit RSA Schlüssel nutzen möchte. Die Karten bieten diese Option an (deswegen habe ich sie auch ausgewählt). Leider kann der eingebaute Reader keine Extended-APDU, somit schlägt der Versuch fehl entsprechende Keys zu erzeugen (eigentlich sollte er die Keys erzeugen können aber es sieht danach aus dass die anschliessende Übertragung fehlschlägt:

tools> openpgp-tool -r 0 -v --verify CHV3 --pin 12345678 --gen-key 1 --key-len 3072
Connecting to card in reader Broadcom Corp Contacted SmartCard 0...
Using card driver OpenPGP card.
Fingerprint:
9DA81881C7139920120ABBF8C50BD95C 9A7C7684

tools> openpgp-tool -r 0 -v --verify CHV3 --pin 12345678 --gen-key 1 --key-len 4096
Connecting to card in reader Broadcom Corp Contacted SmartCard 0...
Using card driver OpenPGP card.
... multiple minutes later...
Failed to generate key. Error Transmit failed.

c:\Program Files (x86)\GNU\GnuPG> gpg2.exe --card-status
Application ID ...: D27600012401020100050000xxxx0000
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 0000xxxx
Name of cardholder: Bernd Eckenfels
Language prefs ...: en
Sex ..............: männlich
URL of public key : [nicht gesetzt]
Login data .......: [nicht gesetzt]
Signature PIN ....: nicht zwingend
Key attributes ...: 4096R 4096R 4096R
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
...

Ach ja übrigens, noch ein paar Anmerkungen: Es ist wichtig gpg2.exe (nicht gpg.exe) zu verwenden, bei PGP4Win werden beide binaries in unterschiedlichen Versionen parallel installiert. Bei gpg2 muss man darauf achten dass es auf einige Hintergrundprozesse angewiesen ist (pinentry und scdaemon). Das kann schon mal zu Verwirrungen führen (z.b. Unter älteren Linux Varianten kann sich wohl ein Gnome daemon als pgp-agent ausgeben und dann smartcard befehle abweisen. Mit gpg-connect-agent -v und dem Befehl SCD GETINFO version lässt sich prüfen welcher Agent verwendt wird. In meinem Setup hängt sich auch die GPA artenverwaltng auch, habe noch nicht herausgefunden woran dies liegt.

Mit der Verwendung eines externen USB Readers der Extended APDU unterstützt (Gemalto IDBridge Ct710) lässt sich der 4096bit Key erstellen und nutzen:

c:\Program Files\OpenSC Project\OpenSC\tools>opensc-tool -v -l
# Detected readers (pcsc)
Nr.  Card  Features  Name
0    Yes             Broadcom Corp Contacted SmartCard 0
     failed: Card not present
1    Yes   PIN pad   Gemalto IDBridge CT7xx 0
     3b:da:18:ff:81:b1:fe:75:1f:03:00:31:c5:73:c0:01:40:00:90:00:0c CryptoStick v1.2 (OpenPGP v2.0)

c:> echo debug-all > C:\users\eckenfel\AppData\Roaming\GnuPG\scdaemon.conf
c:> echo log file c:/temp/scdaemon.log >> C:\users\eckenfel\AppData\Roaming\GnuPG\scdaemon.conf
c:> echo reader-port "Gemalto IDBridge CT7xx 0" >> C:\users\eckenfel\AppData\Roaming\GnuPG\scdaemon.conf

c:\Program Files (x86)\GNU\GnuPG> gpg2 --card-edit -v

Application ID ...: D27600012401020100050000xxxx0000
Version ..........: 2.1
...
gpg/card> admin
gpg/card> generate
Make off-card backup of encryption key? (Y/n) n

gpg: NOTE: keys are already stored on the card!

Replace existing keys? (y/N) y
What keysize do you want for the Signature key? (3072) 4096
The card will now be re-configured to generate a key of 4096 bits
What keysize do you want for the Encryption key? (3072) 4096
The card will now be re-configured to generate a key of 4096 bits
What keysize do you want for the Authentication key? (3072) 4096
The card will now be re-configured to generate a key of 4096 bits
...
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
gpg: writing self signature
gpg: RSA/SHA256 signature from: "CE551545 [?]"
gpg: writing key binding signature
gpg: RSA/SHA256 signature from: "CE551545 [?]"
gpg: writing key binding signature
gpg: RSA/SHA256 signature from: "CE551545 [?]"
gpg: writing key binding signature
gpg: RSA/SHA256 signature from: "CE551545 [?]"
gpg: writing key binding signature
gpg: RSA/SHA256 signature from: "CE551545 [?]"
gpg: writing public key to `C:/Users/eckenfel/AppData/Roaming/gnupg/pubring.gpg'
gpg: writing secret key stub to `C:/Users/eckenfel/AppData/Roaming/gnupg/secring.gpg'
gpg: using PGP trust model
gpg: key CE551545 marked as ultimately trusted
public and secret key created and signed.

pub   4096R/CE551545 2016-06-05 [expires: 2016-06-06]
      Key fingerprint = 1C93 E95E 0486 C55C 0762  3629 20CC CA05 CE55 1545
uid       [ultimate] Bernd Eckenfels (test) <test@test>
sub   4096R/F738D4AE 2016-06-05 [expires: 2016-06-06]
sub   4096R/309D4991 2016-06-05 [expires: 2016-06-06]

Das Erstellen von 3 Schlüsseln (inkl. Signaturen, ohne Encryption Key backup - d.h. auch auf der Karte erstellt) mit 4096 bit dauert (stark schwankend) 30 Minuten, die selbe Prozedur mit 3072 bit Schlüssel erfolgt in 8 Minuten.

Bei der Erstellung der Schlüssel gibt pgp2 wenige Zwischenschritte aus, man kann das ganze aber im scdaemon logfile nachvollziehen. Wie oben zu sehen war es auch notwendig den Klartext Namen des externen Card Readers zu konfigurieren, scdaemon hat reader-port 1 oder reader-port 32769 (trotz Neustart) schlichtweg ignoriert. Auch wenn der richtige Reader verwendet wird scheint die Debug Ausgabe nur den Slot des Readers aber nicht den gewählten Reader auszugeben:

scdaemon[14808] Handhabungsroutine f³r fd -1 gestartet
scdaemon[14808] detected reader `Broadcom Corp Contacted SmartCard 0'
scdaemon[14808] detected reader `Gemalto IDBridge CT7xx 0'
scdaemon[14808] detected reader `'
scdaemon[14808] reader slot 0: not connected

Bei der Key-Erstellung hat gnupg2 das externe Keypad des Gemalto readers für die PIN Eingabe (noch) nicht benutzt.

Falschfarben und hängende Eingabe bei Samsung Galaxy Tab 3 10.1 reparieren

Ich habe schon längere Zeit ein Samsung Galaxy Tab 3 10.1 (GT-P5200). Das Gerät ist den ganzen Tag im Einsatz. Nach einem etwas unfreiwilligen Sturz auf das Laminat zeigte das Tab nur noch sehr grob-pixelige Bilder in Falschfarben an. Das scheint ein relativ weit verbreitetes Problem bei den Geräten zu sein. Leider gab es in den diversen Foren keine wirkliche Hilfe (es ist jedenfalls nicht die "Inverted Screen" Android Funktion für erleichterte Bedienung). Meine Hoffnung war eine lockere Steckverbindung, und so habe ich mich dran gemacht das Gerät selbst zu inspizieren.

Zuerst habe ich ein Youtube Video gefunden bei dem beschrieben wird, wie man den Akku in dem Tab austauscht. Das war sehr hilfreich, dort kann man nämlich erkennen wie man das Gehäuse öffnet. Entgegen meiner ersten Annahme hebelt man es von der Vorderseite aus auf. Leider habe ich nicht das gezeigte Plastikwerkzeug, aber mit einem Messer oder flachen Schraubendreher ist es recht einfach den Rand nach außen zu heben und das Innenleben anzuheben. Im Wesentlichen muss man nur darauf achten nicht zu tief einzustechen.

Nach dem Öffnen sieht man auch gleich drei Flachbandkabel. Zwei davon sind für Display und Digitizer zuständig, das dritte führt zu der USB Buchse. Auf dem linken braunen Kabel befindet sich die Bezeichnung MCF-101* - dies ist das Kabel für den Touch Digitizer. Das ist besonders empfindlich da es mehrere Stiftreihen hat. Das rechte schwarze Kabel (ST1_LCD*) ist für die Anzeige.

Wie im Video gezeigt (TC 4:45:00) muss man zuerst die Klebestreifen ablösen, dann einen kleinen Bügel anheben und kann dann die Kabel herausziehen oder wieder ordentlich einstecken. Hat das Display Kabel Kontatprobleme kommt es zu Anzeigefehlern, beim Digitizer reagieren einzelne Bereiche nicht auf Touch oder die Auswahl springt.


Tab InnenlebenIch hatte mehrere Versuche benötigt weil ich zunächst das falsche Kabel gelöst hatte. Am Ende war es dann aber recht einfach. Beide Kabel habe ich mit neuen Klebestreifen fixiert. Ich würde empfehlen das Gerät vor dem Verkleben oder Zusammenbau auszuprobieren (dabei nie auf die Elektronik fassen).

Meine Vermutung ist dass eine Erschütterung des Gerätes sich auf die Kabel auswirkt weil diese über den schweren Akku verlaufen, dort teilweise sogar festgeklebt sind. Ich habe entsprechend vermieden die Kabel mit dem Akku zu verkleben.

Facebook messages mit Jitsi nutzen

Facebook bietet (noch) an auf Chat Messages mittels XMPP clients zuzugreifen. Jitsi ist ein Messenger, Sprach- und Video-Konferenz Client, der unter anderem für Facebook Chats schon vorbereitet ist.Als Java Anwendung kann er unter Windows, Linux und OS X genutzt werden.

Um Facebook in Jitsi zu nutzen fügt man ein neues Konto mit dem Typ des Netzwerks  "Facebook" aus, und muss dann nur noch Benutzername und Passwort eingeben. Allerdings sollte man beachten, vorher einen Nutzernamen in den Facebook Einstellungen angelegt zu haben.

Ist das eigene Facebook Konto mit einem Codegenerator oder einer Anmeldebestätigung gesichert (was sehr zu empfehlen ist), so lehnt der Facebook XMPP Server die Anmeldung ohne weitere Begründung ab (evtl. wird eine SMS mit XMPP Login Passwort verschickt). In diesem Fall muss ein spezielles Anwendungspasswort erstellt werden. Das ist schon alleine deswegen sinnvoll weil diese Passwörter die auf Rechnern hinterlegt sind getrennt von Konto Passwort verwaltet werden können.

In der Facebook Titelleiste auf den Menu Pfeil clicken, dann auf Einstellungen gehen. In der folgenden Seite den Benutzername prüfen und ggf anlegen.


Dann in der linken Menuleiste auf Sicherheit wechseln, dort "Anwendungspasswörter" bearbeiten, hinter dem "generieren" Link findet sich ein kleiner Dialog.

Dieser fragt nach dem Facebook Anmeldepasswort und dann kann man einen frei gewählten Namen für das Passwort eingeben kann (z.B. "Jitsi auf Notebook").

Dann wird ein zufälliges Passwort angezeigt, dieses kann man in Jitsi verwenden.

 In Jitsi ist zu beachten dass der Screen in der Deutschen Version ein Feld namens "E-Mail" hat, dort ist aber der Benutzername einzugeben (Issue#155).

Ein Vorteil der Anwendungspasswörter ist es übrigens, dass man diese widerrufen kann (falls jemand Hoffnungen hatte).

Password hashing in Oxwall (PHP password_hash)

While planning a new social network installation for the customer community of my employer I came across Oxwall as a possible solution. It is an Web application on the PHP/MySQL stack which allows self-hosted communities. It runs with a small footprint on about any web server hosting platform and provides a simple Forum, Chat, Event Stream, User Blogs and Profiles and similar functions. This is a very good fit to our needs (as we have to migrate away from the old Mixxt hosted community platform).

First we had a look a Ning, but as a Company located in Germany it is always complicated to host user-facing systems on US systems. Especially since EU and German data protection regulations for personal identifiable items might apply in this area. So if we cannot find a good German social network provider, we will consider hosting the application in our own data centers.

But before we invite out valuable customers to register on such a platform we do need to make sure their data stays safe. This is a business oriented social platform, so we do not really expect critical top secret information, but we do want to protect the most sensitive information, the users passwords. If you look at recent events in the media this is more than important. Thousands of cracked accounts and millions of leaked password hashes are available on the net. Even technology giants like Sony are not safe from being hacked. So it is absolutely important we protect our users and therefore our reputation - even for a simple application like a forum.

Oxwall password hashing

For this reason I reviewed a few security aspects of Oxwall (1.7.2), and want to talk here especially about how it stores user passwords.

Oxwall stores password hashes in the ow_base_user table in the password column as a 64-digit lower-case hex string. It represents the SHA-256 hash of the static OW_STATIC_SALT pepper concatenated with the user's password. This is all done in the hash_password($password) function, the relevant code looks like:

./ow_system_plugins/base/bol/user_service.php:884:        return hash('sha256', OW_PASSWORD_SALT . $password);

OW_PASSWORD_SALT (which is actually a static pepper) is a 13 digit hex string generated at installation time and stored in ow_includes/config.php. It is generated with the PHP uniqid() function (current time in milliseconds in hex). This is not a very strong secret, but you can of course overwrite it (keep in mind, this will invalidate all existing password hashes).

In order to verify a password Oxwall uses the isValidPassword($userid, $password) function, which will SHA-256 hash the provided password (one iteration) and compare it to the stored hash with PHP's === operator (which is not a constant time string comparision operation).

Oxwall does by the way enforce a minimum and maximum password length. The PASSWORD_MAX_LENGTH = 15 and PASSWORD_MIN_LENGTH = 4.

Oxwall Password Protection Evaluation

There are a number of problems with this:

By using a static salt (better known as pepper) all users who have the same password have the same hash (in one Oxwall installation). It also means an attacker can prepare a bit better for attacks, as they can check all user passwords with the same pre-compiled table. A globally unique salt for each password hash should be preferred to this.

By not using a format specifier algorithm flexibility is limited. Oxwall would have to test old and new algorithms (or guess based on the length of the encrypted string).

Although SHA-2 is more complex to calculate compared to DES, SHA-1 or MD5 it is still a comparable fast operation which can be easily optimized in hardware. This is no longer regarded as a safe protection. Instead it is better to have an iterated algorithm (and optionally memory complexity).

The current function for verifying the password hash is not implemented with a constant-time comparison method. This means it could leak some information on the password hashes to remote attackers.

If you compare this with other PHP applications it is not a bad implementation, but it is surely not state of the art anymore. Oxwall really should aim for a modern implementation.

There is absolutely no reason to limit the length of a password to 15 characters. It can be even longer than the hash function. I would remove that limit or at least increase it to a sane value like 100 (or 128 if you want to look techy :). Oxwall should invest some more work into encouraging users to have safe passwords. This can include hooks to check for bad passwords. The current minimum of 4 characters is quite low (and it would be good if one can configure it without changing the code).

Modern PHP password hashing

Luckily PHP 5.5 is providing a password_hash() function. And if you cannot wait for it, there is a compatibility library from Anthony Ferrara which can be used on 5.3. The function supports generating random salts, it uses BCRYPT algorithm by default and uses the standard $2y$... hash format.

I feel it is a bit unfortunate, that PHP does not support an additional pepper argument (in the default implementation). It argues, that there is no official analysis how much additional protection it brings.

The RFC comments, that it is possible to encrypt the hashes in your database (with a pepper). This would add the protection, but it generates additional work. The pepper Oxwall is using is rather low entropy, so I think it is best to just drop it. This will also reduce the risk of losing this value.

Oxwall should use the password_hash function, not specify salt or cost parameters and implement the rehash checks, to make sure it automatically rehashes passwords whenever PHP modifies the settings.

SSL Verkehr überwachen

Im letzten Artikel (zur Poodle Lücke) habe ich die klare Empfehlung ausgesprochen SSL 3.0 (und 2.0 sowieso) abzuschalten, wenn es nicht mehr benötigt wird. Hier stellt sich natürlich sofort die Frage: "gibt es noch kritische Verwender von SSL3 in meinem Netz".

Für die Unternehmens-IT kann das eine relativ komplizierte Angelegenheit werden die Owner aller Anwendungen zu befragen. Die Anwendungen zu ermitteln (einfach die Liste der freigeschaltenen Ports in der Firewall durchgehen) ist noch relativ einfach, ob aber die Befragten die Antwort kennen (oder die Frage verstehen) ist eine ganz andere Sache.

SSL Log im Apache aktivieren

Dazu kommt noch das Problem dass in jeder Anwendung die Art und Weise wie man die verwendeten SSL Protokolle sehen kann unterschiedlich ist. Teilweise ist die Funktion nicht aktiviert oder lässt sich nur mit vielen zusätzlichen Debug Meldungen einschalten.

Bei einem Apache httpd ist es eigentlich zwingend das erweiterte SSL Log Format "combinedssl" immer zu verwenden:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x" combinedssl
CustomLog /var/log/httpd/access.log combinedssl

Es ist praktisch, wenn die SSL/TLS Terminierung an möglichst wenigen Stellen erfolgt. Zum Beispiel einen Cluster aus Reverse Proxies oder Load Balancern. Und natürlich sollte für diese Dienste ein entsprechendes Log bereitstehen.

tls-hello-dump

Aber nicht immer gibt es diese Möglichkeit (für alle Anwendungen). Insbesondere nicht bei Client Verbindungen. Es kann von daher notwendig sein auf Netzwerkebene den Datenstrom zu überwachen und eine Statistik zu erstellen (oder die IP Addressen der notorischen SSL3 Verwender manuell nach zu püfen. Es könnte ja auch der unternehmenskritische Bestellfluss des größten Auftraggebers sein). Ich vermute mal ein gutes Network Intrusion Detection System (NIDS) kann diese Statistiken liefern. Ist eine solche Klassifizierung des Traffics aber nicht gegeben, so beginnt die Suche nach einfachen Tools.

Mit tcpdump oder vergleichbaren Sniffern muss man recht viel selbst bauen. Auch ssldump ist hier recht sperrig (und auch nicht sehr aktuell). Das einfachste Tool was ich bisher gefunden habe ist tls-hello-dump von Georg Lukas. Es schreibt pro Handshake 2 Zeilen, eine für die vorgeschlagenen Ciphers des Clients (ClientHello) und eine für die vom Server angenommenen Parameter (ServerHello). Es setzt auf libpcap auf, kann somit auf Linux/FreeBSD einfach eingesetzt werden. Es kann sowohl Verbindungen an das lokale System überwachen als auch Netzwerktraffic (solange der Host auf dem tls-hello-dump läuft am Netzwerkport der in PROMISC geschaltet ist alle Daten sieht).

Hier als Beispiel ein Chrome38/Apache2.2 Handshake sowie ein (unbeantworteter) openssl s_client -ssl3 -connect versuch:

109.192.117.164 195.49.138.57   TLSv1 ClientHello TLSv1.2 :CC14:CC13:
  C02B:C02F:009E:C00A:C009:C013:C014:C007:C011:0033:0032:0039:009C:
  002F:0035:000A:0005:0004:

195.49.138.57   109.192.117.164 TLSv1.2 ServerHello TLSv1.2 cipher C02F

109.192.117.164 195.49.138.57   SSLv3 ClientHello SSLv3 :C014:C00A:C022:
  C021:0039:0038:0088:0087:C00F:C005:0035:0084:C012:C008:C01C:C01B:
  0016:0013:C00D:C003:000A:C013:C009:C01F:C01E:0033:0032:009A:0099:
  0045:0044:C00E:C004:002F:0096:0041:0007:C011:C007:C00C:C002:0005:
  0004:0015:0012:0009:0014:0011:0008:0006:0003:00FF:

Und das ganze noch einmal aufbereitet mit dem ebenfalls beigelegten sed script, welches aus den Hex-codes der Ciphers lesbare Namen macht.

109.192.117.164 195.49.138.57   TLSv1 ClientHello TLSv1.2 :TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
  TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
  TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:
  TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
  TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:TLS_ECDHE_RSA_WITH_RC4_128_SHA:TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
  TLS_DHE_DSS_WITH_AES_128_CBC_SHA:TLS_DHE_RSA_WITH_AES_256_CBC_SHA:TLS_RSA_WITH_AES_128_GCM_SHA256:
  TLS_RSA_WITH_AES_128_CBC_SHA:TLS_RSA_WITH_AES_256_CBC_SHA:TLS_RSA_WITH_3DES_EDE_CBC_SHA:
  TLS_RSA_WITH_RC4_128_SHA:TLS_RSA_WITH_RC4_128_MD5:

195.49.138.57   109.192.117.164 TLSv1.2 ServerHello TLSv1.2 cipher TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

109.192.117.164 195.49.138.57   SSLv3 ClientHello SSLv3 :TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA:
  TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA:TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA:TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA:
  TLS_DHE_RSA_WITH_AES_256_CBC_SHA:TLS_DHE_DSS_WITH_AES_256_CBC_SHA:TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
  TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA:TLS_ECDH_RSA_WITH_AES_256_CBC_SHA:TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA:
  TLS_RSA_WITH_AES_256_CBC_SHA:TLS_RSA_WITH_CAMELLIA_256_CBC_SHA:TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA:
  TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA:TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA:
  TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA:TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA:
  TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA:TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA:TLS_RSA_WITH_3DES_EDE_CBC_SHA:
  TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA:TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA:TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA:
  TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA:TLS_DHE_RSA_WITH_AES_128_CBC_SHA:TLS_DHE_DSS_WITH_AES_128_CBC_SHA:
  TLS_DHE_RSA_WITH_SEED_CBC_SHA:TLS_DHE_DSS_WITH_SEED_CBC_SHA:TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
  TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA:TLS_ECDH_RSA_WITH_AES_128_CBC_SHA:TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA:
  TLS_RSA_WITH_AES_128_CBC_SHA:TLS_RSA_WITH_SEED_CBC_SHA:TLS_RSA_WITH_CAMELLIA_128_CBC_SHA:TLS_RSA_WITH_IDEA_CBC_SHA:
  TLS_ECDHE_RSA_WITH_RC4_128_SHA:TLS_ECDHE_ECDSA_WITH_RC4_128_SHA:TLS_ECDH_RSA_WITH_RC4_128_SHA:
  TLS_ECDH_ECDSA_WITH_RC4_128_SHA:TLS_RSA_WITH_RC4_128_SHA:TLS_RSA_WITH_RC4_128_MD5:TLS_DHE_RSA_WITH_DES_CBC_SHA:
  TLS_DHE_DSS_WITH_DES_CBC_SHA:TLS_RSA_WITH_DES_CBC_SHA:TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA:
  TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA:TLS_RSA_EXPORT_WITH_DES40_CBC_SHA:TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5:
  TLS_RSA_EXPORT_WITH_RC4_40_MD5:TLS_EMPTY_RENEGOTIATION_INFO_SCSV:

Ich hab ein paar Patches beigesteuert die es etwas robuster machen, man muss sich aber vor Augen halten dass das Tool nur sehr einfache Handshakes versteht (diese müssen im Anfang der gefilterten IPv4 Pakete stehen). Schon ein TLS Alert (Warnung: unrecognized_name) verhindert, dass das ServerHello erkannt wird. Außerdem ist aktuell der Parser sehr ungenau was die Überprüfung der Paketformate angeht, es bietet sich also an das Tool nicht als Root auf einem kritischen System laufen zu lassen sondern vielmehr den Traffic mittels tcpdump -w file zu speichern und dann Offline auszuwerten (mit einem User ohne weitere Rechte).

Es sollte auch darauf hingewiesen werden dass es sich hier nur um die Handshakes handelt, Clients die viele erfolglose Verbindungen aufbauen sind in den Zahlen entsprechend überräpresentiert. Wenn eine persistente HTTPS connection tausende Anfragen verarbeitet steht diese nur einmal in der Liste. Ebenso sieht man nicht, ob ein Client, wenn er SSL3 offeriert bekam dieses auch akzeptiert (oder ablehnt).

tls-hello-dump kann nicht mit STARTLS (wie es z.B. in SMTP und IMAP Verwendung findet) umgehen. Das liegt hauptsächlich daran dass es sich nicht damit befasst die gefilterten Pakete zu TCP Strömen zusammenzusetzen. Das macht das Tool leichtgewichtig aber eben auch beschränkt. ssldump wäre für diesen Fall die bessere Wahl.

Compilieren und starten

tls-hello-dump steht auf GitHub als source code zur Verfügung (habe noch kein Binärpaket gesehen) und sollte auf jedem Linux Rechner mit entsprechenden Entwicklungspaketen übersetzbar sein:

git clone https://github.com/ge0rg/tls-hello-dump.git
cd tls-hello-dump/
make clean all
FILTER="tcp port 443 and tcp[tcp[12]/16*4]=22 and (tcp[tcp[12]/16*4+5]=1 or tcp[tcp[12]/16*4+5]=2)"
sudo tcpdump -p -s 1518 -i eth0 -w handshakes.pcap "$FILTER"
./tls-hello-dump handshakes.pcap | sed -f readable.sed 

Oder für die Mutigen: "sudo ./tls-hello-dump eth0 https | sed -f readable.sed"

Der Poodle bellt (SSL Sicherheitsschwäche)

Wieder einmal macht eine Sicherheitslücke mit einem klangvollen Namen die Runde. Poodle ist eine Schwachstelle in SSL 3.0, die sich aber auch auf neuere Clients auswirkt. Ausgelöst wurde das ganze durch ein Paper der Google Sicherheitsforscher Bodo Möller, Thai Duong und Krzysztof Kotowicz. Warum Sites wie Twitter mit der Abschaltung von SSL 3.0 reagieren möchte ich hier kurz darstellen.

Zuerst einmal eine Feststellung: SSL 3.0 (das Secure Socket Layer Protokoll in der Version 3.0 von 1996, nachträglich in RFC6101 dokumentiert) ist (trotz der Versionsnummer) der Vorgänger von TLSv1, TLS 1.1 oder dem aktuellen TLS 1.2 (RFC5246). Es hat eine Reihe von Sicherheitsproblemen und Unschönheiten und sollte schon länger nicht mehr verwendet werden.

Die Poodle Lücke hat das nur bestätigt: Durch eine ungeschickte Verwendung von Füll-Bytes bei dem CBC Modus (verwendet für DES, 3DES und RC2) kann ein Angreifer der mehrere SSL Anfragen beeinflussen und abhören kann, auf den Inhalt schließen. Diese Schwachstelle ist ähnlich zu der bereits vor einiger Zeit bekannt gewordenen BEAST Lücke.

Es sind verschiedene Situationen denkbar, bei denen diese Lücke ausgenutzt werden kann, aber im Web Browser Umfeld ist es dank JavaScript und Userinteraktion am Einfachsten.

Für SSL 3.0 kann dies nicht behoben werden (und selbst wenn wäre es einfacher direkt TLS 1.2 zu verwenden das die Lücke nicht hat). Bei Clients und Server die SSL 3.0 noch einsetzen könnte man die betroffenen CBC Ciphers abschalten, das ist aber leider keine sehr attraktive Lösung da sonst nur noch die eher unsichere RC4 Stromchiffre verwendet werden könnte.

SSL 3.0 muss sterben

Ohne jetzt nun näher zu bewerten wie einfach oder wie schwer die Lücke in welcher Situation ausgenutzt werden kann sind sich eigentlich alle einig: SSL 3.0 sollte nicht mehr verwendet werden und kann in Clients und Servern endlich abgeschaltet werden. Dies nimmt somit auch schon die Empfehlung vorweg und den Weg gehen alle mehr oder weniger schnell.

Ob man die Unterstützung für SSL 3.0 abschalten kann hängt vor allem damit zusammen ob alle potentiellen Gegenstellen ein gemeinsames neueres Protokoll sprechen. Als Web Server Betreiber stellt sich die Situation recht einfach dar: alle Clients außer Internet Explorer 6 auf einem Windows XP (und älter) können mindestens TLSv1, die meisten auch schon 1.1 oder 1.2 (wobei es nicht alle angeschaltet haben).

Internet Explorer 6 muss brennen

Aus einer ganzen Reihe von Gründen ist es eigentlich nicht mehr wünschenswert IE 6 zu benutzen, und schon gar nicht zu fördern. Da es selbst für Anwender die auf XP festsitzen Alternativen gibt (darunter Firefox und IE 7-8) sollte man inzwischen keinen Gedanken verschwenden und SSL 3.0 in öffentlichen Web Servern sofort abschalten.

CloudFlare, ein CDN und Cloud Security Dienstleister der weltweit viele Websites schützt und ausliefert hat Statistiken veröffentlicht, sie werden SSL 3.0 abschalten:

Across our network, 0.09% of all traffic is SSLv3. For HTTPS traffic, 0.65% across our network uses SSLv3. The good news is most of that traffic is actually attack traffic and some minor crawlers. For real visitor traffic, today 3.12% of CloudFlare's total SSL traffic comes from Windows XP users. Of that, 1.12% Windows XP users connected using SSLv3. In other words, even on an out-of-date operating system, 98.88% Windows XP users connected using TLSv1.0+ — which is not vulnerable to this vulnerability.

Wenn man weg geht von dem reinen Webbrowser/Server Umfeld, so ist die Unterstützung von neueren Protokollen nicht ganz so klar. Allerdings ist TLSv1 bereits in Java SE 1.4 enthalten, und so dürfte die Anzahl der Endpunkte die kein TLS können sich auf spezielle Embedded Hardware (und falsch konfigurierte Software) beschränken. Im System-to-System oder MFT Umfeld ist das Risiko der POODLE Lücke deutlich geringer (weil der interaktive Einfluss fehlt), aber auch hier wäre es ratsam und Risikofrei SSL 3.0 einfach abzuschalten.

SSL Fallback

Wenn sowohl Client als auch Server das TLS Protokoll sprechen so können Sie dies beim Verbindungsaufbau erkennen, und die gemeinsam gesprochene beste Version aushandeln. Dank Überprüfung dieses Handshakes ist es einem Angreifer auch nicht möglich der jeweils anderen Seite eine niedrigere Version vorzugaukeln.

Allerdings gibt es bei der Sache einen Haken: da manche Clients wenn ein Verbindungsaufbau mit einem TLS Handshake nicht klappt das ganze erneut mit einer älteren Version versuchen (out-of-band protocol fallback). Ein Angreifer muss damit nicht den ersten Handshake ändern (was TLS erkennt), sondern nur aufhalten (in der Praxis passiert dies sogar bei Überlastung ganz ohne Angreifer, was ebenso nicht erwünscht ist). Wenn der Client einen erneuten Versuch unternimmt und dabei nur SSL 3.0 ankündigt, so gelingt der Handschlag zwischen Client und Server mit einer unnötig alten (und unsicheren) Protokoll Version.

Dieser Downgrade Angriff ist Bestandteil der POODLE Lücke (wenn neuere Client und Server verwendet werden). Zur Verhinderung davon gibt es mehrere Möglichkeiten:

  • Clients verzichten auf den Fallback handshake und verlassen sich auf die TLS Versionslogik (dazu gehört zum Beispiel Java, wenn der Entwickler die Logik nicht selbst implementiert hat)
  • Auf Clients und Servern unsichere Protokollversionen gar nicht anbieten (SSL 3.0 abschalten)
  • Ein neuer Mechanismus bei dem ein Client der einen kompatiblen Handschlag versucht eine Markierung (die nicht entfernt werden kann) mitschickt, dass es ein Kompatibilitätsversuch ist. Server die von dieser Markierung wissen würden den Handschlag dann ablehnen (wenn sie eine neuere Version sprechen).

Letzteres wird TLS_FALLBACK_SCSV genannt, es handelt sich um eine sogenannte Signalling Cipher, die aktuell in Diskussion ist (und Google Chrome sendet dies schon einige Zeit, Firefox ab Version 35). Damit diese funktionieren kann, müssen aber die Server diese auch kennen. Die Erweiterung ist umstritten, denn für den Fall SSL 3.0 ist ein abschalten einfacher, und für zukünftige TLS Protokoll sollten die Clients einen Fallback einfach gar nicht durchführen.

TLSv1

So positiv wie es zu sehen ist, dass sehr viele Lösungen mindestens TLSv1 sprechen, so ist dies auch ein deutliches Warnzeichen: TLSv1 ist auch schon stark angekratzt. Die meisten wirklich wünschenswerten Verbesserungen sind erst in TLSv1.1 oder 1.2 zu finden. Schon heute können Sicherheitsbewusste Anbieter TLSv1 abschalten (Der Mozilla Server Side TLS Security Guide nennt dies „Modern Compatibility“). Es ist entsprechend anzuraten gleich jetzt zu evaluieren ob man auch gleich TLSv1 verbannen möchte und sicherzustellen dass TLSv1.2 angeboten wird (und so konfiguriert ist, dass es Perfect Forward Secrecy unterstützt und auf Zertifikaten basiert die mit SHA2 statt SHA1 oder gar MD5 signiert sind).

Zum weiterlesen

Dell BIOS Upgrades (Latitude E6510)

Ich wollte meinem etwas älteren Dell Latitude E6510 ein BIOS update gönnen, in der Hoffnung ein paar der Probleme die ich mit dem Akku und dem thermischen Verhalten habe damit etwas in den Griff zu bekommen. Dank dem Service Tags konnte ich auf der Support Seite auch schnell die benötigten Downloads ausmachen. Mein Gerät hatte ein BIOS in der Version A06, auf der Webseite stand als letzte Version die A16 bereit.

ScreenshotDie BIOS Updates bei Dell kommen als Bundle mit Flashes für das Bios, das System Management, die Intel Management Engine und weiterer Komponenten. Wenn man das Programm startet so frägt es nach dem BIOS Passwort, und nach wenigen Sekunden wird der Rechner auch für den Update Rebootet. In meinem Fall geschah allerdings nach dem Reboot nichts weiter. Das System meldete die gleiche alte Version weiterhin. Keine Fehlermeldung. Ich hatte dann mit verschiedenen Optionen herumgespielt, z.B. den Upgrader als Administrator zu starten, oder im abgesicherten Modus meines Win7 x64. Aber alles hat nicht weitergeholfen.

Nach ein wenig herumsuchen auf den Support Webseiten habe ich festgestellt dass bei ein paar der älteren BIOS Versionen eine Mindestversionsnummer vorausgesetzt und auch abgeprüft wird. Ebenso gibt es die Empfehlung mit der BIOS Version zu beginnen die das System schon hat. Und tatsächlich haben sich einige der dazwischenliegenden Versionen auch geweigert eine ältere A06 zu aktualisieren. A06-A08 konnte ich allerdings gar nicht installieren, da der Upgrader statt zu rebooten gecrashed ist. Übrigens werden nicht alle älteren Versionen in der Rechner-spezifischen Supportseite angezeigt, die Volltext Suche jedoch findet die Downloads in allen benötigten Versionen.

Screenshot: USB BootIch habe dann gesehen, dass die Updater .exe Files nicht nur mit Windows benutzt werden können, sondern auch mit DOS. Und das war dann die Lösung: alle BIOS Versionen auf einen USB Stick kopiert auf dem SystemRescueCd (mit LinuxLiveUSB) installiert ist. Dieses bringt auch FreeDOS (für diverse DOS Firmware Utilities) mit. Davon gebootet zeigte die BIOS Update Routinen sich sehr leicht bedienbar, und vor allem erfolgreich beim Update. Zuerst von A06 auf A06 - das hat dazu geführt dass der nächste Update auf A07 schon besser die Versionen der einzelnen Systemkomponenten anzeigen konnte. Und vor allem fand nach dem Reboot auch ein Flash Vorgang statt, der vorher nicht zu sehen war.

Screenshot: BIOS Update unter DOsMeine Vermutung: ältere BIOS Updater können zwar noch richtig prüfen ob man auf einer erforderlichen Minimalversion ist, dafür stürzen diese aber unter aktuellem Windows 7 x64 ab. Neuere Updater (insbesondere A16) funktionieren zwar problemlos mit Windows 7, prüfen aber die Minimalvoraussetzung nicht. Nach dem Reboot wenn das BIOS geflashed werden soll, wird die Version geprüft und der Update verweigert - jedoch ohne sichtbare Fehlermeldung.

Es ist schade, dass Dell hier ein sehr uneinheitliches Erlebnis hat: die BIOS Updater sind einfach zu bedienen, arbeiten schnell und sind durch die Unterstützung von Windows und DOS sehr flexibel. Gleichzeitig erwartet anscheinend keiner bei DELL, dass man nicht alle 6 Monate ein neues BIOS einspielt, entsprechend lückenhaft ist die QA bei so einem Update Schritt. Dass es ärgerlich ist, dass ich 5 Zwischenversionen einspielen musste: geschenkt.

 

Übrigens bietet Dell in der Knowledgebase einen Artikel an, welche BIOS Versionen welche Mindestvoraussetzungen haben. Es steht nicht dabei dass es auch für Folgeversionen gilt, aber meine Erfahrung ist jetzt, man muss alle Zwischenschritte gehen:

Article ID: 603480 (2013-05-07): Dell Optiplex, Latitude and Precision BIOS Dependency Chart

Product Installed Must Update Before Version
Latitude E6510 A08 A09 A10
Latitude E6510 A10 A11 A12

Meine Reihenfolge: A06 -> A06 -> A07 -> A09 -> A10 -> A11 -> A16.

Eines der neuen Features der Firmware ist die (nicht wieder abschaltbare) Option nur BIOS Updates mit gültiger Dell Signatur zu erlauben. Das ist angesichts der Einfachheit mit der man den BIOS Update anstoßen kann sicherlich sehr empfehlenswert, allerdings scheue ich nach meinen Erfahrungen mit der schlampigen QA bei Dell doch etwas davor zurück.

FilterOutputStream - considered harmfull

Java besitzt mit java.io.FilterOutputStream eine Klasse die man als Entwickler extended kann um einen OutputStream zu implementieren der Daten filtert. Dabei implementiert die Basisklasse die unterschiedlichen Varianten von write() sowie flush() und close().

Ich hatte im Rahmen der Vorbereitung für eine Apache Commons VFS 2.1 release geschaut, ob der Code bereits mit Java 8 compiliert werden kann. Es sind noch ein paar Punkte offen, aber was besonders auffiel ist, dass ein Unit-Test fehlschlägt. Nach etwas Analyse (VFS-521) habe ich festgestellt, dass das Problem vom FilterOutputStream in Java 8 herrührt, der ein try-with-resource verwendet um flush() und close() durchzuführen. Wenn dabei beide Methoden die selbe Exception werfen so gibt es beim Hinzufügen der unterdrückten Exception statt der erwarteten IOException eine sehr störende IllegalArgumentException: Self-suppression not permitted.

Wenn man sich den Code älterer Java Implementierungen im Vergleich anschaut, so sieht man allerdings, dass diese noch viel problematischer waren. Denn diese verschlucken bei einem close() potentielle IOExceptions die im davor aufgerufenen flush() aufgetreten sind. Das ältere unsichere Verhalten des FOS ist auch ein "akzeptierter" Bug im JDK: JDK-6335274.

Da der FilteredOutputStream nur verschlimmbessert wurde ist meine Lösung Abstand von dessen close() Methode zu nehmen. Und dies gilt leider auch für den BufferedOutputStream. Hier eine Version ohne besondere Unterstützung für suppressed exceptions.

Mal sehen was auf der openjdk-corelibs-dev liste dazu herauskommt, dort habe ich das Problem mal geschildert. Ein JDK-Bug wurde angelegt, der ist aber noch unbearbeitet.