เฟรมเวิร์กสำหรับการค้นพบเป้าหมาย ที่ไม่สามารถใช้ งานได้โดยอัตโนมัติด้วยการวิเคราะห์แบบคงที่
นักวิจัยช่องโหว่ที่ดำเนินการประเมินความปลอดภัยบนซอฟต์แวร์มักจะควบคุมความสามารถของการคลุมเครือที่ครอบคลุมผ่านเครื่องมือที่ทรงพลังเช่น AFL ++ และ Libfuzzer สิ่งนี้มีความสำคัญเนื่องจากกระบวนการ bughunting โดยอัตโนมัติและเปิดเผยเงื่อนไขที่ใช้ประโยชน์ได้ในเป้าหมายอย่างรวดเร็ว อย่างไรก็ตามเมื่อเผชิญหน้ากับรหัสฐานขนาดใหญ่และซับซ้อนหรือไบนารีที่มีแหล่งปิดแหล่งที่มานักวิจัยจะต้องอุทิศเวลาอย่างระมัดระวังในการตรวจสอบด้วยตนเองและย้อนกลับวิศวกรพวกเขาเพื่อระบุฟังก์ชั่นที่การสำรวจตามการฟัซซิ่งมีประโยชน์
Fuzzable เป็นเฟรมเวิร์กที่รวมทั้งสองกับซอร์สโค้ด C/C ++ และไบนารีเพื่อช่วยนักวิจัยช่องโหว่ในการระบุเป้าหมายฟังก์ชั่นที่สามารถใช้งานได้ สิ่งนี้ทำได้โดยการใช้ฮิวริสติกที่ใช้การวิเคราะห์แบบสแตติกหลายครั้งเพื่อระบุพฤติกรรมที่มีความเสี่ยงในซอฟต์แวร์และฟังก์ชั่นที่ดำเนินการ จากนั้นนักวิจัยสามารถใช้เฟรมเวิร์กเพื่อสร้างเทมเพลตสายรัดขั้นพื้นฐานซึ่งสามารถใช้ในการตามล่าหาช่องโหว่หรือถูกรวมเข้าด้วยกันเป็นส่วนหนึ่งของท่อส่งข้อมูลอย่างต่อเนื่องเช่นโครงการ OSS-Fuzz ของ Google
นอกเหนือจากการทำงานเป็นเครื่องมือแบบสแตนด์อโลนแล้วยังฟัซซี่ยังถูกรวมเข้าด้วยกันเป็นปลั๊กอินสำหรับ Disassembler Binary Ninja พร้อมการสนับสนุนสำหรับการพัฒนาแบ็กเอนด์อื่น ๆ ที่ได้รับการพัฒนา
ตรวจสอบโพสต์บล็อกต้นฉบับที่มีรายละเอียดเครื่องมือที่นี่ซึ่งเน้นข้อมูลจำเพาะทางเทคนิคของฮิวริสติกการวิเคราะห์แบบคงที่และเครื่องมือนี้เกิดขึ้นได้อย่างไร เครื่องมือนี้ยังมีจุดเด่นที่ Black Hat Arsenal USA 2022
เป้าหมายไบนารีบางอย่างอาจต้องใช้การฆ่าเชื้อ (เช่นการจับคู่ลายเซ็นหรือการระบุฟังก์ชั่นจากการ inlining) ดังนั้นจึง สามารถ ใช้ไบนารีนินจาเป็นแบ็กเอนด์ถอดชิ้นส่วนเนื่องจากความสามารถในการแก้ปัญหาเหล่านี้ได้อย่างมีประสิทธิภาพ ดังนั้นจึงสามารถใช้ทั้งเครื่องมือและปลั๊กอินแบบสแตนด์อโลน
เนื่องจากทุกคนไม่สามารถเข้าถึงนินจาไบนารีได้และอาจมีความต้องการที่จะใช้สำหรับการประเมินความปลอดภัยและอาจปรับขนาดขึ้นในคลาว ด์ ฉันคาดว่าจะรวมการถอดชิ้นส่วนอื่น ๆ ลงบนถนนด้วย (ลำดับความสำคัญ: Ghidra)
หากคุณมีโฆษณาแบบไบนารีนินจาให้แน่ใจว่าได้ติดตั้ง API สำหรับการใช้งานแบบไม่มีหัวแบบสแตนด์อโลน:
$ python3 /Applications/Binary Ninja.app/Contents/Resources/scripts/install_api.py
ติดตั้งด้วย pip :
$ pip install fuzzable
เราใช้บทกวีสำหรับการจัดการการพึ่งพาและการสร้าง หากต้องการสร้างด้วยตนเองให้โคลนพื้นที่เก็บข้อมูลด้วยโมดูลบุคคลที่สาม:
$ git clone --recursive https://github.com/ex0dus-0x/fuzzable
เพื่อติดตั้งด้วยตนเอง:
$ cd fuzzable/
# without poetry
$ pip install .
# with poetry
$ poetry install
# with poetry for a development virtualenv
$ poetry shell
ตอนนี้คุณสามารถวิเคราะห์ไบนารีและ/หรือซอร์สโค้ดด้วยเครื่องมือ!
# analyzing a single shared object library binary
$ fuzzable analyze examples/binaries/libbasic.so
# analyzing a single C source file
$ fuzzable analyze examples/source/libbasic.c
# analyzing a workspace with multiple C/C++ files and headers
$ fuzzable analyze examples/source/source_bundle/
สามารถติดตั้งได้อย่าง ง่ายดาย ผ่านตลาดปลั๊กอิน Binary Ninja โดยไปที่ Binary Ninja > Manage Plugins และค้นหามัน นี่คือตัวอย่างของการทำงานของปลั๊กอิน ที่ฟัฟฟัซท์ , ความแม่นยำในการระบุเป้าหมายสำหรับการประเมินความฟุ่มเฟือยและการประเมินช่องโหว่เพิ่มเติม:

