G03 Padding Oracle

In diesem und den beiden folgenden Artikeln stelle ich Euch eine Unsicherheit vor, welche nicht nur theoretisch besteht, nämlich das „Padding Oracle“. Um es gleich am Anfang zu schreiben – durch das Padding Oracle wurden in der Vergangenheit viele und selbst professionelle Datenbanken gehackt und Daten freigelegt.

Was ist nun das „padding oracle“? Im Kern ist es eine gutgemeinte Programmierung, welche aber am Ende eine fatale Auswirkung hat. Damit Ihr dieses versteht habe ich das Programm B07b_AesCbcPkcs5PaddingString ein wenig verändert. Die Methode zur Verschlüsselung ist unverändert, aber in der Methode zur Entschlüsselung meine ich es programmiertechnisch gut und lasse mit von der Entschlüsselungsmethode die Information zurückgeben, warum die Entschlüsselung eventuell nicht funktioniert hat. Details zum Padding selber findet Ihr im Artikel A07_Pkcs5Padding.

Das Ganze wird durch einfache „catch“-Routinen durchgeführt und diese geben im Rückgabe Byte-Array entweder den Decryptedtext oder die Fehlermeldung zurück.

Das Hauptprogramm führt nach der Verschlüsselung zuerst eine Entschlüsselung mit dem „richtigen“ Schlüssel durch. Bei einem zweiten Versuch wird das 16. Byte des ciphertextByte-Arrays (Wert „EA“) in „00“ ersetzt. Dieses führt im Ergebnis zu einer „Bad Padding Exception“, welche seitens des Programms so auch dokumentiert wird (siehe das Ergebnis in der Konsole).

Was macht das Programm denn nun so gefährlich? Ein Angreifer kann in den meisten Fällen den ciphertext mühelos verändern und dem Entschlüsselungsprogramm (z.B. eine Webseite und deren LogIn-Seite) vorsetzen. Sollte der Angreifer ungehindert in der Lage sein, viele Eingaben nacheinander dem Webserver zu präsentieren, so kann er alleine aus der Information „das Padding ist falsch“ den entschlüsselten Text zurück gewinnen, und das Ganze ohne die Entschlüsselungsroutine oder den verwendeten Key zu kennen.

Dieser Artikel soll nur die Basis für die beiden folgenden Artikel sein, die das Padding Oracle gezielt ausnutzen werden.

Bitte die nachfolgende Routine nicht für den Echteinsatz nutzen, da sie aus kryptographischer Sicht sehr angreifbar ist !

Das gibt das Programm auf der Konsole aus:

Alle Quellcodes zu den Unsicherheiten findet Ihr zum Download in meinem Github-Repository, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/G-Unsicherheit. Alle Programme sind sowohl unter Java 8 als auch unter Java 11 lauffähig.

Die Lizenz zum obigen Beispiel findet Ihr auf der eigenen Lizenz-Seite.

Letzte Aktualisierung: 24.09.2019