Este repositório contém ciclicrypt sast , o componente de análise estática para o cognicriptria. A análise estática Cogdrypt Sast toma regras escritas na linguagem de especificação Crysl como entrada e realiza uma análise estática com base na especificação das regras. O CRYSL é uma linguagem específica de domínio (DSL) projetada para codificar especificações de uso para os bibomotórios criptográficos (por exemplo, a JCA em particular). Mais informações sobre Crysl e a análise estática podem ser encontradas neste artigo.
Vamos supor que tenhamos o seguinte programa com algumas violações:
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 as regras da JCA, executamos o seguinte comando em uma versão compilada deste programa:
java -jar HeadlessJavaScanner-x.y.z-jar-with-dependencies.jar --appPath ./Examples.jar --rulesDir ./JCA-CrySL-rules.zip --reportFormat CMD --reportPath ./output/ --visualization O Cognicrypt Sast executa a análise e imprime um relatório na linha de comando. No total, ele relata 3 ConstraintErrors , 2 RequiredPredicateErrors e 1 IncompleteOperationError e suas posições nos programas originais. Além disso, como usamos --visualization , ele cria a seguinte visualization.png de imagem.png no diretório ./output/ :

Você pode ver que dois ConstraintErrors no objeto r0 (KeyGenerator) fazem com que um RequiredPredicateError no objeto r1 (SecretKey), que por sua vez, causa um RequiredPredicateError no objeto r2 (cifra). Além disso, existe outro ConstraintError e IncompleteOperationError no objeto cifra. Observe que as variáveis e declarações correspondem à representação intermediária Jimple. Você pode corresponder às variáveis com a saída da linha de comando que lista todos os objetos analisados.
Fornecemos a implementação da análise estática do Cognicrypt em:
CryptoAnalysis contém os componentes para a análise realCryptoAnalysisTargets contém vários aplicativos de exemplo que também são usados para testar a correção do criptoanalyisFornecemos ainda duas ferramentas SAST que permitem a análise dos aplicativos Java e Android:
HeadlessJavaScanner contém a ferramenta SAST que analisa os aplicativos Java (veja abaixo)HeadlessAndroidScanner contém a ferramenta SAST que analisa os aplicativos Android (veja abaixo) Você pode conferir uma versão pré-compilada do Cognicrypt Sast aqui. Recomendamos usar a versão mais recente. Você pode encontrar o Cognicrypt Sast também no Maven Central.
O Cognicrypt Sast usa o Maven como ferramenta de construção. Você pode compilar e construir este projeto via
mvn clean package -DskipTests .
Os artefatos jar embalado, incluindo todas as dependências, podem ser encontrados em /apps . O edifício requer pelo menos Java 17.
O Cognicrypt SAST pode ser iniciado no modo sem cabeça como ferramenta CLI através do arquivo HeadlessJavaScanner-xyz-jar-with-dependencies.jar . Requer dois argumentos:
java -jar HeadlessJavaScanner-x.y.z-jar-with-dependencies.jar
--rulesDir <path-to-crysl-source-code-format-rules>
--appPath <application-path>
Para um começo fácil, preparamos um .jar contendo classes com usos de criptografia. O código -fonte para esses usos incorretos é encontrado aqui.
Outros argumentos adicionais que podem ser usados são os seguintes:
--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, dependendo do aplicativo analisado, a análise pode exigir muita memória e um grande tamanho de pilha. Lembre -se de definir o tamanho necessário da pilha (por exemplo -xmx8g) e o tamanho da pilha (por exemplo -xss60m).
O Sast do Cognicrypt pode ser usado como uma ação do GitHub.
- name : Run CogniCrypt
uses : CROSSINGTUD/CryptoAnalysis@version
with :
appPath : " CryptoAnalysisTargets/HelloWorld/HelloWorld.jar "
basePath : " CryptoAnalysisTargets/HelloWorld " O appPath precisa ser configurado para apontar para uma versão compilada do seu aplicativo.
O basePath é usado para relacionar caminhos no frasco analisado e na árvore de origem. A classe com.example é pesquisada em basePath/com/example .
Consulte action.yml para todas as opções de entrada.
Um exemplo de como usar a ação do GitHub pode ser encontrado no repositório de criptoanálise-Demo.
O Cognicrypt Sast relata mal usos quando o código não está em conformidade com as regras do CRYSL. Para cada uso indevido, o Cognicrypt Sast relata a classe e o método em que o uso indevido está contido. Existem vários tipos de uso indevido:
RESTANTERROR : Uma restrição de uma regra Crysl é violada, por exemplo, uma chave é gerada com o tamanho da chave errado.
Nottypeoperror : relatado quando um valor foi considerado de um determinado tipo de referência: por exemplo, uma matriz de caracteres que contém uma senha nunca deve ser convertida em uma String . (Consulte a regra KeyStore aqui).
ForbiddenMethodError : Um método que é proibido (Bloco Crysl proibido) a ser chamado em algumas circunstâncias foi encontrado.
ImpreciseValueExtractionError : A análise estática não foi capaz de extrair todas as informações necessárias dentro do bloco de restrição Crysl. Por exemplo, o tamanho da chave pode ser fornecido como um valor listado em um arquivo de configuração. A análise estática não modela o conteúdo do arquivo e pode não restringir o valor.
TypestateError : O bloco de pedidos do CRYSL é violado, ou seja, a chamada de sequência de métodos esperada a ser feita está incorreta. Por exemplo, um objeto Signature espera uma chamada para initSign(key) antes da update(data) .
RequerDPredicateError : um objeto A espera que um objeto B tenha sido usado corretamente (os blocos Crysl exigem e garantem). Por exemplo, um objeto Cipher exige que um objeto SecretKey seja gerado corretamente e com segurança.
IncompleteOperationError : O uso de um objeto pode ser incompleto: por exemplo, um objeto Cipher pode ser inicializado, mas nunca usado para en outção, isso pode tornar o código morto. Este erro depende muito do gráfico de chamadas calculadas (CHA por padrão).
UNVAGHTEXCECCONTE ERROR : Um método pode lançar uma exceção, mas a exceção não é capturada no programa. Por exemplo, a chamada do método não é cercada por um bloco de tentativa/captura.
O Cognicrypt SAST suporta diferentes formatos de relatório, que podem ser definidos usando --reportformat Opção. Os formatos suportados são:
CMD : O relatório é impresso na linha de comando. O conteúdo é equivalente ao formato da opção TXT .TXT : O relatório é gravado no arquivo de texto CryptoAnalysis-Report.txt . O conteúdo é equivalente ao formato da opção CMD . Além disso, os arquivos .jimple das classes, onde os usos foram encontrados, são emitidos. Jimple é uma representação intermediária próxima à sintaxe de Java.SARIF : O relatório é escrito para o arquivo json CryptoAnalysis-Report.json . O conteúdo é formatado no formato SARIF.CSV : O relatório é gravado no arquivo CSV CryptoAnalysis-Report.csv . O conteúdo é formatado no formato CSV.CSV_SUMMARY : o relatório é gravado no arquivo CryptoAnalysis-Report-Summary.csv e contém um resumo dos resultados da análise. Comparado ao formato CSV , este formato não fornece informações concretas sobre os erros, ele lista apenas a quantidade de cada tipo de uso indevido. Esta opção foi implementada anteriormente pela opção CSV , que foi alterada para fornecer informações mais detalhadas sobre os erros no formato CSV.GITHUB_ANNOTATION : funciona como CMD , mas também gera todas as violações como anotações ao correr como uma ação do GitHub. Se a opção --reportformat não for especificada, o CogniCrypt SAST padrão na opção CMD . Ele também permite o uso de vários formatos diferentes para a mesma análise (por exemplo --reportformat CMD,TXT,CSV cria um relatório, que é impresso na linha de comando e é gravado em um arquivo de texto e CSV). Se a opção --reportPath <directory_location_for_cryptoanalysis_report> estiver definida, os relatórios (e a visualização) forem criados no diretório especificado.
O Cognicrypt SAST também pode ser executado em aplicativos Android usando o scanner Android HeadlessAndroidScanner-xyz-jar-with-dependencies.jar . Seu uso não se desvia muito do cognicrypt regular Sast . Requer três argumentos:
--apkFile : o caminho absoluto para o arquivo .apk--platformDirectory : o caminho absoluto para as plataformas Android SDK. As plataformas são obtidas via Android Studio. Sob o local do Android SDK, você encontra platforms de pastas. Forneça o Cogdrypt Sast com o caminho para esta pasta.--rulesDir : O caminho absoluto para o diretório das regras do 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>
Os parâmetros opcionais são --reportPath e --reportFormat . Eles têm a mesma funcionalidade que a HeadlessJavaScanner-xyz-jar-with-dependencies.jar (veja acima).
Se especificado, a análise gera um arquivo de relatório CogniCrypt-Report.txt , juntamente com a saída .jimple das classes que a análise encontrou em uso indevido. O formato do arquivo de relatório segue o descrito acima.
Novamente, dependendo do aplicativo analisado, a análise pode exigir muita memória e um grande tamanho de pilha. Lembre -se de definir o tamanho necessário da pilha (por exemplo -xmx8g) e o tamanho da pilha (por exemplo -xss60m).
Ficamos felizes por cada contribuição da comunidade!