يحتوي هذا المستودع على sast cognicrypt ، وهو مكون التحليل الثابت لـ 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 ، ومواقفهم في البرامج الأصلية. بالإضافة إلى ./output/ ، نظرًا لأننا نستخدم --visualization ، فإنه ينشئ الصورة التالية visualization.png

يمكنك أن ترى أن ConstraintErrors على الكائن r0 (keygenerator) يتسببان في حدوث مسار RequiredPredicateError على الكائن r1 (SecretKey) والذي يؤدي بدوره إلى حدوث RequiredPredicateError على الكائن r2 (تشفير). بالإضافة إلى ذلك ، هناك ConstraintError أخرى و IncompleteOperationError على كائن التشفير. لاحظ أن المتغيرات والبيانات تتوافق مع التمثيل الوسيط Jimple. يمكنك مطابقة المتغيرات مع إخراج سطر الأوامر الذي يسرد جميع الكائنات التي تم تحليلها.
نحن نقدم تنفيذ التحليل الثابت لـ 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 . يتطلب البناء على الأقل جافا 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>
لبداية سهلة قمنا بإعداد. جار يحتوي على دروس مع سوء استخدام التشفير. تم العثور على رمز المصدر لهذه المخالفات هنا.
الحجج الإضافية الأخرى التي يمكن استخدامها هي على النحو التالي:
--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 في مستودع التحليل المشفر.
تقارير Cognicrypt SAST تسيء استخدامها عندما لا يكون الرمز متوافقًا مع قواعد CRYSL. لكل سوء استخدام ، تقارير Cognicrypt SAST عن الفصل والطريقة التي يوجد بها سوء الاستخدام. هناك أنواع سوء استخدام متعددة:
القيد : يتم انتهاك قيود قاعدة CRYSL ، على سبيل المثال ، يتم إنشاء مفتاح مع حجم المفتاح الخاطئ.
Nevertypeoferror : تم الإبلاغ عن ذلك عندما تم العثور على قيمة من نوع مرجعي معين: على سبيل المثال ، يجب ألا يتم تحويل مجموعة الأحرف التي تحتوي على كلمة مرور من String . (انظر القاعدة KeyStore هنا).
Forbiddenmethoderror : تم العثور على طريقة ممنوعة (كتلة crysl المحظورة) ليتم استدعاؤها في بعض الحالات.
DiscisterValueExtractionError : لم يتمكن التحليل الثابت من استخراج جميع المعلومات المطلوبة في كتلة قيود CRYSL. على سبيل المثال ، يمكن توفير حجم المفتاح كقيمة مدرجة في ملف التكوين. لا يصمم التحليل الثابت محتوى الملف وقد لا يقيد القيمة.
TypestateRror : يتم انتهاك كتلة الطلب من CRYSL ، أي أن استدعاء تسلسل الطريقة المتوقعة المراد إجراء غير صحيحة. على سبيل المثال ، يتوقع كائن Signature إجراء مكالمة إلى initSign(key) قبل update(data) .
مطلوب predicateRror : كائن A يتوقع استخدام كائن B بشكل صحيح (تتطلب كتل CRYSL وتضمن). على سبيل المثال ، يتطلب كائن Cipher كائن SecretKey إنشاء بشكل صحيح وأمان.
غير مكتمل : قد يكون استخدام كائن ما غير مكتمل: على سبيل المثال ، قد يتم تهيئة كائن Cipher ولكن لم يتم استخدامه مطلقًا في en- أو فك التشفير ، فقد يجعل هذا الرمز ميتًا. يعتمد هذا الخطأ اعتمادًا كبيرًا على الرسم البياني للمكالمة المحسوبة (CHA افتراضيًا).
UncaughtexceptionError : قد يلقي الطريقة استثناء ، ولكن لا يتم اكتشاف الاستثناء في البرنامج. على سبيل المثال ، لا تحيط استدعاء الطريقة بمجموعة المحاولة/الصيد.
يدعم Cognicrypt SAST تنسيقات التقارير المختلفة ، والتي يمكن تعيينها باستخدام خيار --reportformat . التنسيقات المدعومة هي:
CMD : يتم طباعة التقرير إلى سطر الأوامر. المحتوى يعادل التنسيق من خيار TXT .TXT : يتم كتابة التقرير إلى ملف CryptoAnalysis-Report.txt . المحتوى يعادل التنسيق من خيار CMD . بالإضافة إلى ذلك ، يتم إخراج ملفات .jimple من الفئات ، حيث تم العثور على سوء استخدام في ،. Jimple هو تمثيل وسيط بالقرب من بناء جملة Java.SARIF : تم كتابة التقرير إلى ملف CryptoAnalysis-Report.json ملف 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 باستخدام Android Scanner HeadlessAndroidScanner-xyz-jar-with-dependencies.jar . لا ينحرف استخدامه كثيرًا عن 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).
نحن سعداء لكل مساهمة من المجتمع!