該存儲庫包含Cognitrypt Sast ,這是Cognicrypt的靜態分析成分。靜態分析Cognitrypt 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 ,它會在./output/中創建以下圖像visualization.png 。

您可以看到對象r0 (keygenerator)上的兩個ConstraintErrors在對象r1 (secretkey)上引起RequiredPredicateError ,又導致對象r2 (cipher)上的RequiredPredicateError 。此外,密碼對像上還有另一個ConstraintError和IncompleteOperationError 。請注意,變量和語句對應於中間表示jimple。您可以將變量匹配到列出所有分析對象的命令行輸出。
我們提供了認知靜態分析的實施:
CryptoAnalysis包含用於實際分析的組成部分CryptoAnalysisTargets包含各種示例應用程序,這些應用程序也用於測試CryptoAnalyis的正確性我們進一步提供了兩個SAST工具,可以分析Java和Android應用程序:
HeadlessJavaScanner包含分析Java應用程序的SAST工具(見下文)HeadlessAndroidScanner包含分析Android應用的SAST工具(見下文) 您可以在此處查看cognitrypt的預編譯版本。我們建議使用最新版本。您可以在Maven Central上找到Cognitrypt 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)。
Cognicrypt Sast可以用作GitHub動作。
- name : Run CogniCrypt
uses : CROSSINGTUD/CryptoAnalysis@version
with :
appPath : " CryptoAnalysisTargets/HelloWorld/HelloWorld.jar "
basePath : " CryptoAnalysisTargets/HelloWorld "需要配置該appPath以指向應用程序的編譯版本。
basePath用於將分析的jar和源樹中的路徑聯繫起來。在basePath/com/example中搜索com.example類。
有關所有輸入選項,請參見action.yml 。
可以在加密分析寄存器庫中找到如何使用github動作的一個示例。
當代碼不符合CRYSL規則時,Cognicrypt報告了SAST報告的濫用。對於每種濫用,Cognicrypt sast報告了類和濫用所包含的方法。有多種濫用類型:
約束:違反了Crysl規則的約束,例如,鍵的密鑰大小是錯誤的。
Nevertypeoferror :報告何時發現一個值為某種參考類型:例如,絕對不應從String轉換包含密碼的字符數組。 (請參閱此處的KeyStore規則)。
Filbidendmethoderror :在某些情況下發現了一種禁止的方法(禁止Crysl塊)。
ImbreciseValueExtractionError :靜態分析無法提取CRYSL約束塊中所需的所有信息。例如,密鑰大小可以作為配置文件中列出的值提供。靜態分析不會對文件的內容進行建模,並且可能不會限制該值。
passestateError :違反了Crysl的訂單塊,即要進行的預期方法序列呼叫是不正確的。例如, Signature對象期望在更新之前對initSign(key)進行調用update(data) 。
必要的PREDICEWICEERROR :一個對象A期望對象B正確使用(Crysl塊需要並確保)。例如, Cipher對象需要正確並安全地生成一個SecretKey對象。
不完整的呼氣:對象的用法可能不完整:例如,可以初始化Cipher對象,但從未用於啟動或解密,這可能會使代碼死亡。此錯誤在很大程度上取決於計算的呼叫圖(默認情況下為CHA)。
UnneaughtexceptionError :一種方法可能會引發例外,但是該程序並未捕獲該例外。例如,方法調用不會被嘗試/捕獲塊包圍。
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選項已更改以提供有關CSV格式中錯誤的更詳細信息。GITHUB_ANNOTATION :工作類似於CMD ,但在作為GitHub動作內部運行時,所有違規行為都作為註釋。如果未指定--reportformat選項,則Cognicrypt將SAST默認為CMD選項。它還允許使用多種不同格式進行相同的分析(例如--reportformat CMD,TXT,CSV創建一個報告,該報告打印到命令行並將其寫入文本和CSV文件)。如果設置了選項--reportPath <directory_location_for_cryptoanalysis_report> ,則在指定的目錄中創建了報告(和可視化)。
Cognitrypt SAST也可以使用Android Scanner HeadlessAndroidScanner-xyz-jar-with-dependencies.jar在Android應用程序上運行。它的用法與常規Cognitrypt Sast的使用並不多。它需要三個論點:
--apkFile :.apk文件的絕對路徑--platformDirectory :Android SDK平台的絕對路徑。這些平台可通過Android Studio獲得。在Android SDK位置下,您可以找到一個文件夾platforms 。供應Cognicrypt用通往該文件夾的路徑旋轉。--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)。
我們為社區的每一項貢獻感到高興!