Este repositorio contiene cognicpt SAST , el componente de análisis estático para cognicrypt. El análisis estático cognicpt SAST toma reglas escritas en el lenguaje de especificación CRYSL como entrada, y realiza un análisis estático basado en la especificación de las reglas. CRYSL es un lenguaje específico de dominio (DSL) diseñado para codificar las especificaciones de uso para las liberarias criptográficas (por ejemplo, la JCA en particular). Puede encontrar más información sobre CRYSL y el análisis estático en este documento.
Supongamos que tenemos el siguiente programa con algunas violaciones:
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
}
}Usando las reglas JCA, ejecutamos el siguiente comando en una versión compilada de este programa:
java -jar HeadlessJavaScanner-x.y.z-jar-with-dependencies.jar --appPath ./Examples.jar --rulesDir ./JCA-CrySL-rules.zip --reportFormat CMD --reportPath ./output/ --visualization Cognricrypt SAST ejecuta el análisis e imprime un informe a la línea de comando. En total, informa 3 ConstraintErrors , 2 RequiredPredicateErrors y 1 IncompleteOperationError , y sus posiciones en los programas originales. Además, dado que usamos --visualization , crea la siguiente imagen visualization.png en el directorio ./output/ :

Puede ver que dos ConstraintErrors en el objeto r0 (KeyGenerator) causan un RequiredPredicateError en el objeto r1 (SecretKey) que a su vez causa un RequiredPredicateError en el objeto r2 (cifrado). Además, hay otro ConstraintError e IncompleteOperationError en el objeto cifrado. Tenga en cuenta que las variables y declaraciones corresponden a la representación intermedia Jimple. Puede hacer coincidir las variables con la salida de línea de comando que enumera todos los objetos analizados.
Proporcionamos la implementación del análisis estático de cognicrypt en:
CryptoAnalysis contiene los componentes para el análisis realCryptoAnalysisTargets contiene varias aplicaciones de ejemplo que también se utilizan para probar la corrección de CryptoanalyisAdemás, proporcionamos dos herramientas SAST que permiten el análisis de aplicaciones Java y Android:
HeadlessJavaScanner contiene la herramienta SAST que analiza las aplicaciones Java (ver más abajo)HeadlessAndroidScanner contiene la herramienta SAST que analiza las aplicaciones de Android (ver más abajo) Puede consultar una versión precompilada de Cognricrypt Sast aquí. Recomendamos usar la última versión. Puede encontrar cognicpt sast también en Maven Central.
Cognricrypt SAST utiliza Maven como herramienta de compilación. Puede compilar y construir este proyecto a través de
mvn clean package -DskipTests .
Los artefactos jar empaquetados, incluidas todas las dependencias, se pueden encontrar en /apps . El edificio requiere al menos Java 17.
Cognricrypt SAST se puede iniciar en modo sin cabeza como herramienta CLI a través del archivo HeadlessJavaScanner-xyz-jar-with-dependencies.jar . Requiere dos argumentos:
java -jar HeadlessJavaScanner-x.y.z-jar-with-dependencies.jar
--rulesDir <path-to-crysl-source-code-format-rules>
--appPath <application-path>
Para un comienzo fácil, preparamos un .JAR que contiene clases con malas criptográficas. El código fuente para estos usos erróneos se encuentra aquí.
Otros argumentos adicionales que se pueden usar son los siguientes:
--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)
Nota, dependiendo de la aplicación analizada, el análisis puede requerir mucha memoria y un gran tamaño de pila. Recuerde establecer el tamaño del montón necesario (por ejemplo, xmx8g) y el tamaño de la pila (por ejemplo, -xss60m).
Cognricrypt SAST se puede usar como una acción de GitHub.
- name : Run CogniCrypt
uses : CROSSINGTUD/CryptoAnalysis@version
with :
appPath : " CryptoAnalysisTargets/HelloWorld/HelloWorld.jar "
basePath : " CryptoAnalysisTargets/HelloWorld " El appPath debe configurarse para señalar una versión compilada de su aplicación.
El basePath se usa para relacionar las rutas en el frasco analizado y el árbol de origen. Se busca la clase com.example en basePath/com/example .
Consulte action.yml para todas las opciones de entrada.
Se puede encontrar un ejemplo de cómo usar la acción GitHub en el repositorio de criptoanálisis-demo.
Cognricrypt informa mal uso cuando el código no cumple con las reglas de CRYSL. Para cada uso indebido, Cognricrypt informa la clase y el método en el que se contiene el mal uso. Hay múltiples tipos de uso indebido:
Restrainterror : se viola una restricción de una regla de CRYSL, por ejemplo, se genera una clave con el tamaño de la clave incorrecto.
NeverTypeFerror : informado cuando se encontró que un valor era de cierto tipo de referencia: por ejemplo, una matriz de caracteres que contiene una contraseña nunca debe convertirse de una String . (Ver regla KeyStore aquí).
ProhibidoMethodError : se encontró un método que está prohibido (bloque de Crysl prohibido) en algunas circunstancias.
ImpreciseValueExtractionError : el análisis estático no pudo extraer toda la información requerida dentro del bloque de restricción CRYSL. Por ejemplo, el tamaño de clave podría suministrarse como un valor enumerado en un archivo de configuración. El análisis estático no modela el contenido del archivo y puede no restricción en el valor.
TypestateError : el bloque de pedidos de CRYSL se viola, es decir, la llamada de secuencia de método esperada para realizarse es incorrecto. Por ejemplo, un objeto Signature espera una llamada a initSign(key) antes de update(data) .
RequiredPredicateError : un objeto A espera que un objeto B se haya usado correctamente (los bloques de CRYSL requieren y asegura). Por ejemplo, un objeto Cipher requiere que un objeto SecretKey se genere de manera correcta y segura.
IncompleteteperationError : el uso de un objeto puede estar incompleto: por ejemplo, un objeto Cipher puede inicializarse pero nunca utilizado para el descifrado, esto puede hacer que el código muera. Este error depende en gran medida del gráfico de llamadas calculadas (CHA de forma predeterminada).
Uncappaging ExceptionError : un método puede lanzar una excepción, pero la excepción no se ve atrapada en el programa. Por ejemplo, la llamada del método no está rodeada por un bloque de try/captación.
Cognricrypt SAST admite diferentes formatos de informe, que se pueden establecer utilizando la opción --reportformat . Los formatos compatibles son:
CMD : El informe se imprime en la línea de comando. El contenido es equivalente al formato de la opción TXT .TXT : el informe se escribe en el archivo de texto CryptoAnalysis-Report.txt . El contenido es equivalente al formato de la opción CMD . Además, se producen los archivos .Jimple de las clases, donde se encontraron malos usuarios. Jimple es una representación intermedia cercana a la sintaxis de Java.SARIF : El informe se escribe en el archivo JSON CryptoAnalysis-Report.json . El contenido está formateado en el formato SARIF.CSV : El informe se escribe en el archivo CSV CryptoAnalysis-Report.csv . El contenido está formateado en el formato CSV.CSV_SUMMARY : El informe se escribe en el archivo CryptoAnalysis-Report-Summary.csv y contiene un resumen de los resultados del análisis. En comparación con el formato CSV , este formato no proporciona información concreta sobre los errores, solo enumera la cantidad de cada tipo de uso indebido. Esta opción fue implementada previamente por la opción CSV , que se ha cambiado para proporcionar información más detallada sobre los errores en el formato CSV.GITHUB_ANNOTATION : funciona como CMD pero también genera todas las violaciones como anotaciones cuando se ejecutan dentro como una acción de GitHub. Si no se especifica la opción --reportformat no se especifica, Cognricrypt SAST es predeterminado a la opción CMD . También permite el uso de múltiples formatos diferentes para el mismo análisis ( --reportformat CMD,TXT,CSV Ej. Si se establece la opción --reportPath <directory_location_for_cryptoanalysis_report> , los informes (y la visualización) se crean en el directorio especificado.
Cognricrypt SAST también se puede ejecutar en aplicaciones de Android utilizando el escáner Android Scanner HeadlessAndroidScanner-xyz-jar-with-dependencies.jar . Su uso no se desvía mucho de Cognricrypt Regular Cognpt Sast . Requiere tres argumentos:
--apkFile : la ruta absoluta al archivo .apk--platformDirectory : la ruta absoluta a las plataformas SDK de Android. Las plataformas se pueden obtener a través de Android Studio. Debajo de la ubicación de Android SDK, encuentre platforms de carpeta. Suministra cognicrypt sast con la ruta a esta carpeta.--rulesDir : el camino absoluto al directorio de las reglas de 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>
Los parámetros opcionales son --reportPath y --reportFormat . Tienen la misma funcionalidad que la HeadlessJavaScanner-xyz-jar-with-dependencies.jar (ver arriba).
Si se especifica, el análisis genera un archivo de informe CogniCrypt-Report.txt junto con la salida .jimple de las clases en el análisis encontró mal uso. El formato del archivo de informe sigue el descrito anteriormente.
Nuevamente, dependiendo de la aplicación analizada, el análisis puede requerir mucha memoria y un gran tamaño de pila. Recuerde establecer el tamaño del montón necesario (por ejemplo, xmx8g) y el tamaño de la pila (por ejemplo, -xss60m).
¡Tenemos felices por cada contribución de la comunidad!