CogniCrypt: Kryptografie richtig nutzen

Seite 2: Das Projekt CogniCrypt

Inhaltsverzeichnis

Das von den Autoren dieses Artikels entwickelte und unter dem Dach der Eclipse Foundation als Open-Source-Software verfügbare CogniCrypt bietet eine pragmatische Lösung für Entwickler zur korrekten Benutzung der APIs an. Die Software steht derzeit als Plug-in für die Entwicklungsumgebung Eclipse zur Verfügung. Die Anbindung an weitere Entwicklungsumgebungen ist geplant, um sicherzustellen, dass sich das Tool einfach in den Arbeitsablauf integrieren lässt.

CogniCrypt unterstützt Entwickler bei der sicheren Verwendung von Kryptografie-APIs durch zwei Funktionen: Erstens lässt sich für zahlreiche kryptografische Anwendungsszenarien korrekter und sicherer Quellcode generieren, den Entwickler in die Softwarekomponenten integrieren können. Zweitens unterzieht CogniCrypt bestehenden und neuen Quellcode fortlaufend einer Analyse, die sicherstellt, dass eine Softwarekomponente auch nach Änderung des generierten Quellcodes nicht in falscher oder unsicherer Weise verwendet wird. Ein Video-Tutorial zeigt den gesamten Arbeitsablauf mit dem Tool:

Das Video demonstriert den Einsatz von CogniCrypt

CogniCrypts Codegenerator ist in Eclipse über einen Assistenten implementiert. Entwickler müssen darüber zunächst ihr aktuelles Projekt und das Anwendungsszenario auswählen. Aktuell hilft CogniCrypt beim Aufbau sicherer Verbindungen, der Langzeitarchivierung von Dokumenten, dem Passwort-Hashing und schließlich der passwortbasierten Verschlüsselung.

Der Assistent von CogniCrypt hilft mit Fragen beim Erstellen des passenden Quellcodes.

Neben dem Anwendungsszenario fragt der Assistent vor dem Generieren des Quellcodes weitere Details in einem Dialog ab. Die Fragen setzen nur ein minimales Kryptografie-Wissen voraus, ermöglichen es CogniCrypt aber trotzdem, auf das Szenario angepassten Quellcode zu generieren. Beispielsweise fragt CogniCrypt beim PBE-Szenario, was es genau verschlüsseln soll, und bietet Strings, Dateien und byte-Arrays an. Je nach Antwort generiert CogniCrypt eine andere Wrapper-Methode, die den jeweiligen Klartext in den richtigen Datentyp konvertiert.

Nachdem CogniCrypt die Antworten auf alle Fragen bekommen hat, schlägt es mehrere Codevarianten vor, die das passende Szenario implementieren. Die generierten Vorschläge sind nach aktuellen Sicherheitsrichtslinien implementiert und erfüllen die im Assistenten spezifizierten Anforderungen. Entwickler entscheiden anschließend, welche der vorgeschlagenen Varianten sie in ihrem Quellcode verwenden möchten. Da häufig eine solche Feinkontrolle nicht notwendig ist, empfiehlt CogniCrypt jeweils eine Variante prominent.

Nach der Auswahl generiert das Tool zwei Codeabschnitte. Einerseits erstellt es die eigentliche Implementierung – im Fall von PBE den Code für die passwortbasierte Verschlüsselung. Um Entwicklern den Einsatz des generierten Quellcodes zu vereinfachen, erzeugt CogniCrypt zusätzlich eine Methode zur Demonstration der Nutzung in der Klasse, die beim Starten des CogniCrypt-Assistenten geöffnet ist. Die Methode lässt sich im Anschluss nutzen, um die Implementierung in den Rest des Projekts zu integrieren.

