Этот репозиторий содержит Cognicrypt SAST , статический компонент анализа для Cognicrypt. Статический анализ Cognicrypt Sast принимает правила, написанные на языке спецификации Crysl в качестве ввода, и выполняет статический анализ, основанный на спецификации правил. Crysl-это специфичный для домена языка (DSL), предназначенный для кодирования спецификаций использования для криптографических лигин (например, JCA, в частности). Более подробную информацию о Crysl и статическом анализе можно найти в этой статье.
Давайте предположим, что у нас есть следующая программа с некоторыми нарушениями:
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
}
}Используя правила JCA, мы выполняем следующую команду в скомпилированной версии этой программы:
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 запускает анализ и печатает отчет в командную строку. В общей сложности он сообщает о 3 ConstraintErrors , 2 RequiredPredicateErrors и 1 IncompleteOperationError и их позиции в исходных программах. Кроме того, поскольку мы используем --visualization , это создает следующую visualization.png изображения. PNG в каталоге ./output/ :

Вы можете видеть, что два ConstraintErrors на объекте r0 (Keygenerator) вызывают RequiredPredicateError на объекте r1 (SecretKey), который, в свою очередь, вызывает RequiredPredicateError на объекте r2 (шифр). Кроме того, на объекте шифра есть еще один ConstraintError и IncompleteOperationError . Обратите внимание, что переменные и операторы соответствуют промежуточному представлению Джимпл. Вы можете сопоставить переменные с выводом командной строки, который перечисляет все проанализированные объекты.
Мы предоставляем реализацию статического анализа Cognicrypt в:
CryptoAnalysis содержит компоненты для фактического анализаCryptoAnalysisTargets содержит различные примерные приложения, которые также используются для проверки правильности криптоанализацииДалее мы предоставляем два инструмента SAST, которые позволяют анализировать приложения Java и Android:
HeadlessJavaScanner содержит инструмент SAST, который анализирует приложения Java (см. Ниже)HeadlessAndroidScanner содержит инструмент SAST, который анализирует приложения Android (см. Ниже) Вы можете проверить предварительно скомпилированную версию Cognicrypt Sast здесь. Мы рекомендуем использовать последнюю версию. Вы можете найти Cognicrypt Sast также на Maven Central.
Cognicrypt Sast использует Maven в качестве инструмента для сборки. Вы можете скомпилировать и создать этот проект через
mvn clean package -DskipTests .
Упакованные артефакты jar , включая все зависимости, можно найти в /apps . Здание требует как минимум Java 17.
Cognicrypt Sast можно начать в режиме без головы в качестве инструмента CLI через файл HeadlessJavaScanner-xyz-jar-with-dependencies.jar . Требуется два аргумента:
java -jar HeadlessJavaScanner-x.y.z-jar-with-dependencies.jar
--rulesDir <path-to-crysl-source-code-format-rules>
--appPath <application-path>
Для легкого начала мы подготовили .JAR, содержащий классы с крипто -неправомерными. Исходный код для этих злоупотреблений найден здесь.
Другие дополнительные аргументы, которые можно использовать, следующие:
--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)
Обратите внимание, что в зависимости от проанализированного приложения, анализ может потребовать большой памяти и большого размера стека. Не забудьте установить необходимый размер кучи (например, -xmx8g) и размер стека (например, -xss60m).
SAST Cognicrypt может использоваться в качестве действия GitHub.
- name : Run CogniCrypt
uses : CROSSINGTUD/CryptoAnalysis@version
with :
appPath : " CryptoAnalysisTargets/HelloWorld/HelloWorld.jar "
basePath : " CryptoAnalysisTargets/HelloWorld " appPath необходимо настроить, чтобы указать на составленную версию вашего приложения.
basePath используется для связывания путей в анализируемой банке и исходном дереве. Класс com.example выполняется в basePath/com/example .
См. action.yml для всех вариантов ввода.
Пример того, как использовать действие GitHub, можно найти в репозитории Cryptoanalysis-Demo.
Cognicrypt Sast сообщает о неправильном обращении, когда код не соответствует правилам CRYSL. Для каждого неправильного использования Cognicrypt Sast сообщает о классе и методе, в котором содержатся неправильное использование. Существует несколько типов неправильного использования:
Ограничение : нарушается ограничение правила CRYSL, например, ключ генерируется с неправильным размером ключа.
NeversyPeOferror : сообщается, когда было обнаружено, что значение имеет определенный тип ссылки: например, массив символов, содержащий пароль, никогда не должен быть преобразован из String . (См. Правило KeyStore здесь).
Forbiddenmethoderror : был обнаружен метод, который запрещен (блок Crysl, запрещен), который при некоторых обстоятельствах обнаруживается.
ImtrecizeValueExtractionError : Статический анализ не смог извлечь всю информацию, необходимую в блоке ограничения CRYSL. Например, размер ключа может быть предоставлен как значение, указанное в файле конфигурации. Статический анализ не моделирует содержание файла и может не ограничивать значение.
TypeStateError : Блок заказов Crysl нарушен, то есть, ожидаемый вызов последовательности метода, который будет выполнен неверен. Например, объект Signature ожидает вызова initSign(key) до update(data) .
Обязательный prodicateerror : объект A ожидает, что объект B будет использоваться правильно (блоки Crysl требуют и обеспечивают). Например, объект Cipher требует, чтобы объект SecretKey был правильно и надежно сгенерирован.
IncopleTeoPerationEerror : использование объекта может быть неполным: например, объект Cipher может быть инициализирован, но никогда не используется для обновления или дешифрования, это может привести к мертвым коду. Эта ошибка в значительной степени зависит от вычисленного графа вызовов (CHA по умолчанию).
UncaughtexceptionError : метод может сделать исключение, но исключение не попадает в программу. Например, вызов метода не окружен блоком Try/Catch.
Cognicrypt Sast поддерживает различные форматы отчетов, которые можно установить с помощью опции --reportformat . Поддерживаемые форматы:
CMD : отчет напечатан в командной строке. Контент эквивалентен формату из опции TXT .TXT : Отчет записан в текстовый файл CryptoAnalysis-Report.txt . Контент эквивалентен формату из параметра CMD . Кроме того, выводятся файлы. Джимпл - это промежуточное представление, близкое к синтаксису Java.SARIF : Отчет записан в файл JSON CryptoAnalysis-Report.json . Содержание отформатируется в формате сари.CSV : отчет записан в CSV-файл CryptoAnalysis-Report.csv . Содержание отформатируется в формате CSV.CSV_SUMMARY : отчет записан в файл CryptoAnalysis-Report-Summary.csv и содержит краткое изложение результатов анализа. По сравнению с форматом CSV этот формат не предоставляет конкретную информацию об ошибках, в нем перечислены только количество каждого типа неправильного использования. Этот вариант был ранее реализован опцией CSV , который был изменен, чтобы предоставить более подробную информацию об ошибках в формате CSV.GITHUB_ANNOTATION : работает как CMD , но также выводит все нарушения как аннотации при работе внутри как действие GitHub. Если опция --reportformat не указана, Cognicrypt sast по умолчанию на вариант CMD . Это также позволяет использовать несколько разных форматов для одного и того же анализа (например --reportformat CMD,TXT,CSV создает отчет, который напечатан в командную строку и записывается в текст и файл CSV). Если опция --reportPath <directory_location_for_cryptoanalysis_report> установлен, отчеты (и визуализация) создаются в указанном каталоге.
Cognicrypt Sast также можно запустить в приложениях Android, используя Android Scanner HeadlessAndroidScanner-xyz-jar-with-dependencies.jar . Его использование не сильно отклоняется от обычного когничрипта Sast . Требуется три аргумента:
--apkFile : абсолютный путь к файлу .apk--platformDirectory : абсолютный путь к платформам Android SDK. Платформы доступны через Android Studio. Под расположением Android SDK вы найдете platforms папок. Поставка Cognicrypt Sast с пути к этой папке.--rulesDir : абсолютный путь к каталогу правил Крисла. 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>
Дополнительные параметры --reportPath и --reportFormat . Они имеют такую же функциональность, как и HeadlessJavaScanner-xyz-jar-with-dependencies.jar (см. Выше).
Если указан, анализ генерирует файл отчета CogniCrypt-Report.txt вместе с выходом .jimple
Опять же, в зависимости от проанализированного приложения, анализ может потребовать большой памяти и большого размера стека. Не забудьте установить необходимый размер кучи (например, -xmx8g) и размер стека (например, -xss60m).
Мы довольны каждому вкладу сообщества!