Dieses Repository enthält Cognicrypt Sast , die statische Analysekomponente für Cognicrypt. Die statische Analyse Cognicrypt Sast nimmt Regeln in der Spezifikationssprache Crysl als Eingabe an und führt eine statische Analyse durch die Spezifikation der Regeln durch. CRYSL ist eine domänenspezifische Sprache (DSL), mit der Nutzungsspezifikationen für kryptografische Libies (z. B. insbesondere die JCA) codiert werden. Weitere Informationen zu CRYSL und der statischen Analyse finden Sie in diesem Artikel.
Nehmen wir an, wir haben das folgende Programm mit einigen Verstößen:
import java . security . GeneralSecurityException ;
import javax . crypto . KeyGenerator ;
import javax . crypto . SecretKey ;
import javax . crypto . spec . SecretKeySpec ;
import javax . crypto . Cipher ;
public class Example {
public static void main ( String [] args ) throws GeneralSecurityException {
// Constraint Error: "DES" is not allowed
KeyGenerator generator = KeyGenerator . getInstance ( "DES" ); // r0
// Constraint Error: Key size of 64 is not allowed
generator . init ( 64 );
// KeyGenerator is not correctly initialized
// RequiredPredicateEror: Generated key is not secure
SecretKey key = generator . generateKey (); // r1
// Constraint Error: "DES" is not allowed
Cipher cipher = Cipher . getInstance ( "DES" ); // r2
// RequiredPredicateError: "key" is not securely generated
cipher . init ( Cipher . ENCRYPT_MODE , key );
// IncompleteOperationError: Cipher object is not used
}
}Mit den JCA -Regeln führen wir den folgenden Befehl in einer kompilierten Version dieses Programms aus:
java -jar HeadlessJavaScanner-x.y.z-jar-with-dependencies.jar --appPath ./Examples.jar --rulesDir ./JCA-CrySL-rules.zip --reportFormat CMD --reportPath ./output/ --visualization Cognicrypt Sast führt die Analyse aus und druckt einen Bericht an die Befehlszeile. Insgesamt meldet es 3 ConstraintErrors , 2 RequiredPredicateErrors und 1 IncompleteOperationError sowie deren Positionen in den ursprünglichen Programmen. Darüber hinaus werden seit wir --visualization die folgende visualization.png erstellt ./output/

