ที่เก็บนี้ใช้เครื่องมือในการตรวจสอบว่าแพตช์นั้นมั่นใจได้ถึงการติดตามความเท่าเทียมกัน (PATE)
เป้าหมายคือเพื่อพิสูจน์ว่าแพตช์ความปลอดภัยที่ใช้กับไบนารีจะลบพฤติกรรมที่ไม่ดีเท่านั้น Verifier รองรับ PowerPC และ Aarch32 ไบนารี (ปัจจุบันต้องการ ELF Binaries ที่เชื่อมโยงแบบคงที่)
วิธีที่เร็วที่สุดในการเริ่มต้นคือการสร้างอิมเมจนักเทียบท่าและใช้เครื่องมือผ่าน Docker สำหรับคำแนะนำในการสร้างเชิงลึกเพิ่มเติมดูที่ส่วนการพัฒนาด้านล่าง
ก่อนอื่นให้สร้างอิมเมจนักเทียบท่าด้วยคำสั่ง:
Docker build -platform linux/amd64 -t Pate
จากนั้นเรียกใช้ตัวตรวจสอบในตัวอย่าง:
Docker Run - -rm -it -platform linux/amd64 -v "$ (pwd)"/tests/integration/packet/exe:/target pate -original /target/packet.exe -patched /target/packet.patched.exe -s
ตัวตรวจสอบยอมรับอาร์กิวเมนต์บรรทัดคำสั่งต่อไปนี้:
-H,-ช่วยแสดงข้อความความช่วยเหลือนี้
-O,-Binary Original Exe Original Original
-P,-Binary Binary Patched Exe ที่ได้รับการแก้ไข
-B,-ข้อมูลบล็อกชื่อ Filenfo Blockinfo ที่เกี่ยวข้องกับไบนารี
-S,-StartSymbol Arg เริ่มวิเคราะห์จากฟังก์ชั่นด้วยสัญลักษณ์นี้
-d,-Nodiscovery ไม่ค้นพบคู่ฟังก์ชั่นแบบไดนามิกตาม
โทร.
-solver arg solver SMT เพื่อใช้ในการแก้ปัญหาการตรวจสอบ
เงื่อนไข. หนึ่งใน CVC4, Yices หรือ Z3
(ค่าเริ่มต้น: yices)
-goal-timeout arg การหมดเวลาสำหรับการตรวจสอบเป้าหมายของแต่ละบุคคลในไม่กี่วินาที
(ค่าเริ่มต้น: 300)
-heuristic-timeout arg การหมดเวลาสำหรับการตรวจสอบเป้าหมายการแก้ปัญหาในไม่กี่วินาที
(ค่าเริ่มต้น: 10)
-original-anvill-hints arg
วิเคราะห์ข้อกำหนด Anvill สำหรับการค้นพบรหัส
คำแนะนำ
-ARG-hints-hints-hints
วิเคราะห์ข้อกำหนด Anvill สำหรับการค้นพบรหัส
คำแนะนำ
-original-probabilistic-hints arg
แยกวิเคราะห์ไฟล์ JSON ที่มีฟังก์ชันความน่าจะเป็น
คำแนะนำชื่อ/ที่อยู่
-Hints-hints-patched-probabilistic arg
แยกวิเคราะห์ไฟล์ JSON ที่มีฟังก์ชันความน่าจะเป็น
คำแนะนำชื่อ/ที่อยู่
-original-csv-function-hints arg
แยกวิเคราะห์ไฟล์ CSV ที่มีชื่อฟังก์ชั่น/ที่อยู่
คำแนะนำ
--CSV-function-hints-hints arg
แยกวิเคราะห์ไฟล์ CSV ที่มีชื่อฟังก์ชั่น/ที่อยู่
คำแนะนำ
-original-bsi-hints arg parse ไฟล์ json ที่มีชื่อฟังก์ชั่น/ที่อยู่
คำแนะนำ
-Patched-BSI-hints arg parse ไฟล์ JSON ที่มีชื่อฟังก์ชั่น/ที่อยู่
คำแนะนำ
-ไม่มีการฝึกฝน-วาร์ฟไม่ได้แยกข้อมูลเมตาจากข้อมูลคนแคระใน
ไบนารี
-v,-verbosity arg คำสั่งของเอาต์พุตการบันทึก (ค่าเริ่มต้น: ข้อมูล)
-SAVE-MACAW-CFGS DIR บันทึก CFGs มาคอว์ไปยังไดเรกทอรีที่ให้ไว้
-ไฟล์ Solver-interaction-file
บันทึกการโต้ตอบกับ SMT Solver ระหว่างสัญลักษณ์
ดำเนินการกับไฟล์นี้
-ไฟล์ PROOF-SUMMARY-JSON
ไฟล์เพื่อบันทึกผลลัพธ์ที่น่าสนใจใน JSON
รูปแบบ
-ไฟล์ -log-file ไฟล์เพื่อบันทึกบันทึกการดีบักเป็น
-e,-โหมดการจัดการข้อผิดพลาด errormode arg arg
(ค่าเริ่มต้น: Throwonanyfailure)
-r,-โหมดการจัดการความล้มเหลวของตัวแปร RescopeMode ARG
(ค่าเริ่มต้น: ThrowoneQrescopeFailure)
-สกิป-ไม่ได้รับการตั้งชื่อการวิเคราะห์ข้ามการวิเคราะห์ฟังก์ชั่นที่ไม่มีสัญลักษณ์
-การไหลเวียนของการควบคุม
<เลิกกิจการ>
-เป้าหมาย-equiv-regs arg คำนวณสภาพที่เท่ากันเพียงพอที่จะ
สร้างความเท่าเทียมกันในการลงทะเบียนที่กำหนดหลังจาก
Toplevel entrypoint ส่งคืน <เลิกกิจการ>
-Eignore-segments Arg Skip Segments (0-indexed) เมื่อโหลด ELF
-JSON-TOCLEVEL RUN TOPLEVEL ในโหมด JSON-OUGTUR
เท่านั้น)
-การอ่านเซกเมนต์มาร์คเป็นอย่างเดียวเป็นแบบอ่านอย่างเดียว (0-indexed) เมื่อโหลด
เอลฟ์
-ชื่อไฟล์บันทึกบันทึก macaw cfgs ไปยังไดเรกทอรีที่ให้ไว้
-ขอบเขตสแต็กสซัมเม
ในระหว่างการเรียกใช้ฟังก์ชัน (ไม่ปลอดภัย)
-ignore arg arg อย่ายกคำเตือนใด ๆ ที่กำหนดไว้
-การจำแนกกลับมาโดยทั่วไปจะแก้ไขความล้มเหลวของตัวจําแนกโดยสมมติว่าสมมติว่า
ฟังก์ชั่นส่งคืนถ้าเป็นไปได้
ส่วนเริ่มต้นอย่างรวดเร็วอธิบายคำสั่งเพื่อเรียกใช้ตัวตรวจสอบในกรณีทดสอบโดยใช้คอนเทนเนอร์ Docker ส่วนนี้จะครอบคลุมคำสั่งที่มีประโยชน์สำหรับสถานการณ์อื่น ๆ
หากคุณมีไฟล์ tar ของอิมเมจนักเทียบท่าของตัวตรวจสอบคุณสามารถติดตั้งได้โดยใช้คำสั่ง:
Docker Load -i /path/to/pate.tar
เพื่อเรียกใช้ตัวตรวจสอบผ่าน Docker หลังจากนี้:
Docker Run - -rm -it -platform linux/amd64 pate -help
ในการใช้ประโยชน์จากตัวตรวจสอบด้วย Docker มีประโยชน์ในการแมปไดเรกทอรีบนระบบไฟล์ในเครื่องของคุณลงในคอนเทนเนอร์ Docker เพื่อให้สามารถบันทึกไฟล์เอาต์พุตได้ สมมติว่าไบนารีดั้งเดิมและแพตช์ของคุณเป็น original.exe และ patched.exe ตามลำดับ:
mkdir verifierdata
CP Original.exe Patched.exe VerifierData/
Docker Run - -rm -it -platform linux/amd64
-v `pwd`/verifierdata`:/verifierdata pate
-original /vverifierdata/original.exe
-patched /vverifierdata/patched.exe
-proof-summary-json /vverifierdata/report.json
---log-file /vverifierdata/pate.log
-SAVE-MACAW-CFGS /VERIFIERDATA /CFGS
คำสั่งนี้จะเรียกใช้ตัวตรวจสอบบนสองไบนารีและส่งคุณลงในลูปอ่านภาพพิมพ์ที่คุณสามารถสำรวจเอาต์พุตของตัวตรวจสอบได้
โดยค่าเริ่มต้นตัวตรวจสอบจะเริ่มตรวจสอบจากจุดเริ่มต้นของโปรแกรมอย่างเป็นทางการ สิ่งนี้มักจะไม่เป็นประโยชน์มาก (และอาจเป็นปัญหาสำหรับไบนารีที่ซับซ้อนที่มี _start ขนาดใหญ่ที่ทำให้เกิดปัญหาสำหรับการค้นพบรหัสของเรา) นอกจากนี้สำหรับการเปลี่ยนแปลงด้วยขอบเขตของผลกระทบที่ทราบ (หรืออย่างน้อยที่สุด) การวิเคราะห์เพียงแค่ฟังก์ชั่นที่ได้รับผลกระทบจะเร็วขึ้นอย่างมีนัยสำคัญ หากต้องการระบุจุดเข้าร่วมการวิเคราะห์แทนตัวเลือก -s <function_symbol> จะเริ่มการวิเคราะห์จากฟังก์ชั่นที่สอดคล้องกับสัญลักษณ์ที่กำหนด โปรดทราบว่าสิ่งนี้ต้องใช้สัญลักษณ์ฟังก์ชันที่จะจัดเตรียมไว้สำหรับไบนารี (ไม่ว่าจะเป็นสัญลักษณ์การดีบักแบบฝังตัวหรือแยกกันในรูปแบบหนึ่งในรูปแบบหนึ่ง)
ในขณะที่มันไม่มั่นคง แต่บางครั้งก็มีประโยชน์ในการรักษาฟังก์ชั่นการเรียกว่าไม่มีการเปิด ตัวอย่างเช่นการเพิกเฉยต่อฟังก์ชั่นขนาดใหญ่ที่ไม่ได้เปลี่ยนแปลงและไม่น่าจะมีผลต่อความถูกต้อง (เช่นฟังก์ชั่นการเข้ารหัสขนาดใหญ่จากห้องสมุดที่เชื่อถือได้) สามารถปรับปรุงประสิทธิภาพได้อย่างมีนัยสำคัญ ในการใช้คุณสมบัตินี้ให้ส่งไฟล์การกำหนดค่าไปยังตัวตรวจสอบโดยใช้ตัวเลือก --blockinfo เพื่อให้มั่นใจว่าไฟล์การกำหนดค่ามีคำสั่งต่อไปนี้:
ละเว้นการทำงานของต้นกำเนิด = [<dront>, ... ] ไม่สนใจฟังก์ชั่น = [<dront>, ... ]
ที่แต่ละรายการเป็นรายการที่อยู่ของฟังก์ชั่นที่จะละเว้น ในขณะที่รายการทั้งสองมีการระบุแยกต่างหากพวกเขาเกือบจะแน่นอนว่า "จัดตำแหน่ง" ระหว่างสองไบนารี (เช่นการเพิกเฉยต่อฟังก์ชั่นในไบนารีดั้งเดิมอาจหมายความว่าฟังก์ชั่นที่สอดคล้องกันในไบนารีที่ได้รับการแก้ไขยังต้องถูกละเว้น)
ผู้ตรวจสอบได้รับประโยชน์จากเมตาดาต้าแคระในสองวิธี:
ในการฉีดเมตาดาต้าดาวแคระลงในไบนารีโดยไม่ต้องใช้ (เช่นไบนารีที่ถอดออก) เราขอแนะนำให้ใช้เครื่องมือนักเขียนแคระ เป็นตัวอย่างของการใช้ dwarf-writer ผ่านภาพนักเทียบท่าโดยสมมติว่ามีเป้าหมาย ( target-binary.exe ) และข้อมูลเมตาในรูปแบบ Anvill JSON ( target-binary.exe.json ):
Docker Load -i Dwarf-writer-docker.tar
mkdir dwarfriterdata
CP Target-binary.exe target-binary.exe.json Dwarfritriterdata/
Docker Run - -rm -it -v `pwd`/dwarfwriterdata:/dwarfwriterdata dwarf -writer
-anvill /dwarfwriterdata/target-binary.exe.json
/dwarfwriterdata/target-binary.exe
/dwarfwriterdata/target-binary-dwarf.exe
สิ่งนี้จะสร้างเวอร์ชันของคำอธิบายประกอบไบนารีกับเมตาดาต้าแคระใน DwarfWriterData/target-binary-dwarf.exe
หากคุณมีเครื่องมือ llvm-dwarfdump คุณสามารถใช้มันเพื่อตรวจสอบข้อมูลเมตาของแคระที่สร้างขึ้น ตัวตรวจสอบ pate จะใช้ประโยชน์จากคำแนะนำเมตาดาต้าแคระโดยอัตโนมัติเว้นแต่จะถูกนำไปเพิกเฉยต่อพวกเขา
Verifier ใช้สองไบนารีเป็นอินพุต: ไบนารีดั้งเดิมและไบนารีแพทช์ สมมติฐานคือแพทช์ที่มุ่งเน้นความปลอดภัยบางอย่างถูกนำไปใช้กับไบนารีดั้งเดิมที่รักษาพฤติกรรมของมันเป็นส่วนใหญ่ แต่อาจแก้ไขพฤติกรรมที่ไม่พึงประสงค์บางอย่าง จากนั้นผู้ตรวจสอบพยายามที่จะพิสูจน์ว่าทั้งสองไบนารีแสดงพฤติกรรมที่สังเกตได้เดียวกัน หากไม่สามารถทำได้มันจะสร้าง บทสรุปที่แตกต่างกัน ซึ่งอธิบายถึงเงื่อนไขที่ไบนารีที่ได้รับการแก้ไขจะแสดงพฤติกรรมที่แตกต่างจากต้นฉบับ สิ่งนี้ช่วยให้นักพัฒนาแพทช์เข้าใจถึงผลกระทบของแพตช์ที่มีต่อความหมายของโปรแกรมและประเมินว่าผลกระทบถูก จำกัด เฉพาะเส้นทางการดำเนินการที่พวกเขาตั้งใจไว้
ตัวตรวจสอบไม่ต้องการข้อกำหนดที่จัดเตรียมด้วยตนเองจากผู้ใช้ แต่จะถือว่าโปรแกรมดั้งเดิมเป็นข้อกำหนดด้านพฤติกรรมที่ต้องการ การจัดเรียงนี้ทำให้ Pate เป็นตัวตรวจสอบ เชิงสัมพันธ์ เนื่องจากเกี่ยวข้องกับไบนารีแพทช์กับต้นฉบับ ตัวตรวจสอบจะขึ้นอยู่กับจำนวนของไลบรารีที่มีอยู่สำหรับการค้นหารหัสไบนารีและการดำเนินการเชิงสัญลักษณ์ของโปรแกรม (รวมถึงโปรแกรมรหัสเครื่อง) คร่าวๆผู้ตรวจสอบทำงานโดย:
เครื่องมือ Pate เขียนใน Haskell และต้องการคอมไพเลอร์ GHC (เราทดสอบด้วย 9.6) และเครื่องมือสร้าง Cabal เพื่อรวบรวม การสร้างจากแหล่งที่มาสามารถทำได้โดย:
git clone [email protected]: galoisinc/pate.git ต้นซีดี Git Submodule Update -Init cp cabal.project.dist cabal.project Cabal กำหนดค่า pkg: pate ./pate.sh --help
ตัวตรวจสอบต้องการ SMT Solver ที่จะพร้อมใช้งานใน PATH ค่าเริ่มต้นคือ yices - z3 และ cvc4 อาจใช้งานได้ แต่ไม่ได้ทดสอบกับ Pate เป็นประจำ
วัสดุนี้ขึ้นอยู่กับงานที่ได้รับการสนับสนุนโดยหน่วยงานโครงการวิจัยขั้นสูง (DARPA) และศูนย์สงครามข้อมูลกองทัพเรือแปซิฟิก (NIWC Pacific) ภายใต้หมายเลขสัญญา N66001-20-C-4027 ความคิดเห็นการค้นพบและข้อสรุปหรือคำแนะนำใด ๆ ที่แสดงในเนื้อหานี้เป็นของผู้เขียนและไม่จำเป็นต้องสะท้อนมุมมองของ DARPA & NIWC Pacific