Damit beim Integrieren des generierten Quellcodes in das Projekt keine neuen Schwachstellen entstehen, führt CogniCrypt nach jeder Änderung am Sourcecode eine statische Analyse aus. Dadurch kann das Werkzeug bereits nach wenigen Sekunden über potenziell neu eingeführte Schwachstellen informieren. Neben dem generierten Quellcode überprüft die statische Analyse den Einsatz kryptografischer Bibliotheken im existierenden Sourcecode. Unter anderem warnt das Tool beim Verwenden unsicherer oder veralteter Algorithmen wie SHA1.

CogniCrypt generiert Warnungen in Form von Fehlermarken inklusive Korrekturvorschlägen für die betroffenen Zeilen im Quellcode. Für das Codebeispiel setzt das Tool für die vier Fehler passende Marker. Es erkennt die unsichere Wahl des Blockmodus ECB und warnt vor der Konvertierung eines Passworts aus dem String-Literal password. Neben diesen statisch einfach auffindbaren Fehlern erkennt die Analyse zusätzlich kompliziertere Datenflüsse.

Beispielsweise weist es darauf hin, dass der Quellcode den festverdrahteten Salt aus einem Feld der Klasse liest. Um den fehlenden Aufruf zu clearPassword des PBEKeySpec-Objekts zu finden, muss die Analyse die potenzielle Laufzeit des Objekts modellieren. In dem Beispiel erkennt CogniCrypt die letzte Nutzung des Objekts und schlägt vor, den Aufruf zu clearPassword in der darauffolgenden Zeile zu platzieren. Weiterhin verfolgt die statische Analyse Datenflüsse über Methodengrenzen hinweg und CogniCrypt warnt, dass das Cipher-Objekt der encrypt-Methode einen unsicher generierten SecretKey aus der Methode generateKey verwendet. Diese Arbeitsweise ist gerade bei stark verteiltem Quellcode hilfreich.

Die Konfiguration der Analyse erfolgt durch in der Spezifikationssprache CrySL verfasste Regeln. Mit CrySL lässt sich die korrekte Benutzung einer API spezifizieren. Die Autoren haben CrySL-Regeln für alle Klassen der Java Cryptografic Architecture definiert. Basierend darauf generiert CogniCrypts statische Analyse Warnungen bei Abweichungen von der Spezifikation.

In zwei verschiedenen Studien haben die Autoren untersucht, wie weit verbreitet die fehlerhafte Nutzung von Kryptografie ist. Dafür benutzten sie die oben beschriebene Analyse (unabhängig von einer Entwicklungsumgebung) auf kompilierten Java-Anwendungen im Format .class oder für Android-Apps .dex. Fehlerhinweise lassen sich dabei auf der Kommandozeile ausgeben.

Das Ergebnis einer Untersuchung von 10.000 aktuellen Android-Apps im Google Play Store bringt besorgniserregende Zahlen zutage: Insgesamt hatten 95 Prozent der 4349 Apps, die Kryptografie nutzen, mindestens einen Fehler. Die häufigsten treten im Kontext von Hashing auf: Viele Entwickler benutzten nach wie vor die kryptografisch unsichere Hashverfahren MD5 und SHA1. Weiterhin hat die Analyse auch einige Verwendungen veralteter Verschlüsselungsalgorithmen wie DES oder unsicherer Blockmodi (ECB) aufgedeckt. Die Autoren haben die Entwickler der Software, sofern möglich, über die Schwachstellen informiert (Coordinated Disclosure). In der App "Norton Identity Safe" hat CogniCrypt beispielsweise eine illegitime Rechteausweitung durch einen festverdrahteten Initialisierungsvektor (CVE-2018-12240) erkannt. Der Hersteller Symantec hat die Schwachstelle inzwischen behoben.

In einer bisher unveröffentlichten Studie haben die Autoren die Analyse auf Bibliotheken von Maven Central evaluiert, eines der größten Repositorys für Softwarebibliotheken. Die Analyse lief auf die jeweils aktuellen Versionen der Bibliotheken und erfasste insgesamt über 150.000 JAR-Dateien. Auf Maven Central ist der Anteil der fehlerhaften Nutzung mit 68 Prozent zwar etwas geringer als bei den Android-Apps, die Fehler sind aber ähnlich.