Ce référentiel contient le sast cognicrypt, la composante d'analyse statique du cognicrypt. L'analyse statique Cognicrypt Sast prend des règles écrites dans le langage de spécification CRYSL en entrée et effectue une analyse statique basée sur la spécification des règles. Crysl est un langage spécifique au domaine (DSL) conçu pour coder les spécifications d'utilisation des libaires cryptographiques (par exemple, le JCA en particulier). Plus d'informations sur Crysl et l'analyse statique peuvent être trouvées dans cet article.
Supposons que nous ayons le programme suivant avec quelques violations:
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
}
}En utilisant les règles JCA, nous exécutons la commande suivante sur une version compilée de ce programme:
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 exécute l'analyse et imprime un rapport à la ligne de commande. Au total, il rapporte 3 ConstraintErrors , 2 RequiredPredicateErrors et 1 IncompleteOperationError , et leurs positions dans les programmes originaux. De plus, puisque nous utilisons --visualization , il crée la visualization.png d'image suivante.png dans le répertoire ./output/ :

Vous pouvez voir que deux ConstraintErrors sur l'objet r0 (KeyGenerator) provoquent un RequiredPredicateError sur l'objet r1 (SecretKey) qui à son tour provoque un RequiredPredicateError sur l'objet r2 (chiffre). De plus, il y a une autre ConstraintError et IncompleteOperationError sur l'objet Cipher. Notez que les variables et les instructions correspondent à la représentation intermédiaire jimple. Vous pouvez faire correspondre les variables à la sortie de ligne de commande qui répertorie tous les objets analysés.
Nous fournissons la mise en œuvre de l'analyse statique du cognicrypt dans:
CryptoAnalysis contient les composants de l'analyse réelleCryptoAnalysisTargets contient divers exemples d'applications qui sont également utilisées pour tester l'exactitude de CryptoanalyisNous fournissons en outre deux outils de sast qui permettent l'analyse des applications Java et Android:
HeadlessJavaScanner contient l'outil Sast qui analyse les applications Java (voir ci-dessous)HeadlessAndroidScanner contient l'outil Sast qui analyse les applications Android (voir ci-dessous) Vous pouvez vérifier une version pré-compilée de CogniCrypt Sast ici. Nous vous recommandons d'utiliser la dernière version. Vous pouvez également trouver le sast cognicrypt sur Maven Central.
CogniCrypt Sast utilise Maven comme outil de construction. Vous pouvez compiler et construire ce projet via
mvn clean package -DskipTests .
Les artefacts jar emballés, y compris toutes les dépendances, peuvent être trouvés dans /apps . Le bâtiment nécessite au moins Java 17.
CogniCrypt Sast peut être démarré en mode sans tête en tant qu'outil CLI via le fichier HeadlessJavaScanner-xyz-jar-with-dependencies.jar . Il nécessite deux arguments:
java -jar HeadlessJavaScanner-x.y.z-jar-with-dependencies.jar
--rulesDir <path-to-crysl-source-code-format-rules>
--appPath <application-path>
Pour un début facile, nous avons préparé un .Jar contenant des cours avec des abus de cryptographie. Le code source de ces abus se trouve ici.
Les autres arguments supplémentaires qui peuvent être utilisés sont les suivants:
--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)
Remarque, selon l'application analysée, l'analyse peut nécessiter beaucoup de mémoire et une grande taille de pile. N'oubliez pas de définir la taille du tas nécessaire (par exemple -xmx8g) et la taille de la pile (par exemple -xss60m).
Le sast cognicrypt peut être utilisé comme action github.
- name : Run CogniCrypt
uses : CROSSINGTUD/CryptoAnalysis@version
with :
appPath : " CryptoAnalysisTargets/HelloWorld/HelloWorld.jar "
basePath : " CryptoAnalysisTargets/HelloWorld " L' appPath doit être configuré pour pointer vers une version compilée de votre application.
Le basePath est utilisé pour relier les chemins dans le pot analysé et l'arbre source. Class com.example est recherché sur basePath/com/example .
Voir action.yml pour toutes les options d'entrée.
Un exemple d'utilisation de l'action GitHub peut être trouvé dans le référentiel de cryptoanalyse-démo.
CogniCrypt Sast rapporte une mauvaise utilisation lorsque le code n'est pas conforme aux règles CRYSL. Pour chaque utilisation abusive, CogniCrypt Sast rapporte la classe et la méthode dans laquelle la mauvaise utilisation est contenue. Il existe plusieurs types d'utilisation abusive:
CONSTRAINTERROR : Une contrainte d'une règle Crysl est violée, par exemple, une clé est générée avec la mauvaise taille de clé.
NetTypeoFerror : rapporté lorsqu'une valeur s'est avérée être d'un certain type de référence: par exemple, un tableau de caractères contenant un mot de passe ne doit jamais être converti à partir d'une String . (Voir la règle KeyStore ici).
Interdite de la méthode : une méthode interdite (bloc Crysl interdit) dans certaines circonstances a été trouvée.
ImpréciseValueExtractionroror : L'analyse statique n'a pas été en mesure d'extraire toutes les informations requises dans le bloc de contraintes CRYSL. Par exemple, la taille des clés peut être fournie comme une valeur répertoriée dans un fichier de configuration. L'analyse statique ne modélise pas le contenu du fichier et peut ne pas contraindre la valeur.
DustateError : Le bloc de commande de Crysl est violé, c'est-à-dire que l'appel de séquence de méthode attendu à faire est incorrect. Par exemple, un objet Signature s'attend à un appel à initSign(key) avant update(data) .
Requis PredicateError : Un objet A s'attend à ce qu'un objet B ait été utilisé correctement (les blocs CRYSL nécessitent et assure). Par exemple, un objet Cipher nécessite qu'un objet SecretKey soit généré correctement et en toute sécurité.
IncompteOperationError : L'utilisation d'un objet peut être incomplète: par exemple, un objet Cipher peut être initialisé mais jamais utilisé pour le décryptage ou le décryptage, cela peut rendre le code mort. Cette erreur dépend fortement du graphique d'appel calculé (CHA par défaut).
UngaughtexceptionError : Une méthode peut lancer une exception, mais l'exception n'est pas prise dans le programme. Par exemple, l'appel de méthode n'est pas entouré d'un bloc d'essai / capture.
CogniCrypt Sast prend en charge différents formats de rapport, qui peuvent être définis en utilisant l'option --reportformat . Les formats pris en charge sont:
CMD : Le rapport est imprimé sur la ligne de commande. Le contenu est équivalent au format de l'option TXT .TXT : Le rapport est écrit dans le fichier texte CryptoAnalysis-Report.txt . Le contenu est équivalent au format de l'option CMD . De plus, les fichiers .jimple des classes, où les abus ont été trouvés, sont sortis. Jimple est une représentation intermédiaire proche de la syntaxe de Java.SARIF : Le rapport est rédigé au fichier JSON CryptoAnalysis-Report.json . Le contenu est formaté dans le format Sarif.CSV : Le rapport est rédigé dans le fichier CSV CryptoAnalysis-Report.csv . Le contenu est formaté dans le format CSV.CSV_SUMMARY : Le rapport est écrit dans le fichier CryptoAnalysis-Report-Summary.csv et contient un résumé des résultats de l'analyse. Par rapport au format CSV , ce format ne fournit pas d'informations concrètes sur les erreurs, il répertorie uniquement la quantité de chaque type d'utilisation abusive. Cette option a été précédemment implémentée par l'option CSV , qui a été modifiée pour fournir des informations plus détaillées sur les erreurs dans le format CSV.GITHUB_ANNOTATION : fonctionne comme CMD mais offre également toutes les violations sous forme d'annotations lorsqu'ils fonctionnent à l'intérieur en tant qu'action GitHub. Si l'option --reportformat n'est pas spécifiée, CogniCrypt Sast par défaut l'option CMD . Il permet également l'utilisation de plusieurs formats différents pour la même analyse (par exemple --reportformat CMD,TXT,CSV crée un rapport, qui est imprimé sur la ligne de commande et est écrit dans un fichier texte et CSV). Si l'option --reportPath <directory_location_for_cryptoanalysis_report> est définie, les rapports (et la visualisation) sont créés dans le répertoire spécifié.
CogniCrypt Sast peut également être exécuté sur des applications Android en utilisant le scanner Android HeadlessAndroidScanner-xyz-jar-with-dependencies.jar . Son utilisation ne s'écarte pas beaucoup de celui de Cognicrypt Sast ordinaire. Il nécessite trois arguments:
--apkFile : le chemin absolu vers le fichier .apk--platformDirectory : le chemin absolu vers les plates-formes Android SDK. Les plates-formes peuvent être obtenues via Android Studio. Sous l'emplacement du SDK Android, vous trouvez des platforms de dossiers. Fournir un sast cognicrypt du chemin vers ce dossier.--rulesDir : le chemin absolu vers le répertoire des règles Crysl. 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>
Les paramètres facultatifs sont --reportPath et --reportFormat . Ils ont les mêmes fonctionnalités que le HeadlessJavaScanner-xyz-jar-with-dependencies.jar (voir ci-dessus).
S'il est spécifié, l'analyse génère un fichier de rapport CogniCrypt-Report.txt avec la sortie .jimple des classes dans lesquelles l'analyse a trouvé des mauvais usages. Le format du fichier de rapport suit celui décrit ci-dessus.
Encore une fois, selon l'application analysée, l'analyse peut nécessiter beaucoup de mémoire et une grande taille de pile. N'oubliez pas de définir la taille du tas nécessaire (par exemple -xmx8g) et la taille de la pile (par exemple -xss60m).
Nous avons HARE HEUREUX pour chaque contribution de la communauté!