ในบางโอกาสแล้ว ที่นี่ในบล็อกเราได้พูดคุยเกี่ยวกับงานของ Andrey Konovalov (นักพัฒนาของ Google) ใน Linux จากผลงานของเขาในการตรวจจับความล้มเหลวในไดรเวอร์ USB ของเคอร์เนล Linux และในอุปกรณ์ Wifi ได้อย่างทันท่วงที
ตอนนี้เขากำลังทำงานอยู่ การพัฒนาโมดูลใหม่สำหรับเคอร์เนลลินุกซ์ซึ่งเขาได้รับการตั้งชื่อเป็น "USB Raw Gadget" ซึ่งอธิบายว่าเป็นยูทิลิตี้ที่อนุญาตให้จำลองอุปกรณ์ USB ในพื้นที่ของผู้ใช้
นอกเหนือจากนั้น ระบุว่ามีการพิจารณาแอปพลิเคชันสำหรับการรวมโมดูลนี้ไว้ในเคอร์เนลหลักของ Linux Google Raw Gadget ถูกใช้แล้วโดย Google เพื่อลดความซับซ้อนในการทดสอบสแต็กเคอร์เนล USB ด้วยชุดเครื่องมือ syzkaller
ตอนแรกฉันใช้ GadgetFS (พร้อมกับโมดูล Dummy HCD / UDC) เพื่อเลียนแบบอุปกรณ์ USB สำหรับการเลือน แต่จากนั้นก็เปลี่ยนไปใช้อินเทอร์เฟซที่เขียนขึ้นเอง
แรงจูงใจในการใช้อินเทอร์เฟซที่แตกต่างกันคือการให้การเข้าถึงเลเยอร์ USB Gadget โดยตรงและค่อนข้างดิบสำหรับพื้นที่ผู้ใช้ซึ่งคำขอ USB แต่ละรายการจะถูกส่งไปยังพื้นที่ของผู้ใช้เพื่อตอบสนอง
เกี่ยวกับ USB Raw Gadget
โมดูลจะดูแลการเพิ่มอินเทอร์เฟซใหม่ การเขียนโปรแกรม ไปยังระบบย่อยเคอร์เนล เรียกว่า "USB Gadget" และกำลังได้รับการพัฒนาเพื่อเป็นทางเลือกให้กับ GadgetFS
การสร้าง API ใหม่เกิดจากความจำเป็นในการเข้าถึงโดยตรงและระดับต่ำ ไปยังระบบย่อย Gadget USB จากพื้นที่ผู้ใช้ทำให้สามารถประมวลผลคำขอ USB ที่เป็นไปได้ทั้งหมด (GadgetFS ประมวลผลคำขอบางอย่างด้วยตัวเองโดยไม่ต้องโอนไปยังพื้นที่ผู้ใช้)
USB Raw Gadget ถูกควบคุมผ่านอุปกรณ์ / dev / raw-gadget โดยการเปรียบเทียบกับ / dev / gadget ใน GadgetFS แต่จะใช้อินเทอร์เฟซที่ใช้ ioctl () แทนที่จะใช้หลอก FS สำหรับการโต้ตอบ
นอกเหนือจากการประมวลผลคำขอ USB ทั้งหมดโดยตรงโดยกระบวนการในพื้นที่ผู้ใช้อินเทอร์เฟซใหม่ยังมีความสามารถในการส่งคืนข้อมูลใด ๆ เพื่อตอบสนองคำขอ USB (GadgetFS ตรวจสอบความถูกต้องของตัวบอก USB และกรองการตอบสนองบางอย่างซึ่งรบกวน การตรวจจับข้อผิดพลาดระหว่างการทดสอบการล้างสแต็ก USB)
USB Raw Gadget ยังช่วยให้คุณสามารถเลือกอุปกรณ์ UDC เฉพาะได้ (ไดรเวอร์อุปกรณ์ USB) และไดรเวอร์สำหรับเชื่อมต่อในขณะที่ GadgetFS เชื่อมต่อกับอุปกรณ์ UDC เครื่องแรกที่มีอยู่
สำหรับ UDC ที่แตกต่างกันชื่อปลายทางที่คาดเดาได้จะถูกจับคู่กับช่องทางการสื่อสารที่แยกจากกันประเภทต่างๆภายในอุปกรณ์เครื่องเดียว
สุดท้ายหากคุณต้องการทราบข้อมูลเพิ่มเติมคุณสามารถตรวจสอบรายละเอียดรวมทั้งบันทึกการเปลี่ยนแปลงที่เกิดขึ้นใน USB Raw Gadget ในลิงค์ต่อไปนี้.
จะติดตั้งโมดูล Raw Gadget USB ใน Linux ได้อย่างไร?
สำหรับผู้ที่สนใจจะทดสอบโมดูลนี้ในระบบสามารถทำได้โดยทำตามคำแนะนำที่มีรายละเอียดที่นี่
สำหรับ Dummy HCD / UDC (โมดูลที่กำหนดค่าอุปกรณ์ USB เสมือนและตัวควบคุมโฮสต์ที่เชื่อมต่อกันภายในเคอร์เนล) เราต้องเปิดเทอร์มินัลและในนั้นเราจะพิมพ์คำสั่งต่อไปนี้:
svn checkout https://github.com/xairy/raw-gadget/trunk/dummy_hcd
ด้วยสิ่งนี้เราจะได้รับโฟลเดอร์พร้อมโมดูลที่เราจะรวบรวมโดยดำเนินการคำสั่งต่อไปนี้ในเทอร์มินัล:
cd dummy_hcd make
และเราดำเนินการติดตั้งด้วย:
./insmod.sh
ในกรณีที่เราต้องการอัปเดตโมดูลเราดำเนินการกับ:
./update.sh
ตอนนี้ สำหรับผู้ที่ต้องการติดตั้งโมดูลเคอร์เนล. ในเทอร์มินัลเราจะได้รับไฟล์ที่จำเป็นสำหรับสิ่งนี้โดยดำเนินการคำสั่งต่อไปนี้:
svn checkout https://github.com/xairy/raw-gadget/trunk/raw_gadget
ด้วยสิ่งนี้เราจะได้รับโฟลเดอร์พร้อมโมดูลที่เราจะรวบรวมโดยดำเนินการคำสั่งต่อไปนี้ในเทอร์มินัล:
cd dummy_hcd make
และเราดำเนินการติดตั้งด้วย:
./insmod.sh
ในกรณีที่เราต้องการอัปเดตโมดูลเราดำเนินการกับ:
./update.sh
คุณสามารถตรวจสอบงานใน ลิงค์ต่อไปนี้