ที่เก็บนี้มี Cognicrypt Sast ซึ่งเป็นองค์ประกอบการวิเคราะห์แบบคงที่สำหรับ Cognicrypt การวิเคราะห์แบบคงที่ Cognicrypt SAST ใช้กฎที่เขียนไว้ในข้อกำหนดภาษา CrysL เป็นอินพุตและดำเนินการวิเคราะห์แบบคงที่ตามข้อกำหนดของกฎ CRYSL เป็นภาษาเฉพาะโดเมน (DSL) ที่ออกแบบมาเพื่อเข้ารหัสข้อมูลจำเพาะการใช้งานสำหรับ libaries cryptographic (เช่น 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 ในไดเรกทอรี ./output/ output/:

คุณจะเห็นได้ว่า ConstraintErrors สองข้อบนวัตถุ r0 (Keygenerator) ทำให้เกิด RequiredPredicateError บนวัตถุ r1 (SecretKey) ซึ่งจะทำให้เกิด RequiredPredicateError บนวัตถุ r2 (cipher) นอกจากนี้ยังมี ConstraintError อื่น ๆ และ IncompleteOperationError บนวัตถุ Cipher โปรดทราบว่าตัวแปรและคำสั่งสอดคล้องกับการเป็นตัวแทนระดับกลาง Jimple คุณสามารถจับคู่ตัวแปรกับเอาต์พุตบรรทัดคำสั่งที่แสดงรายการวัตถุที่วิเคราะห์ทั้งหมด
เราให้การดำเนินการวิเคราะห์แบบคงที่ของ cognicrypt ใน:
CryptoAnalysis มีส่วนประกอบสำหรับการวิเคราะห์จริงCryptoAnalysisTargets มีแอปพลิเคชันตัวอย่างต่าง ๆ ที่ใช้ในการทดสอบความถูกต้องของ cryptoanalyisเรายังมีเครื่องมือ 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 ที่มีชั้นเรียนที่มี crypto misuses ซอร์สโค้ดสำหรับการใช้งานในทางที่ผิดเหล่านี้พบได้ที่นี่
อาร์กิวเมนต์เพิ่มเติมอื่น ๆ ที่สามารถใช้ได้มีดังนี้:
--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 ใช้เพื่อเชื่อมโยงเส้นทางในขวดที่วิเคราะห์และต้นไม้ต้นทาง คลาส com.example ถูกค้นหาที่ basePath/com/example
ดู action.yml สำหรับตัวเลือกอินพุตทั้งหมด
ตัวอย่างของวิธีการใช้การกระทำของ GitHub สามารถพบได้ในที่เก็บ cryptoanalysis-demo
Cognicrypt Sast รายงานผิดเมื่อรหัสไม่สอดคล้องกับกฎ Crysl สำหรับการใช้งาน ใน ทางที่ผิดแต่ละครั้ง
ข้อ จำกัด : ข้อ จำกัด ของกฎ Crysl ถูกละเมิดเช่นคีย์ถูกสร้างขึ้นด้วยขนาดคีย์ที่ไม่ถูกต้อง
Nevertypeoferror : รายงานเมื่อพบว่าค่าเป็นประเภทอ้างอิงที่แน่นอน: ตัวอย่างเช่นอาร์เรย์อักขระที่มีรหัสผ่านไม่ควรถูกแปลงจาก String (ดูกฎ KeyStore ที่นี่)
ForbiddenMethodError : วิธีการที่ห้าม (CRYSL Block ต้องห้าม) ที่จะเรียกว่าภายใต้สถานการณ์บางอย่าง
imprecisevalueExtractionError : การวิเคราะห์แบบคงที่ไม่สามารถแยกข้อมูลทั้งหมดที่จำเป็นภายในบล็อกข้อ จำกัด CRYSL ตัวอย่างเช่นขนาดคีย์สามารถระบุได้เป็นค่าที่ระบุไว้ในไฟล์กำหนดค่า การวิเคราะห์แบบคงที่ไม่ได้จำลองเนื้อหาของไฟล์และอาจไม่ จำกัด ค่า
TypestateRoror : การละเมิดคำสั่งซื้อของ CRYSL นั้นคือการละเมิดลำดับวิธีการที่คาดว่าจะทำไม่ถูกต้อง ตัวอย่างเช่นวัตถุ Signature คาดว่าจะมีการเรียกใช้ initSign(key) ก่อน update(data)
จำเป็นต้องใช้ PredicateRor : วัตถุ A คาดว่าวัตถุ B จะถูกใช้อย่างถูกต้อง (บล็อก CRYSL ต้องการและรับรอง) ตัวอย่างเช่นวัตถุ Cipher ต้องการวัตถุ SecretKey อย่างถูกต้องและสร้างขึ้นอย่างปลอดภัย
UncompleteOperationError : การใช้วัตถุอาจไม่สมบูรณ์: ตัวอย่างเช่นวัตถุ Cipher อาจเริ่มต้น แต่ไม่เคยใช้สำหรับการถอดรหัสหรือการถอดรหัสซึ่งอาจทำให้รหัสตาย ข้อผิดพลาดนี้ขึ้นอยู่กับกราฟการโทรที่คำนวณได้ (Cha โดยค่าเริ่มต้น)
UncaughtexceptionError : วิธีการอาจทำให้เกิดข้อยกเว้น แต่ข้อยกเว้นไม่ได้ถูกจับในโปรแกรม ตัวอย่างเช่นการเรียกวิธีการไม่ได้ล้อมรอบด้วยการลอง/จับบล็อก
Cognicrypt Sast รองรับรูปแบบรายงานที่แตกต่างกันซึ่งสามารถตั้งค่าได้โดยใช้ตัวเลือก --reportformat รูปแบบที่รองรับคือ:
CMD : รายงานถูกพิมพ์ไปยังบรรทัดคำสั่ง เนื้อหาเทียบเท่ากับรูปแบบจากตัวเลือก TXTTXT : รายงานถูกเขียนลงในไฟล์ข้อความ CryptoAnalysis-Report.txt เนื้อหาเทียบเท่ากับรูปแบบจากตัวเลือก CMD นอกจากนี้ไฟล์. jimple ของคลาสที่พบในทางที่ผิดคือเอาต์พุต Jimple เป็นตัวแทนระดับกลางใกล้กับไวยากรณ์ของ JavaSARIF : รายงานถูกเขียนไปยังไฟล์ JSON CryptoAnalysis-Report.json เนื้อหาถูกจัดรูปแบบในรูปแบบ SARIFCSV : รายงานถูกเขียนไปยังไฟล์ CSV CryptoAnalysis-Report.csv เนื้อหาถูกจัดรูปแบบในรูปแบบ CSVCSV_SUMMARY : รายงานถูกเขียนลงในไฟล์ CryptoAnalysis-Report-Summary.csv และมีบทสรุปของผลการวิเคราะห์ เมื่อเปรียบเทียบกับรูปแบบ CSV รูปแบบนี้ไม่ได้ให้ข้อมูลที่เป็นรูปธรรมเกี่ยวกับข้อผิดพลาด แต่จะแสดงเฉพาะจำนวนของแต่ละประเภทการใช้ในทางที่ผิดเท่านั้น ตัวเลือกนี้ถูกนำไปใช้ก่อนหน้านี้โดยตัวเลือก CSV ซึ่งมีการเปลี่ยนแปลงเพื่อให้ข้อมูลรายละเอียดเพิ่มเติมเกี่ยวกับข้อผิดพลาดในรูปแบบ CSVGITHUB_ANNOTATION : ทำงานเหมือน CMD แต่ยังส่งออกการละเมิดทั้งหมดเป็นคำอธิบายประกอบเมื่อทำงานภายในเป็นการกระทำของ GitHub หาก ไม่ได้ระบุตัว CMD --reportformat นอกจากนี้ยังอนุญาตให้ใช้รูปแบบที่แตกต่างกันหลายรูปแบบสำหรับการวิเคราะห์เดียวกัน (เช่น --reportformat CMD,TXT,CSV สร้างรายงานซึ่งพิมพ์ลงในบรรทัดคำสั่งและเขียนลงในไฟล์ข้อความและ CSV) หากตัวเลือก --reportPath <directory_location_for_cryptoanalysis_report> ถูกตั้งค่ารายงาน (และการสร้างภาพ) จะถูกสร้างขึ้นในไดเรกทอรีที่ระบุ
Cognicrypt Sast ยังสามารถทำงานบนแอพพลิเคชั่น Android โดยใช้ Android Scanner HeadlessAndroidScanner-xyz-jar-with-dependencies.jar การใช้งานของมันไม่ได้เบี่ยงเบนไปจาก Cognicrypt 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)
เรามีความสุขสำหรับการบริจาคทุกครั้งจากชุมชน!