Sie können sehen, dass zwei ConstraintErrors am Objekt r0 (Keygenerator) ein RequiredPredicateError am Objekt r1 (SecretKey) verursachen, was wiederum ein RequiredPredicateError am Objekt r2 (Verschlüsselung) verursacht. Darüber hinaus gibt es ein weiteres ConstraintError und IncompleteOperationError für das Verschlüsselungsobjekt. Beachten Sie, dass die Variablen und Aussagen der Zwischendarstellung entsprechen. Sie können die Variablen mit der Befehlszeilenausgabe übereinstimmen, in der alle analysierten Objekte aufgeführt sind.
Wir bieten die Implementierung der statischen Analyse von Cognicrypt in:
CryptoAnalysis enthält die Komponenten für die tatsächliche AnalyseCryptoAnalysisTargets enthält verschiedene Beispielanwendungen, die auch verwendet werden, um die Richtigkeit der Kryptoanalyse zu testenWir bieten weiter zwei SAST -Tools, die die Analyse von Java- und Android -Anwendungen ermöglichen:
HeadlessJavaScanner enthält das SAST -Tool, das Java -Anwendungen analysiert (siehe unten)HeadlessAndroidScanner enthält das SAST -Tool, das Android -Anwendungen analysiert (siehe unten) Hier können Sie eine vorkompilierte Version von Cognicrypt SALT hier auschecken. Wir empfehlen die neueste Version. Sie können Cognicrypt -Sast auch auf Maven Central finden.
Cognicrypt Sast verwendet Maven als Build -Tool. Sie können dieses Projekt über kompilieren und erstellen
mvn clean package -DskipTests .
Die verpackten jar einschließlich aller Abhängigkeiten finden Sie in /apps . Das Gebäude erfordert mindestens Java 17.
Cognicrypt Sast kann im Kopflosenmodus als CLI-Tool über die Datei HeadlessJavaScanner-xyz-jar-with-dependencies.jar gestartet werden. Es erfordert zwei Argumente:
java -jar HeadlessJavaScanner-x.y.z-jar-with-dependencies.jar
--rulesDir <path-to-crysl-source-code-format-rules>
--appPath <application-path>
Für einen einfachen Start haben wir einen .Jar mit Klassen mit Krypto -Missständen vorbereitet. Der Quellcode für diese Missbrauch findet sich hier.
Weitere zusätzliche Argumente, die verwendet werden können, sind wie folgt:
--cg <selection_of_call_graph_for_analysis> (possible values are CHA, SPARK, SPARKLIB)
--sootPath <absolute_path_of_whole_project>
--identifier <identifier_for_labeling_output_files>
--reportPath <directory_location_for_cryptoanalysis_report>
--reportFormat <format of cryptoanalysis_report> (possible values are CMD, TXT, SARIF, CSV, CSV_SUMMARY)
--visualization (Create a visualization of all errors (requires --reportPath option to be set))
--dstats (disables the output of the analysis statistics in the reports)
--ignoreSections (Text file with packages (e.g. `de.example.*`), classes (e.g. `de.example.exmapleClass`) or methods (e.g. `de.example.exampleClass.exampleMethod`), one per line. Those packages, classes and methods are ignored during the analysis)
--timeout <timeout in milliseconds> (Timeout for seeds in milliseconds. If a seed exceeds this value, CryptoAnalysis aborts the typestate and extract parameter analysis and continues with the results computed so far. (default: 10000))
--help (show more information for the CLI arguments)
Beachten Sie, dass die Analyse je nach analysierter Anwendung viel Speicher und eine große Stapelgröße erfordern. Denken Sie daran, die erforderliche Heap -Größe (z. -Xmx8g) und Stapelgröße (EG -XSS60M) festzulegen.
Cognicrypt Sast kann als Github -Aktion verwendet werden.
- name : Run CogniCrypt
uses : CROSSINGTUD/CryptoAnalysis@version
with :
appPath : " CryptoAnalysisTargets/HelloWorld/HelloWorld.jar "
basePath : " CryptoAnalysisTargets/HelloWorld " Der appPath muss konfiguriert werden, um auf eine kompilierte Version Ihrer Anwendung zu verweisen.
Der basePath wird verwendet, um Pfade im analysierten Glas und im Quellbaum zu verknüpfen. Klasse com.example wird bei basePath/com/example gesucht.
Siehe action.yml für alle Eingabeoptionen.
Ein Beispiel für die Verwendung der GitHub-Aktion finden Sie im Cryptoanalyse-Demo-Repository.
Cognicrypt Sast berichtet von Missbrauch, wenn der Code nicht den Crysl -Regeln entspricht. Für jeden Missbrauch berichtet Cognicrypt Sast die Klasse und die Methode, in der der Missbrauch enthalten ist. Es gibt mehrere Missbrauchstypen:
Concerainror : Eine Einschränkung einer Crysl -Regel wird verletzt, z. B. wird ein Schlüssel mit der falschen Schlüsselgröße erzeugt.
EvertypeoFerror : Meldet, dass ein Wert von einem bestimmten Referenztyp angegeben wurde: Zum Beispiel sollte ein Zeichenarray, das ein Kennwort enthält, niemals aus einer String konvertiert werden. (Siehe KeyStore -Regel hier).
ForbiddenMethoderror : Eine Methode, die unter bestimmten Umständen verboten ist (Crysl -Block verboten), wurde als unter bestimmten Umständen bezeichnet.
UnpreciseValueExtractionError : Die statische Analyse konnte nicht alle im Crysl Constraint -Block erforderlichen Informationen extrahieren. Beispielsweise könnte die Schlüsselgröße als Wert geliefert werden, der in einer Konfigurationsdatei aufgeführt ist. Die statische Analyse modelliert nicht den Inhalt der Datei und kann den Wert nicht einschränken.
SCHAFTETRORROR : Der Auftragsblock von Crysl wird verletzt, dh der erwartete Methodensequenzaufruf ist falsch. Beispielsweise erwartet ein Signature vor dem update(data) einen Aufruf zum initSign(key) .
FordersPredicateError : Ein Objekt A erwartet, dass ein Objekt B korrekt verwendet wurde (Crysl -Blöcke erfordert und sichern). Zum Beispiel muss ein Cipher ein SecretKey -Objekt korrekt und sicher erzeugt werden.
Unvollständiger OperationError : Die Verwendung eines Objekts kann unvollständig sein: Zum Beispiel kann ein Cipher initialisiert, aber niemals zur Ein- oder Entschlüsselung verwendet werden. Dies kann den Code tot machen. Dieser Fehler hängt stark vom berechneten Anrufdiagramm ab (standardmäßig CHA).
UncaughexceptionError : Eine Methode kann eine Ausnahme ausgeben, aber die Ausnahme ist nicht im Programm gefangen. Zum Beispiel ist der Methodenaufruf nicht von einem Try/Catch -Block umgeben.
Cognicrypt SAST unterstützt verschiedene Berichtsformate, die mithilfe der Option --reportformat eingestellt werden können. Die unterstützten Formate sind:
CMD : Der Bericht wird in die Befehlszeile gedruckt. Der Inhalt entspricht dem Format aus der TXT -Option.TXT : Der Bericht wird in die Textdatei CryptoAnalysis-Report.txt geschrieben. Der Inhalt entspricht dem Format aus der CMD -Option. Zusätzlich werden die .Jimple -Dateien der Klassen, in denen Missbrauch gefunden wurden, ausgegeben. Jimple ist eine Zwischendarstellung in der Nähe der Syntax von Java.SARIF : Der Bericht wird an die JSON-Datei CryptoAnalysis-Report.json geschrieben. Der Inhalt ist im SARIF -Format formatiert.CSV : Der Bericht wird in die CSV-Datei CryptoAnalysis-Report.csv geschrieben. Der Inhalt ist im CSV -Format formatiert.CSV_SUMMARY : Der Bericht wird in die Datei CryptoAnalysis-Report-Summary.csv geschrieben und enthält eine Zusammenfassung der Analyseergebnisse. Im Vergleich zum CSV -Format liefert dieses Format keine konkreten Informationen über die Fehler, sondern listet nur die Menge jedes Missbrauchstyps auf. Diese Option wurde zuvor von der CSV -Option implementiert, die geändert wurde, um detailliertere Informationen über die Fehler im CSV -Format bereitzustellen.GITHUB_ANNOTATION : funktioniert wie CMD , gibt aber auch alle Verstöße als Annotationen aus, wenn sie als Github -Aktion laufen. Wenn die Option --reportformat nicht angegeben ist, stand Cognicrypt standardmäßig mit der CMD -Option. Es ermöglicht auch die Verwendung mehrerer verschiedener Formate für dieselbe Analyse (z. B. --reportformat CMD,TXT,CSV erstellt einen Bericht, der in die Befehlszeile gedruckt und in einen Text und eine CSV -Datei geschrieben wird). Wenn die Option --reportPath <directory_location_for_cryptoanalysis_report> festgelegt ist, werden die Berichte (und die Visualisierung) im angegebenen Verzeichnis erstellt.
Cognicrypt Sast kann auch mit Android-Anwendungen unter Verwendung des Android-Scanners HeadlessAndroidScanner-xyz-jar-with-dependencies.jar ausgeführt werden. Seine Verwendung weicht nicht viel von den regulären Cognicrypt -Sasts ab. Es erfordert drei Argumente:
--apkFile : Der absolute Pfad zur .APK-Datei--platformDirectory : Der absolute Weg zu den Android SDK-Plattformen. Die Plattformen sind über Android Studio erhältlich. Unter dem Android SDK -Standort finden Sie eine platforms . Versorgen Sie Cognicrypt Sast mit dem Weg zu diesem Ordner.--rulesDir : Der absolute Weg zum Verzeichnis der Crysl-Regeln. java -jar HeadlessAndroidScanner-x.y.z-jar-with-dependencies.jar
--rulesDir <path-to-crysl-source-code-format-rules>
--platformDirectory <path-to-android-platform>
--appPath <application-path>
Optionale Parameter sind --reportPath und --reportFormat . Sie haben die gleiche Funktionalität wie die HeadlessJavaScanner-xyz-jar-with-dependencies.jar (siehe oben).
Wenn angegeben, generiert die Analyse eine Berichtsdatei CogniCrypt-Report.txt zusammen mit der .jimple Ausgabe der Klassen Die Analyse fand ein Missbrauch in. Das Format der oben beschriebenen Berichtsdatei folgt.
Abhängig von der analysierten Anwendung kann die Analyse möglicherweise viel Speicher und eine große Stapelgröße erfordern. Denken Sie daran, die erforderliche Heap -Größe (z. -Xmx8g) und Stapelgröße (EG -XSS60M) festzulegen.
Wir freuen uns über jeden Beitrag der Gemeinschaft!