- เมื่อเปิดใช้งาน คอนโทรลเลอร์ xDCI ที่ซ่อนอยู่ใน ThinkPad X1 Carbon 6th Gen ตัวแล็ปท็อปเองก็สามารถจำลองอุปกรณ์ USB ใดก็ได้ เช่น คีย์บอร์ดหรืออุปกรณ์เก็บข้อมูล
- เบาะแสคือ
/sys/class/usb_role/intel_xhci_usb_sw-role-switchแต่การสลับบทบาทของ xHCI เพียงอย่างเดียวยังไม่พอ และต้องมี xDCI UDC ที่อิงกับ DWC3 ถูกเปิดเผยออกมาเป็นอุปกรณ์ PCIe แยกต่างหาก - ในอิมเมจ BIOS มีการตั้งค่า
xDCI Supportอยู่ แต่ถูกซ่อนไว้จากหน้าจอ Setup UI ปกติ และหลังเปิดใช้งานแล้วlspciจะแสดง xDCI8086:9d30กับไดรเวอร์dwc3-pci - วิธีที่สำเร็จคือ ปลดล็อกหน้า Advanced BIOS และ แพตช์ NVRAM ส่วนการพยายามตั้งค่ารีจิสเตอร์ PCH ใหม่ทำได้แค่แก้บางส่วนของ PMC และล้มเหลวเพราะการล็อกของ PSF
- หลังเปิด xDCI แล้ว
g_mass_storage, Raw Gadget, ตัวทำซ้ำของ syzkaller และแบ็กเอนด์ Facedancer ทำงานได้โดยไม่ต้องใช้อุปกรณ์ภายนอก แต่ต้องใช้สาย USB ที่ตัดVBUSและสลับบทบาทเป็นdevice
เบาะแสโหมดอุปกรณ์ USB ที่พบบน ThinkPad
- Raw Gadget เป็นโมดูลเคอร์เนลที่ให้ API ฝั่ง userspace สำหรับซับซิสเต็ม USB Gadget ของเคอร์เนล Linux และสามารถใช้ให้ descriptor USB ที่ไม่ถูกต้องเพื่อทำ fuzzing และ exploit กับ USB host ได้
- โดยทั่วไปพีซีจะไม่มี USB Device Controller หรือ UDC ซึ่งมักฝังมาในคอมพิวเตอร์บอร์ดเดี่ยวอย่าง Raspberry Pi มากกว่า
- งานลักษณะนี้ก่อนหน้านี้ต้องใช้อุปกรณ์ภายนอกอย่าง Raspberry Pi หรือ EC3380-AB ที่อิง USB 3380
- บน ThinkPad X1 Carbon 6th Gen พบ
intel_xhci_usb_sw-role-switchใต้/sys/class/usb_role/sys/class/usb_roleเป็นอินเทอร์เฟซสำหรับสลับองค์ประกอบ USB ฝั่งฮาร์ดแวร์ระหว่างโหมด host กับโหมด device- แม้จะเขียน
deviceลงในไฟล์ role ตอนแรกก็ยังไม่มีข้อความในdmesgและไม่มีรายการใน/sys/class/udc/
- xHCI คือ HCD ที่ทำให้ระบบ x86 ทำงานเป็น USB host ส่วน xDCI คือชื่อที่ Intel ใช้เรียกอินเทอร์เฟซฝั่ง USB device
โครงสร้างที่ยืนยันได้จากโค้ดเคอร์เนลและเมลลิงลิสต์
- ในเคอร์เนล Linux พบ
intel_xhci_usb_swได้จากสองตำแหน่งdrivers/usb/roles/intel-xhci-usb-role-switch.cใช้เป็นไดรเวอร์ USB Role Switch ที่จัดการรีจิสเตอร์ xHCI เมื่อมีการเขียนdeviceหรือhostdrivers/usb/host/xhci-ext-caps.cจะสร้างอุปกรณ์ virtual platformintel_xhci_usb_swเมื่อไดรเวอร์ xHCI ตั้ง quirkXHCI_INTEL_USB_ROLE_SW
- PCIe device ID ของ xHCI บน ThinkPad คือ
0x9d2fซึ่งตรงกับPCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCIในเคอร์เนล - จากการพูดคุยใน Linux kernel mailing list ยืนยันว่า xHCI และ DWC3 UDC เป็นอุปกรณ์คนละตัว และมี mux คั่นอยู่ระหว่างกัน
- role switch มีหน้าที่สลับ mux ตัวนี้
- หาก DWC3 UDC เองไม่ปรากฏเป็นอุปกรณ์ PCI ก็แปลว่ายังไม่มี UDC ให้ใช้ในโหมด device
- DWC3 คือ IP คอนโทรลเลอร์ Synopsys DesignWare Core SuperSpeed USB 3.0 ซึ่งผู้ผลิตหลายรายรวมถึง Intel นำไปใช้ในระบบของตน
- เมื่อดู
lspciบน ThinkPad ตอนแรกพบเพียง xHCI8086:9d2fเท่านั้น และยังไม่เห็น device ID0x9d30ของ xDCI สำหรับ Sunrise Point-LP ตามdwc3-pci.c
ร่องรอยของ xDCI ที่ยังหลงเหลือใน ACPI และ BIOS
- ใน ACPI DSDT มี
Device (XDCI)และเมธอด_STA/sys/bus/acpi/devices/device:33/pathคือ\\_SB_.PCI0.XDCI/sys/bus/acpi/devices/device:33/statusมีค่า15ซึ่งหมายถึงอุปกรณ์ถูกเปิดใช้งานและทำงานได้- แต่เพราะ
lspciไม่เห็น xDCI จึงเป็นสถานะที่ดูปกติเฉพาะจากมุมมองของ ACPI เท่านั้น
- ในหน้าจอ BIOS Setup ปกติไม่เห็นการตั้งค่าที่เกี่ยวกับ xDCI หรือ OTG
- ดาวน์โหลดอิมเมจอัปเดต Lenovo BIOS Bootable CD แล้วแตกไบนารี BIOS
/mnt/bios/FLASH/N23ET86W/$0AN2300.FL1จากนั้นตรวจดูด้วย UEFITool - เมื่อค้นหาสตริงใน
PE32 image sectionของโมดูลSetupพบรายการต่อไปนี้xDCI SupportEnable/Disable xDCI (USB OTG Device).
- หมายความว่าใน BIOS มี การตั้งค่า xDCI Support อยู่ แต่ถูกซ่อนไว้จาก UI ปกติ
เปิด xDCI ผ่านหน้า Advanced BIOS
- ผู้เขียนลองทำตามเอกสารของโปรเจกต์ x1c6-hackintosh เพื่อเปิด หน้า Advanced BIOS ที่ถูกซ่อนอยู่
- วิธีนี้ต้องแฟลชชิป SPI ที่เก็บ BIOS ใหม่
- แทนที่จะใช้ SPI clip ก็เปลี่ยนชิป SPI เป็นแบบซ็อกเก็ตเพื่อถอดเสียบทดลองหลายรอบ
- ใช้ FTDI FT2232H Mini Module และ
flashromเพื่อดัมพ์และเขียนข้อมูลกลับลงชิป SPI
- การแพตช์ BIOS มีสองขั้นตอน
- ใช้
UEFIPatchเปลี่ยนการอ้างอิง GUID ของหน้า BIOSDate/Timeให้ชี้ไปที่หน้าAdvanced - ใช้ไบต์แพตช์อีกตัวเพื่อบังคับ TPM ให้เป็น
MFG Modeเพื่อไม่ให้ Boot Guard ตรวจจับการแก้ไข BIOS
- ใช้
- บน BIOS 1.37 หากใช้เฉพาะแพตช์แรก โน้ตบุ๊กจะร้องบี๊บและบูตไม่ขึ้น แต่หลังใช้แพตช์ที่สองด้วย หน้า Advanced ก็ปรากฏขึ้น
- เมื่อเปลี่ยน
xDCI Supportใต้Intel Advanced Menu→PCI-IO Configuration→USB Configurationเป็นEnabledหลังบูต xDCI ก็ปรากฏขึ้นlspciแสดง00:14.1 USB controller [8086:9d30]- เคอร์เนลโหลดไดรเวอร์
dwc3-pciอัตโนมัติ /sys/class/udc/มีdwc3.1.autoปรากฏขึ้น
พอร์ต xDCI และเงื่อนไขของสายเคเบิล
- เพื่อหาพอร์ต USB ภายนอกที่ต่อกับ xDCI จึงตั้ง role เป็น
deviceแล้วเสียบแฟลชไดรฟ์ USB เข้าทีละพอร์ตเพื่อตรวจสอบ- ในบางพอร์ต OS ไม่ตรวจพบแฟลชไดรฟ์ และเมื่อสลับ role กลับเป็น
hostก็ใช้งานได้อีกครั้ง - จึงสรุปว่าพอร์ตนั้นคือพอร์ตที่เชื่อมกับ xDCI
- ในบางพอร์ต OS ไม่ตรวจพบแฟลชไดรฟ์ และเมื่อสลับ role กลับเป็น
- เนื่องจากพอร์ต xDCI ของ ThinkPad เป็น USB Type-A การเชื่อมต่อกับคอมพิวเตอร์ host จึงต้องใช้สาย Type-A to Type-A แบบ male-to-male
- เพราะ role switching ไม่ได้ตัดไฟ
VBUSของพอร์ต จึงต้องใช้ สายที่ตัดVBUSเพื่อไม่ให้VBUSของอุปกรณ์ทั้งสองต่อถึงกันโดยตรง- ตอนแรกทำสาย male-to-male เองโดยตัดสาย USB 2.0 สองเส้นแล้วตัด
VBUS - ต่อมาจึงใช้ PortaPow USB Power Blocker ร่วมกับสาย USB 2.0 male-to-male
- ตอนแรกทำสาย male-to-male เองโดยตัดสาย USB 2.0 สองเส้นแล้วตัด
- เมื่อโหลดไดรเวอร์ gadget
g_zeroอุปกรณ์ USB ทดสอบก็ถูกจำลองบนโน้ตบุ๊กอีกเครื่องได้ตามปกติ - ตามอัปเดตวันที่ 11 มิถุนายน 2024 สาย DataPro USB 3.0 Super-Speed A/A Debugging Cable ตัดทั้ง
D-และD+ของ USB 2.0 ด้วย ทำให้การเชื่อมต่อ High-Speed ที่จำเป็นต่อการตั้งลิงก์ SuperSpeed ล้มเหลว- ส่วนสาย LogiLink CU0038 ที่ตัด
VBUSเองด้วยมือ ใช้จำลองอุปกรณ์ SuperSpeed ได้
- ส่วนสาย LogiLink CU0038 ที่ตัด
ความพยายามเปิดใช้งานด้วยซอฟต์แวร์ผ่านรีจิสเตอร์ PCH
- เพื่อดูว่า BIOS เปิด xDCI อย่างไร ผู้เขียนตรวจดู
Pch/Library/Private/PeiPchInitLib/PchXdci.cในซอร์ส BIOS ของ Kaby Lake - เส้นทางปิดใช้งาน xDCI ใน BIOS มีโครงสร้างเป็นการปิด xDCI ทั้งใน PMC และ PSF
-
การแก้ไข PMC
- คาดว่าการล้างบิต #24
XDCI Function Disableของรีจิสเตอร์NST_PG_FDIS_1ที่ offset0x628ใน PMC จะยกเลิกการตัดไฟของ xDCI ได้ - จึงเขียนโมดูลเคอร์เนลที่นำ mapping ของ
pmc_core_deviceและpmc->regbaseจากเคอร์เนล Linux มาใช้ซ้ำ - ทันทีหลังบูต บิต #31
ST_FDIS_LKของST_PG_FDIS1ถูกตั้งไว้ ทำให้ไม่สามารถเปลี่ยนค่าNST_PG_FDIS_1ได้ - แต่หลังสั่ง suspend แล้วปลุกเครื่อง บิตล็อกไม่ถูกตั้งไว้ และสามารถล้างบิต
XDCI Function Disableได้สำเร็จ
- คาดว่าการล้างบิต #24
-
การแก้ไข PSF
- BIOS ปิด xDCI โดยตั้งบิต
USB Dual Role (OTG) Function Disableใน PSF2 PCR ของPID_PSF2Port ID0xBB - ที่อยู่ PCR คำนวณจาก
PCH_PCR_BASE_ADDRESS 0xFD000000ร่วมกับ Port ID และ offset - แม้จะ map PSF2 PCR ในโมดูลเคอร์เนลด้วย
ioremapแต่ค่าที่อ่านได้เป็น0xffffffffและไม่เปลี่ยนแปลง - แม้ unhide P2SB แล้วก็ได้ผลเหมือนเดิม
- เนื่องจาก
RemoveSidebandAccessใน BIOS ใช้EPMASK5ตัดPID_PSF2ออกจาก IOSF-SB และล็อกด้วยMASKLOCKทำให้ OS ไม่สามารถตั้งค่า PSF ใหม่ได้ - สรุปคือการเข้าถึง PCH แม้จะแก้บางส่วนของ PMC ได้ แต่ล้มเหลวในการตั้งค่า PSF ใหม่ จึงไม่ใช่วิธีเปิด xDCI ที่ใช้ได้จริง
- BIOS ปิด xDCI โดยตั้งบิต
เปิดใช้งานผ่านการแพตช์ NVRAM โดยไม่ต้องเลี่ยง Boot Guard
- เนื่องจากค่าการตั้งค่า BIOS ถูกเก็บใน พื้นที่ NVRAM ของชิป SPI ผู้เขียนจึงลองเปลี่ยนเฉพาะค่า
xDCI Supportโดยไม่ต้องเปิดหน้า Advanced ที่ซ่อนอยู่ - ใช้ IFRExtractor-RS ดึงข้อมูล UEFI IFR ของโมดูล
Setup - พบว่าการตั้งค่า
xDCI Supportถูกเก็บอยู่ในตัวแปร UEFIPchSetup- VarStore GUID:
4570B7F1-ADE8-4943-8DC3-406472842384 - VarStoreId:
0x5 - VarOffset:
0x40 - ช่วงค่า:
0x0หรือ0x1
- VarStore GUID:
- ตรวจสอบ
/sys/firmware/efi/efivars/PchSetup-4570b7f1-ade8-4943-8dc3-406472842384ในefivarfsของ Linux- 4 ไบต์แรกของไฟล์
efivarfsเป็นเฮดเดอร์ ดังนั้นค่าจริงของxDCI Supportจึงอยู่ที่ offset0x44 - เมื่อ xDCI ถูกปิด ค่าเป็น
00และหลังเปิดผ่านหน้า BIOS Advanced แล้วจะเปลี่ยนเป็น01
- 4 ไบต์แรกของไฟล์
- แต่เมื่อพยายามเขียนค่าลงตัวแปรนี้โดยตรงจาก userspace หรือ EFI Shell กลับเจอข้อผิดพลาด
EFI_WRITE_PROTECTED- แม้ลบคุณสมบัติ immutable ของ
efivarfsแล้วก็ยังเจอRead-only file system - การแก้จาก EFI Shell ด้วย chipsec ก็เจอข้อผิดพลาดเดียวกัน
- แม้ลบคุณสมบัติ immutable ของ
- เมื่อตามหาลำดับไบต์รอบ
PchSetupในอิมเมจ BIOS ต้นฉบับที่อ่านด้วย SPI programmer แล้วแพตช์เฉพาะบิตxDCI Supportเป็น01จากนั้นแฟลชกลับ xDCI ก็ถูกเปิดใช้งานสำเร็จ - วิธีนี้ยังต้องแฟลชชิป SPI ใหม่อยู่ แต่ไม่ต้องแพตช์หน้า Advanced หรือเลี่ยง Boot Guard และไม่ทำให้ TPM พัง
- บน BIOS 1.37 หลังแพตช์ NVRAM แล้วอัปเดตเป็น 1.61 ค่าการตั้งค่า BIOS ยังคงอยู่ จึงไม่ต้องแพตช์ซ้ำ
การจำลองอุปกรณ์ USB ด้วย xDCI
- ตัวอย่างทั้งหมดตั้งอยู่บนสมมติฐานว่าเปิด xDCI จาก BIOS แล้ว,
intel_xhci_usb_sw-role-switchถูกสลับเป็นdeviceแล้ว และเชื่อมต่อพอร์ต xDCI กับ USB host ด้วยสายที่ตัดVBUS -
Legacy gadget drivers
- legacy gadget drivers ของซับซิสเต็ม Linux USB Gadget จะจำลองอุปกรณ์ USB ตามคลาสที่กำหนดทันทีเมื่อโหลดโมดูล
g_mass_storageจะเปิดเผยอิมเมจไฟล์ระบบเป็นอุปกรณ์ USB mass storage- สร้างอิมเมจ FAT
disk.imgใส่Hi from xDCIลงในfile.txtแล้วโหลดด้วยsudo modprobe g_mass_storage file=./disk.img stall=0 - ฝั่ง USB host จะเมานต์ไดรฟ์โดยอัตโนมัติและอ่านเนื้อหาไฟล์ได้
-
Raw Gadget
- ทดลองใช้ Raw Gadget ร่วมกับ xDCI เพื่อรันตัวอย่างคีย์บอร์ด USB
- ตอนแรกการทำงานค้างอยู่ระหว่างจัดการ
SET_CONFIGURATION - สาเหตุคือ
dwc3และไดรเวอร์ UDC บางตัวสมมติว่าสามารถตอบรับ control request แบบความยาว 0 ได้ทันทีโดยไม่ต้องรอให้ gadget driver ตรวจสอบ - หลังใช้ workaround patch กับ Raw Gadget และ แก้ไข GadgetFS ด้วย การจำลองคีย์บอร์ดก็สำเร็จ
- พฤติกรรมที่เกี่ยวข้องถูกสรุปไว้ในเอกสารแพตช์ commit
การใช้งานร่วมกับ syzkaller และ Facedancer
- syzkaller สามารถใช้ Raw Gadget เพื่อทำ fuzzing ภายนอกกับ USB stack ของเคอร์เนล Linux ได้
- การ fuzzing USB แบบปกติของ syzkaller ใช้ Dummy HCD/UDC ที่เชื่อม virtual USB Device กับ Host controller ภายในเคอร์เนล
- เพื่อใช้ xDCI ผู้เขียนแก้โค้ดระบุ UDC ของ syzkaller จาก
dummy_udcเป็นdwc3-gadget,dwc3.1.auto - จากนั้นรัน reproducer ของบั๊ก
WARNING in smsusb_start_streaming/usb_submit_urbที่ syzkaller พบด้วยsyz-execprog -enable=usb- บนโน้ตบุ๊กที่ใช้เคอร์เนล Ubuntu
5.15.0-91-genericเป็น host สามารถทำให้คำเตือนusb_submit_urbเกิดซ้ำได้ - บั๊กนี้เป็น
WARNINGที่เกิดจากไดรเวอร์smsusbไม่ตรวจสอบชนิดของ USB endpoint และไม่ได้ก่อให้เกิดพฤติกรรมอันตราย
- บนโน้ตบุ๊กที่ใช้เคอร์เนล Ubuntu
- Facedancer เป็นเฟรมเวิร์กจำลองอุปกรณ์ USB ที่เขียนด้วย Python
- Facedancer backend ที่อิง Raw Gadget ยังอยู่ในระดับ prototype และพึ่งพาแพตช์ Raw Gadget ที่อยู่นอก tree หลัก
- เมื่อตั้งค่า
BACKEND=rawgadget,RG_UDC_DRIVER=dwc3-gadget,RG_UDC_DEVICE=dwc3.1.autoแล้วรันตัวอย่างrubber-ducky.pyก็ทำงานได้ปกติ
- USB Proxy ที่อิง Raw Gadget ก็ทำงานร่วมกับ xDCI ได้เช่นกัน และทำให้สามารถใช้โน้ตบุ๊กเป็น USB sniffer หรือเครื่องมือ USB Man-in-the-Middle ได้
ความเป็นไปได้กับอุปกรณ์อื่นและแนวทางแบบซอฟต์แวร์
- นอกจาก ThinkPad X1 Carbon 6th Gen แล้ว พีซีรุ่นอื่นก็อาจเปิดใช้งาน xDCI ได้เช่นกัน
- กรณีที่ง่ายที่สุดคือ BIOS มีตัวเลือกให้เปิด xDCI อยู่แล้ว
- แต่ต้องมีทั้งการรองรับ ACPI และ role switching และพอร์ต xDCI ต้องถูกเดินสายไปยังพอร์ตภายนอก
- ThinkPad รุ่นอื่นก็อาจซ่อนและป้องกันการตั้งค่า xDCI ใน BIOS เช่นกัน จึงอาจยังต้องแฟลชชิป SPI ใหม่
- วิธีแบบ NVRAM สามารถใช้ได้โดยไม่ต้องเลี่ยง Boot Guard
- ชิป SPI ของบางระบบรุ่นใหม่อาจป้องกันการแฟลชใหม่ด้วย RPMC โดยชิปเหล่านี้อาจมีตัวอักษร
Rในชื่อ เช่นW25R128FW
- ตามข้อมูลอัปเดต Shiny Quagsire เคยเปิดใช้งาน xDCI บน XPS 13 และ Surface Go 1 โดยแก้ตัวแปร
PchSetupผ่านgrub-mod-setup_var- บนอุปกรณ์เหล่านั้นตัวแปร
PchSetupไม่ได้ถูกป้องกัน จึงทำได้ด้วยซอฟต์แวร์ล้วน
- บนอุปกรณ์เหล่านั้นตัวแปร
- แนวทางซอฟต์แวร์อื่น ๆ อาจรวมถึงการใช้ช่องโหว่ BIOS เพื่อเปลี่ยนตัวแปร NVRAM ที่เกี่ยวกับ xDCI หรือโจมตี BIOS ผ่าน DMA ระหว่างบูตเพื่อรันโค้ดตามต้องการ
- คำว่า “secret” ในชื่อเรื่องใกล้เคียงกับการสื่อถึงความสามารถที่ไม่ได้มีเอกสารอธิบาย มากกว่าจะหมายถึงการซ่อนโดยตั้งใจ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
สงสัยมาตลอดว่าทำไมฟีเจอร์ที่ใช้แล็ปท็อปเป็น คีย์บอร์ดและจอมอนิเตอร์อเนกประสงค์ สำหรับคอมพิวเตอร์เครื่องอื่นถึงไม่ค่อยมีให้เห็น
การซื้อคีย์บอร์ดกับจอใหม่เพื่อดูแลเครื่องแบบ headless มันดูแปลก เพราะแล็ปท็อปที่มีอยู่แล้วก็ทำหน้าที่นั้นได้
แท็บเล็ต Minisforum V3 ที่กำลังจะออกมาก็มีอินพุตวิดีโอ จึงใช้เป็นจอภายนอกได้ แต่ดูเหมือนว่าจะไม่แชร์คีย์บอร์ดกับเมาส์ด้วย
ถ้าฟีเจอร์แบบนี้แพร่หลายกว่านี้คงดีมาก
สามารถสลับเมาส์และคีย์บอร์ดไปยังพอร์ตภายนอกเพื่อเชื่อมต่อกับเครื่องอื่นด้วยสายได้ และด้านข้างมีพอร์ต HDMI สองพอร์ต พอร์ตหนึ่งเป็นเอาต์พุต อีกพอร์ตเป็นอินพุต
ใช้สวิตช์ภายในเลือกได้ว่าจะใช้เครื่องของเด็คนั้นเองหรืออินพุตภายนอกเป็นแหล่งสัญญาณของจอ
โดยพื้นฐานคือชิปที่ แคปเจอร์สัญญาณ HDMI ของเครื่อง headless แล้วเผยแพร่ผ่าน USB ให้แล็ปท็อปเห็นเป็นเว็บแคมที่จำลองขึ้นมา และชิ้นส่วนอิเล็กทรอนิกส์ก็เล็กพอจะใส่อยู่ในสายได้
ส่วนคีย์บอร์ด ผมยังไม่เจอทางออกที่ดีนอกจากซื้อคีย์บอร์ดไร้สายมาตรฐาน และแบบมีแทร็กแพดในตัวเผื่อเวลาที่ต้องใช้เมาส์บ้างเป็นครั้งคราว
ได้ยินมาว่า USB 4 มีโหมดที่ทำให้ทำแบบนี้ได้
https://web.archive.org/web/20180610141436/http://anselm.hoffmeister.be/computer/hidclient/index.html.en
https://github.com/benizi/hidclient
นึกถึงกรณีหนึ่งที่จำได้ว่า Travis Goodspeed เคยทำไว้เมื่อหลายปีก่อน
สมาร์ตทีวีรับอัปเดตเฟิร์มแวร์จากไฟล์ในแฟลชไดรฟ์ USB ทั่วไป และทีวีจะอ่านไฟล์ตั้งแต่ต้นจนจบเพื่อตรวจสอบลายเซ็นดิจิทัล จากนั้นอ่านอีกครั้งเพื่อทำการอัปเดต
ถ้าเป็นอุปกรณ์ที่แกล้งทำตัวเป็นสตอเรจ USB ก็สามารถส่งไฟล์เฟิร์มแวร์ของผู้ผลิตในการอ่านครั้งแรก แล้วส่งเฟิร์มแวร์ไม่เป็นทางการในการอ่านครั้งที่สองได้
https://en.m.wikipedia.org/wiki/Time-of-check_to_time-of-use
น่าสนใจมาก ผมเคยสำรวจตัวเลือกที่ทำได้จริงในแนวคล้ายกันมาแล้ว
ผมมี เซิร์ฟเวอร์ NAS ทรงพลังที่พยายามหาเหตุผลมาใช้งานอยู่เรื่อย ๆ และในบ้านก็ต่อเครือข่าย 40G กับ 10G ไว้หลายจุด
PS5 กับ XBox ใช้ฮาร์ดดิสก์ USB เป็นพื้นที่เก็บข้อมูลเพิ่มเติม
พอลองดูว่าสามารถเปิดพื้นที่เก็บข้อมูลของ NAS ให้ PS5 กับ XBox เห็นได้ไหม ก็พบว่าทำได้ โดยเมานต์แชร์ของ NAS ผ่าน iSCSI หรือ NFS แล้วใช้โมดูล g_mass_storage จำลองอุปกรณ์เก็บข้อมูล USB เพื่อเผยแพร่พื้นที่นั้นให้ USB host เห็น
ตอนนี้อุปสรรคใหญ่ นอกจากเวลาและค่าใช้จ่ายแล้ว คือแบนด์วิดท์ที่ระบบแบบนี้จะให้ได้ การอัปเกรดไม่ได้เพิ่มขึ้นมากนัก
Raspberry Pi ขึ้นชื่อว่ารองรับ USB-OTG แต่ก็หยุดอยู่ที่ความเร็ว USB 2.0 และ SBC รุ่นใกล้เคียงที่ค้นดูก็ส่วนใหญ่เป็นแบบเดียวกัน ข้อยกเว้นคือ RockPi4 และ RockPi มีพอร์ตอีเทอร์เน็ตกิกะบิต ดังนั้นถ้าใช้อีเทอร์เน็ตได้เต็ม ก็จะให้ความเร็วระดับ HDD ที่เสถียรกับทั้ง PS5 และ Xbox ได้
ถ้าสร้าง โซลูชันที่เกิน 1GbE ได้ ด้วยการเสียบการ์ดเครือข่าย PCIe แบบคัสตอมหรือการ์ด Express ก็น่าจะน่าสนใจทีเดียว เพราะจะทำให้อินเทอร์เฟซ USB 3.0 อิ่มตัวได้จริง
ถึงจะต้องมีไคลเอนต์ที่สื่อสารกับเซิร์ฟเวอร์ แต่ดูเหมือนจะทำงานได้ค่อนข้างดี
กำลังคิดถึงการวาง “USB client แบบบาง” ไว้บนโต๊ะ แล้วต่ออุปกรณ์ USB เข้ากับมัน จากนั้นเชื่อมหรือสลับไปยังโฮสต์จริงหรือโฮสต์ VM ที่ต้องการในแล็บ
เดาว่า NAS → SBC → PS5 หรือไม่ก็เอา NAS ต่อเข้ากับ PS5 โดยตรงด้วยสาย USB?
ยังสงสัยด้วยว่าการเล่นคอนเทนต์บน PS5 เป็นอย่างไร เห็นว่า NVMe ภายในต้องผ่านความเร็วระดับหนึ่ง แล้วข้อกำหนดนี้ไม่ใช้กับไดรฟ์ภายนอกหรือ?
ที่จริง NanoPi R6S มี พอร์ตอีเทอร์เน็ต 2.5G สองพอร์ต นอกเหนือจากพอร์ต 1 กิกะบิตด้วย
ขอบคุณสำหรับบทความที่ละเอียดมาก คุณภาพดี
การที่สิ่งนี้ทำได้จริงทำให้มีความหวังว่า อาจทำชุดคล้าย Synergy / Mouse Without Borders แบบไม่ต้องใช้เครือข่ายได้ด้วยสาย USB ที่ดัดแปลงเท่านั้น
สำหรับคนที่ต้องควบคุมคอมพิวเตอร์หลายเครื่องพร้อมกัน นี่เป็นทิศทางที่ดีมาก
ถึงอย่างนั้น วิธีที่เสนอมาก็ฟังดูน่าสนใจ
เมื่อเร็ว ๆ นี้ผมลองหาข้อมูลเรื่องคล้าย ๆ กัน เพราะอยากเชื่อมต่อเครื่อง USB-C สองเครื่องด้วยสาย USB-C เส้นเดียวเพื่อสื่อสารกันที่ 10Gbps
น่าเสียดายที่บอร์ด Ryzen ส่วนใหญ่ยังไม่มี Thunderbolt และถ้าเป็น Thunderbolt ก็จะรองรับสิ่งนี้แบบเนทีฟได้ง่าย ๆ
คอนโทรลเลอร์ USB แบบ “dual-role” ก็ยังค่อนข้างหายากจนก่อน USB 3.2/4.0 และแม้จะทำได้อย่างที่บทความนี้พูดถึง ก็มักไม่ได้รับการรองรับ
รู้สึกแปลกมากที่การเอาเครื่องสองเครื่องมาต่อเป็นเครือข่ายกันผ่านสาย USB-C โดยไม่มี Thunderbolt นั้นยากขนาดนี้
ส่วนที่บิตล็อกถูกปลดหลังจาก suspend ก็ชอบเหมือนกัน ปัญหาแบบนี้พบได้บ่อยจริง ๆ เช่น เป็นวิธีที่เจอบ่อยมากเวลาทำให้อุปกรณ์ SATA หลุดจากสถานะที่ขัดขวางการ secure erase
ระดับความลึกน่าประทับใจมาก
ถ้าใช้พีซีเป็น อุปกรณ์ USB ได้ ก็จะเปิดความเป็นไปได้น่าสนุกขึ้นมาอีกมาก
น่าเสียดายนิดหน่อยที่ตัวเลือก xDCI ที่จำเป็นมีอยู่ในฮาร์ดแวร์ของอุปกรณ์นี้ แต่ไม่ได้ถูกเปิดให้เห็น และถ้าจะเข้าถึงก็ต้องแฮ็กเฟิร์มแวร์
สรุปคือฮาร์ดแวร์ทำได้ แต่ผู้ผลิตแค่ปิดไว้และล็อกฟังก์ชันควบคุมเอาไว้
สงสัยว่า Lenovo ใช้ช่องทางนี้เพื่อดีบัก ThinkPad อีกเครื่องด้วย ThinkPad เครื่องหนึ่งหรือเปล่า
https://www.intel.com/content/www/us/en/developer/articles/technical/software-security-guidance/secure-coding/intel-debug-technology.html
อัปเดต: น่าจะใช่
https://www.youtube.com/watch?v=ExUvQa_jB7c
เป็นวิดีโอเกี่ยวกับการดีบัก Intel Firmware ด้วย DCI และ USB 3.0
ส่วนที่ว่า “แต่การจัดการ Raspberry Pi นั้นยุ่งยาก: ต่อสาย, บูตบอร์ด, เข้าเชลล์ ฯลฯ” น่าจะตั้งค่า USB OTG ก็พอแล้ว
น่าจะทำให้รับไฟจากอุปกรณ์ที่เสียบอยู่ เปิดเชลล์ แล้วจัดการด้วยสคริปต์ได้
จากนั้นก็น่าจะตั้งค่าเมานต์หรือรันคำสั่งผ่าน SSH และอาจถึงขั้นเมานต์อุปกรณ์ได้ด้วย
ถึงอย่างนั้นก็ยังสนับสนุนความพยายามที่จะทำความเข้าใจอุปกรณ์ของตัวเองและลองอ่านเคอร์เนลอยู่ดี เป็นสิ่งที่อยากทำให้ดีขึ้นเรื่อย ๆ และให้ความรู้สึกว่าอุปกรณ์ของเรา เราก็ควรซ่อมเอง
ลองทำเองแล้ว
ทำให้นึกถึง วัฒนธรรมแฮ็กเกอร์ ยุคอินเทอร์เน็ตตอนต้นอย่างแรง จนชวนให้คิดถึงอดีต เป็นบทความที่ยอดเยี่ยมจริง ๆ
คนแบบนี้แหละคือสิ่งที่ ESR พูดถึงเวลาเขาพูดเรื่องการเป็นแฮ็กเกอร์ หรือแฮ็กเกอร์ในความหมายของ Hacker News
การผสมผสานระหว่างความอยากรู้อยากเห็น ความพากเพียร และทักษะทางเทคนิคแบบนี้พบได้ยากมาก และน่าประทับใจอย่างยิ่ง
ผมมีระบบที่ใช้ Celeron N3350/Pentium N4200/Atom E3900 อยู่ และใน BIOS มี สวิตช์ xDCI โผล่มาให้เห็น
พอเปิดใช้ ก็มีตัวเลือกอื่น ๆ เพิ่มขึ้นมาอีกสองสามอย่าง และเมื่อบูตเข้า Linux จะเห็นอุปกรณ์ PCI
USB controller: Intel Corporation Device 5aaa (rev 0b)แต่โหนดอุปกรณ์ UDC ไม่ปรากฏขึ้นมา คงต้องลองขุดต่อโดยอาศัยเบาะแสจากต้นฉบับดู