Repositori ini berisi SAST cognicrypt, komponen analisis statis untuk kognisi. Analisis statis Cognicrypt SAST mengambil aturan yang ditulis dalam spesifikasi bahasa CRYSL sebagai input, dan melakukan analisis statis berdasarkan spesifikasi aturan. CRYSL adalah bahasa khusus domain (DSL) yang dirancang untuk menyandikan spesifikasi penggunaan untuk persatuan kriptografi (misalnya, JCA khususnya). Informasi lebih lanjut tentang CRYSL dan analisis statis dapat ditemukan dalam makalah ini.
Mari kita asumsikan kita memiliki program berikut dengan beberapa pelanggaran:
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
}
}Menggunakan aturan JCA, kami menjalankan perintah berikut pada versi yang dikompilasi dari program ini:
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 menjalankan analisis dan mencetak laporan ke baris perintah. Secara total, ia melaporkan 3 ConstraintErrors , 2 RequiredPredicateErrors dan 1 IncompleteOperationError , dan posisinya dalam program asli. Selain itu, karena kami menggunakan --visualization , ia menciptakan visualization.png gambar berikut.png di direktori ./output/ :

Anda dapat melihat bahwa dua ConstraintErrors pada objek r0 (KeyGenerator) menyebabkan RequiredPredicateError pada objek r1 (Secretkey) yang pada gilirannya menyebabkan RequiredPredicateError pada objek r2 (cipher). Selain itu, ada ConstraintError dan IncompleteOperationError lain pada objek Cipher. Perhatikan bahwa variabel dan pernyataan sesuai dengan representasi menengah Jimple. Anda dapat mencocokkan variabel dengan output baris perintah yang mencantumkan semua objek yang dianalisis.
Kami menyediakan implementasi analisis statis kognisi dalam:
CryptoAnalysis berisi komponen untuk analisis aktualCryptoAnalysisTargets berisi berbagai contoh aplikasi yang juga digunakan untuk menguji kebenaran cryptoanalyisKami selanjutnya menyediakan dua alat SAST yang memungkinkan analisis aplikasi Java dan Android:
HeadlessJavaScanner berisi alat SAST yang menganalisis aplikasi Java (lihat di bawah)HeadlessAndroidScanner berisi alat SAST yang menganalisis aplikasi Android (lihat di bawah) Anda dapat checkout versi cognicrypt yang telah dikompilasi sebelumnya di sini. Kami merekomendasikan menggunakan versi terbaru. Anda dapat menemukan sast cognicrypt juga di Maven Central.
Cognicrypt SAST menggunakan Maven sebagai alat build. Anda dapat mengkompilasi dan membangun proyek ini melalui
mvn clean package -DskipTests .
Artefak jar yang dikemas termasuk semua dependensi dapat ditemukan di /apps . Bangunan membutuhkan setidaknya Java 17.
Cognicrypt SAST dapat dimulai dalam mode headless sebagai alat CLI melalui file HeadlessJavaScanner-xyz-jar-with-dependencies.jar . Itu membutuhkan dua argumen:
java -jar HeadlessJavaScanner-x.y.z-jar-with-dependencies.jar
--rulesDir <path-to-crysl-source-code-format-rules>
--appPath <application-path>
Untuk awal yang mudah, kami menyiapkan .Jar yang berisi kelas dengan penyalahgunaan crypto. Kode sumber untuk penyalahgunaan ini ditemukan di sini.
Argumen tambahan lain yang dapat digunakan adalah sebagai berikut:
--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)
Catatan, tergantung pada aplikasi yang dianalisis, analisis mungkin memerlukan banyak memori dan ukuran tumpukan yang besar. Ingatlah untuk mengatur ukuran tumpukan yang diperlukan (misalnya -xmx8g) dan ukuran tumpukan (misalnya -xss60m).
Sast cognicrypt dapat digunakan sebagai tindakan github.
- name : Run CogniCrypt
uses : CROSSINGTUD/CryptoAnalysis@version
with :
appPath : " CryptoAnalysisTargets/HelloWorld/HelloWorld.jar "
basePath : " CryptoAnalysisTargets/HelloWorld " appPath perlu dikonfigurasi untuk menunjuk ke versi yang dikompilasi dari aplikasi Anda.
basePath digunakan untuk menghubungkan jalur dalam toples yang dianalisis dan pohon sumber. Kelas com.example dicari di basePath/com/example .
Lihat action.yml untuk semua opsi input.
Contoh cara menggunakan tindakan github dapat ditemukan di repositori cryptoanalysis-demo.
Cognicrypt SAST melaporkan menyalahgunakan ketika kode tidak sesuai dengan aturan CRYSL. Untuk setiap penyalahgunaan, Cognicrypt SAST melaporkan kelas dan metode penyalahgunaan yang terkandung. Ada beberapa jenis penyalahgunaan:
ConstrainTerRor : Kendala aturan crysl dilanggar, misalnya, kunci dihasilkan dengan ukuran kunci yang salah.
NeverTypeOfError : Dilaporkan ketika nilai ditemukan dari jenis referensi tertentu: misalnya, array karakter yang berisi kata sandi tidak boleh dikonversi dari String . (Lihat aturan KeyStore di sini).
ForbiddenMethoderror : Suatu metode yang dilarang (blok crysl terlarang) dipanggil dalam beberapa keadaan ditemukan.
DiprecisevalueExtractionError : Analisis statis tidak dapat mengekstrak semua informasi yang diperlukan dalam blok Crysl Constrain. Misalnya ukuran kunci dapat dipasok sebagai nilai yang tercantum dalam file konfigurasi. Analisis statis tidak memodelkan konten file dan mungkin tidak membatasi nilai.
LypeTateError : Blok pesanan CRYSL dilanggar, yaitu, panggilan urutan metode yang diharapkan yang akan dilakukan tidak benar. Misalnya, objek Signature mengharapkan panggilan untuk initSign(key) sebelum update(data) .
DiperlukanePredicateError : Suatu objek A mengharapkan objek B yang telah digunakan dengan benar (blok crysl membutuhkan dan memastikan). Misalnya objek Cipher membutuhkan objek SecretKey untuk dihasilkan dengan benar dan aman.
Tidak Lengkap operasi : Penggunaan suatu objek mungkin tidak lengkap: misalnya objek Cipher dapat diinisialisasi tetapi tidak pernah digunakan untuk en- atau dekripsi, ini dapat membuat kode mati. Kesalahan ini sangat tergantung pada grafik panggilan yang dihitung (Cha secara default).
UncaughtExceptionError : Suatu metode dapat melemparkan pengecualian, tetapi pengecualian tidak terperangkap dalam program. Misalnya, panggilan metode tidak dikelilingi oleh blok mencoba/menangkap.
Cognicrypt SAST mendukung berbagai format laporan, yang dapat diatur dengan menggunakan opsi --reportformat . Format yang didukung adalah:
CMD : Laporan dicetak ke baris perintah. Konten setara dengan format dari opsi TXT .TXT : Laporan ini ditulis ke file teks CryptoAnalysis-Report.txt . Konten setara dengan format dari opsi CMD . Selain itu, file .jimple dari kelas, di mana penyalahgunaan ditemukan di, adalah output. Jimple adalah representasi perantara yang dekat dengan sintaks Java.SARIF : Laporan ini ditulis ke file JSON CryptoAnalysis-Report.json . Konten diformat dalam format Sarif.CSV : Laporan ini ditulis ke file CSV CryptoAnalysis-Report.csv . Konten diformat dalam format CSV.CSV_SUMMARY : Laporan ini ditulis ke file CryptoAnalysis-Report-Summary.csv dan berisi ringkasan hasil analisis. Dibandingkan dengan format CSV , format ini tidak memberikan informasi konkret tentang kesalahan, itu hanya mencantumkan jumlah masing -masing jenis penyalahgunaan. Opsi ini sebelumnya diimplementasikan oleh opsi CSV , yang telah diubah untuk memberikan informasi yang lebih rinci tentang kesalahan dalam format CSV.GITHUB_ANNOTATION : Bekerja seperti CMD tetapi juga menghasilkan semua pelanggaran sebagai anotasi saat berjalan di dalam sebagai tindakan GitHub. Jika opsi --reportformat tidak ditentukan, cognicrypt SAST default ke opsi CMD . Ini juga memungkinkan penggunaan beberapa format yang berbeda untuk analisis yang sama (misalnya --reportformat CMD,TXT,CSV membuat laporan, yang dicetak ke baris perintah dan ditulis ke teks dan file CSV). Jika opsi --reportPath <directory_location_for_cryptoanalysis_report> diatur, laporan (dan visualisasi) dibuat dalam direktori yang ditentukan.
Cognicrypt SAST juga dapat dijalankan pada aplikasi Android menggunakan android scanner HeadlessAndroidScanner-xyz-jar-with-dependencies.jar . Penggunaannya tidak banyak menyimpang dari kognisi reguler Sast . Itu membutuhkan tiga argumen:
--apkFile : jalur absolut ke file .apk--platformDirectory : Jalur absolut ke platform Android SDK. Platform dapat diperoleh melalui Android Studio. Di bawah lokasi Android SDK Anda menemukan platforms folder. Suplai kognisi sast dengan jalur ke folder ini.--rulesDir : Jalan absolut ke direktori aturan 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>
Parameter opsional adalah --reportPath dan --reportFormat . Mereka memiliki fungsionalitas yang sama dengan HeadlessJavaScanner-xyz-jar-with-dependencies.jar (lihat di atas).
Jika ditentukan, analisis menghasilkan file laporan CogniCrypt-Report.txt bersama dengan output .jimple dari kelas yang ditemukan analisis dalam. Format file laporan berikut yang dijelaskan di atas.
Sekali lagi, tergantung pada aplikasi yang dianalisis, analisis mungkin memerlukan banyak memori dan ukuran tumpukan yang besar. Ingatlah untuk mengatur ukuran tumpukan yang diperlukan (misalnya -xmx8g) dan ukuran tumpukan (misalnya -xss60m).
Kami bahagia untuk setiap kontribusi dari komunitas!