Fuzzable มาพร้อมกับตัวเลือกต่าง ๆ เพื่อช่วยปรับการวิเคราะห์ของคุณให้ดีขึ้น จะได้รับการสนับสนุนเพิ่มเติมในแผนการในอนาคตและคำขอคุณสมบัติใด ๆ ที่เกิดขึ้น
ในการตรวจสอบความคลุมเครือ ฟัซซี่ ใช้ประโยชน์จากฮิวริสติกหลายอย่างเพื่อกำหนดว่าเป้าหมายใดที่เป็นไปได้มากที่สุดในการกำหนดเป้าหมายสำหรับการวิเคราะห์แบบไดนามิก ฮิวริสติกเหล่านี้มีน้ำหนักแตกต่างกันโดยใช้ห้องสมุด Scikit-Criteria ซึ่งใช้ การวิเคราะห์การตัดสินใจแบบหลายเกณฑ์ เพื่อกำหนดผู้สมัครที่ดีที่สุด ตัวชี้วัดเหล่านี้และมีน้ำหนักได้ที่นี่:
| เกี่ยวกับการแก้ปัญหา | คำอธิบาย | น้ำหนัก |
|---|---|---|
| ชื่อเป็นมิตรฟัซซี่ | ชื่อสัญลักษณ์หมายถึงพฤติกรรมที่กินอินพุตไฟล์/บัฟเฟอร์ | 0.3 |
| อ่างล้างมือที่มีความเสี่ยง | ข้อโต้แย้งที่ไหลเข้าสู่การโทรที่มีความเสี่ยง (เช่น memcpy) | 0.3 |
| ลูปธรรมชาติ | จำนวนลูปที่ตรวจพบด้วยแนวชายแดน Dominance | 0.05 |
| ความซับซ้อนของวัฏจักร | ความซับซ้อนของเป้าหมายฟังก์ชั่นขึ้นอยู่กับขอบ + โหนด | 0.05 |
| ความลึกครอบคลุม | จำนวน callees เป้าหมายที่เคลื่อนที่เข้ามา | 0.3 |
ดังที่ได้กล่าวมาตรวจสอบโพสต์บล็อกทางเทคนิคเพื่อดูเชิงลึกมากขึ้นว่าทำไมและวิธีการวัดเหล่านี้
ตัวชี้วัดหลายอย่างได้รับแรงบันดาลใจจากงานต้นฉบับของ Vincenzo Iozzo ใน 0-Knogyledge Fuzzing
ทุกเป้าหมายที่คุณต้องการวิเคราะห์นั้นมีความหลากหลายและ ฟัซซี่ จะไม่สามารถอธิบายพฤติกรรมกรณีที่ขอบในเป้าหมายโปรแกรมได้ ดังนั้นจึงอาจมีความสำคัญในระหว่างการวิเคราะห์เพื่อ ปรับ น้ำหนักเหล่านี้อย่างเหมาะสมเพื่อดูว่าผลลัพธ์ที่แตกต่างกันเหมาะสมสำหรับกรณีการใช้งานของคุณหรือไม่ ในการปรับน้ำหนักเหล่านี้ใน CLI เพียงแค่ระบุอาร์กิวเมนต์ --score-weights :
$ fuzzable analyze <TARGET> --score-weights=0.2,0.2,0.2,0.2,0.2
โดยค่าเริ่มต้น ฟัซซี่ จะกรองเป้าหมายฟังก์ชั่นตามเกณฑ์ต่อไปนี้:
static และไม่ได้สัมผัสผ่านส่วนหัว หากต้องการดูการโทรที่ถูกกรองโดย ฟัซซี่ ให้ตั้งค่า --list_ignored Flag:
$ fuzzable analyze --list-ignored <TARGET>
ใน Binary Ninja คุณสามารถเปลี่ยนการตั้งค่านี้ใน Settings > Fuzzable > List Ignored Calls
ในกรณีที่ ฟัวล์ สามารถกรองการโทรที่สำคัญที่ควรวิเคราะห์ได้ขอแนะนำให้ใช้ --include-* **********************************
# include ALL non top-level calls that were filtered out
$ fuzzable analyze --include-nontop <TARGET>
# include specific symbols that were filtered out
$ fuzzable analyze --include-sym <SYM> <TARGET>
ใน Binary Ninja สิ่งนี้ได้รับการสนับสนุนผ่านการตั้งค่า> ฟัซซี่> รวมการเรียกระดับและ Symbols to Exclude Settings > Fuzzable > Include non-top level calls เพื่อแยกออก
ตอนนี้คุณได้พบผู้สมัครในอุดมคติของคุณที่จะคลุมเครือ ความคลุมเครือ จะช่วยให้คุณสร้างสายรัดฟัซซิงที่ (เกือบ) พร้อมที่จะใช้เครื่องมือและคอมไพล์สำหรับใช้กับฟัซเซอร์ที่ใช้ไฟล์ (เช่น AFL ++, Honggfuzz) หรือฟัซเซอร์ในหน่วยความจำ ในการทำเช่นนั้นใน CLI:
# generate harness from a candidate
$ fuzzable create-harness target --symbol-name=some_unsafe_call
# make minimal and necessary modifications to the harness
$ vim target_some_unsafe_call_harness.cpp
# example compilation for AFL-QEMU, which is specified in the comments of the generated harness
$ clang target_some_unsafe_call_harness.cpp -no-pie -o target_some_unsafe_call_harness -ldl
# create your base seeds, ideally should be more well-formed for input
$ mkdir in/
$ echo "seed" >> in/seed
# start black box fuzzing
$ afl-fuzz -Q -m none -i in/ -o out/ -- ./target_some_unsafe_call_harness
หากเป้าหมายนี้เป็น codebase ที่มาจะใช้เทมเพลตแหล่งกำเนิดทั่วไป
หากเป้าหมายเป็นไบนารีเทมเพลตกล่องดำทั่วไปจะถูกใช้ซึ่งสามารถใช้กับโหมดจำลองการเลียนแบบเช่น AFL-QEMU สำเนาของไบนารีจะถูกสร้างขึ้นเป็นวัตถุที่ใช้ร่วมกันหากสัญลักษณ์ไม่ได้ส่งออกโดยตรงเพื่อเป็น dlopen ed โดยใช้ LIEF
ในขณะนี้คุณลักษณะนี้ค่อนข้างเป็นพื้นฐานเพราะมันจะสร้างสายรัด C ++ แบบสแตนด์อโลนที่มีพารามิเตอร์ที่เหมาะสมและจะไม่สร้างรหัสอัตโนมัติที่จำเป็นสำหรับพฤติกรรมรันไทม์ใด ๆ อย่างไรก็ตามเทมเพลตที่สร้างขึ้นสำหรับ ฟัซซี่ ควรทำให้คุณทำงานได้อย่างรวดเร็ว นี่คือคุณสมบัติที่ทะเยอทะยานที่ฉันต้องการนำไปใช้ตามถนน:
Fuzzable รองรับการสร้างรายงานในรูปแบบต่าง ๆ สิ่งปัจจุบันที่ได้รับการสนับสนุนคือ JSON, CSV และ Markdown สิ่งนี้จะมีประโยชน์หากคุณใช้สิ่งนี้เป็นส่วนหนึ่งของระบบอัตโนมัติที่คุณต้องการนำเอาต์พุตในรูปแบบอนุกรม
ใน CLI เพียงแค่ผ่านอาร์กิวเมนต์ --export พร้อมชื่อไฟล์ที่มีส่วนขยายที่เหมาะสม:
$ fuzzable analyze --export=report.json <TARGET>
ใน Binary Ninja ไปที่ Plugins > Fuzzable > Export Fuzzability Report > ... และเลือกรูปแบบที่คุณต้องการส่งออกและเส้นทางที่คุณต้องการเขียน
เครื่องมือนี้จะได้รับการพัฒนาอย่างต่อเนื่องและความช่วยเหลือใด ๆ จาก mantainers ภายนอกได้รับการชื่นชม!
Fuzzable ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT