이 저장소에는 Cognyrypt의 정적 분석 구성 요소 인 Cognyryps Sast가 포함되어 있습니다. 정적 분석 Cognicrypt Sast는 Specification Language Crysl에 입력으로 작성된 규칙을 입력하고 규칙의 사양에 따라 정적 분석을 수행합니다. CRYSL은 암호화 적 Libaries (예 : JCA)에 대한 사용 사양을 인코딩하도록 설계된 도메인 별 언어 (DSL)입니다. 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 만듭니다 ./output/ :

객체 r0 (keygenerator)의 두 개의 ConstraintErrors 인해 객체 r1 (SecretKey)의 RequiredPredicateError 오류가 발생하여 객체 r2 (Cipher)의 RequiredPredicateError 기가 발생한다는 것을 알 수 있습니다. 또한 암호 물체에는 다른 ConstraintError 및 IncompleteOperationError 있습니다. 변수와 명령문은 중간 표현 Jimple에 해당합니다. 분석 된 모든 객체를 나열한 명령 줄 출력에 변수를 일치시킬 수 있습니다.
우리는 Cognicrypt의 정적 분석 구현을 제공합니다.
CryptoAnalysis 에는 실제 분석의 구성 요소가 포함되어 있습니다CryptoAnalysisTargets 에는 cryptoanalyis의 정확성을 테스트하는 데 사용되는 다양한 예제 응용 프로그램이 포함되어 있습니다.또한 Java 및 Android 응용 프로그램을 분석 할 수있는 두 가지 SAST 도구를 제공합니다.
HeadlessJavaScanner Java 응용 프로그램을 분석하는 SAST 도구가 포함되어 있습니다 (아래 참조)HeadlessAndroidScanner Android 응용 프로그램을 분석하는 SAST 도구가 포함되어 있습니다 (아래 참조) 여기에서 사전 컴파일 된 버전의 Cognicrypt Sast를 확인할 수 있습니다. 최신 버전을 사용하는 것이 좋습니다. Maven Central에서도 Cognicrypt Sast를 찾을 수 있습니다.
Cognicrypt Sast는 Maven을 빌드 도구로 사용합니다. 이 프로젝트를 컴파일하고 구축 할 수 있습니다
mvn clean package -DskipTests .
모든 종속성을 포함한 포장 된 jar 아티팩트는 /apps 에서 찾을 수 있습니다. 건물에는 적어도 Java 17이 필요합니다.
Cognicrypt Sast는 HeadlessJavaScanner-xyz-jar-with-dependencies.jar 통해 CLI 도구로 헤드리스 모드로 시작할 수 있습니다. 두 가지 인수가 필요합니다.
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)를 설정하십시오.
Cognyrypt Sast는 Github 동작으로 사용될 수 있습니다.
- name : Run CogniCrypt
uses : CROSSINGTUD/CryptoAnalysis@version
with :
appPath : " CryptoAnalysisTargets/HelloWorld/HelloWorld.jar "
basePath : " CryptoAnalysisTargets/HelloWorld " appPath 컴파일 된 응용 프로그램 버전을 가리 키도록 구성되어야합니다.
basePath 분석 된 JAR 및 소스 트리의 경로를 관련시키는 데 사용됩니다. com.example 클래스는 basePath/com/example 에서 검색됩니다.
모든 입력 옵션은 action.yml 참조하십시오.
github 동작 사용 방법의 예는 cryptoanalysis-demo 저장소에서 찾을 수 있습니다.
Cognicrypt Sast는 코드가 CRYSL 규칙을 준수하지 않을 때 오용을보고합니다. 각 오용에 대해 Cognicrypt Sast는 클래스와 오용이 포함 된 방법을보고합니다. 여러 오용 유형이 있습니다.
Constrainterror : CRYSL 규칙의 제약 조건이 위반됩니다. 예를 들어 키는 잘못된 키 크기로 키가 생성됩니다.
NEVERTYPEOFERROR : 값이 특정 참조 유형 인 것으로보고 된 경우보고 : 예를 들어 비밀번호를 포함하는 문자 배열은 String 에서 결코 변환해서는 안됩니다. (여기에서 KeyStore 규칙을 참조하십시오).
ForbiddenMethoderror : 어떤 상황에서도 호출되는 금지 된 방법 (Crysl Block 금지)이 발견되었습니다.
impreciseValueExtractionError : 정적 분석은 CRYSL 제약 블록 내에서 필요한 모든 정보를 추출 할 수 없었습니다. 예를 들어 키 크기는 구성 파일에 나열된 값으로 제공 될 수 있습니다. 정적 분석은 파일의 컨텐츠를 모델링하지 않으며 값에 대한 제한을 제한하지 않을 수 있습니다.
typestateError : CRYSL의 주문 블록이 위반됩니다. 즉, 예상 방법 시퀀스 호출이 잘못되었습니다. 예를 들어, Signature 객체는 update(data) 전에 initSign(key) 으로 호출을 기대합니다.
requestRedicateError : 객체 A는 객체 B가 올바르게 사용되었다고 기대합니다 (CRYSL 블록은 필요하고 보장합니다). 예를 들어 Cipher 객체는 SecretKey 객체를 정확하고 안전하게 생성해야합니다.
불완전한 오퍼레이터 : 객체의 사용이 불완전 할 수 있습니다. 예를 들어 Cipher 객체는 초기화 될 수 있지만 방해 또는 암호 해독에 사용되지 않으면 코드가 죽을 수 있습니다. 이 오류는 계산 된 통화 그래프 (기본적으로 CHA)에 크게 의존합니다.
uncaughtexceptionError : 메소드는 예외를 던질 수 있지만 프로그램에서는 예외가 없습니다. 예를 들어, 메소드 호출은 시도/캐치 블록으로 둘러싸여 있지 않습니다.
Cognicrypt Sast는 다른 보고서 형식을 지원하며 --reportformat 옵션을 사용하여 설정할 수 있습니다. 지원되는 형식은 다음과 같습니다.
CMD : 보고서는 명령 줄에 인쇄됩니다. 컨텐츠는 TXT 옵션의 형식과 동일합니다.TXT : 보고서는 텍스트 파일 CryptoAnalysis-Report.txt 에 기록됩니다. 컨텐츠는 CMD 옵션의 형식과 동일합니다. 또한, 오용이 발견 된 클래스의 .jimple 파일은 출력입니다. Jimple은 Java의 구문에 가까운 중간 표현입니다.SARIF : 보고서는 JSON 파일 CryptoAnalysis-Report.json 에 기록됩니다. 내용은 SARIF 형식으로 형식화됩니다.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 스캐너 HeadlessAndroidScanner-xyz-jar-with-dependencies.jar 사용하여 Android 응용 프로그램에서도 실행할 수 있습니다. 그 사용법은 정기적 인 Cognicryps Sast 에서 크게 벗어나지 않습니다. 세 가지 논쟁이 필요합니다.
--apkFile : .apk 파일의 절대 경로--platformDirectory : Android SDK 플랫폼의 절대 경로. 플랫폼은 Android Studio를 통해 얻을 수 있습니다. Android SDK 위치에서 폴더 platforms 있습니다. 이 폴더의 경로를 Cognicrypt Sast 에 공급하십시오.--rulesDir : 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>
선택적 매개 변수는 --reportPath 및 --reportFormat 입니다. 그것들은 HeadlessJavaScanner-xyz-jar-with-dependencies.jar 와 동일한 기능을 가지고 있습니다 (위 참조).
지정된 경우 분석은 보고서 파일 CogniCrypt-Report.txt 와 함께 클래스의 .jimple 출력과 함께 분석이 발견 된 오용을 생성합니다. 보고서 파일의 형식은 위에서 설명한 것의 형식을 따릅니다.
다시, 분석 된 응용 프로그램에 따라 분석에는 많은 메모리와 큰 스택 크기가 필요할 수 있습니다. 필요한 힙 크기 (예 : -xmx8g)와 스택 크기 (예 : -xss60m)를 설정하십시오.
우리는 지역 사회의 모든 기여에 대해 행복합니다!