จะได้สิทธิ์ root ด้วยไฟแช็กบุหรี่ได้ไหม?
(da.vidbuchanan.co.uk)- มีการทดลองยกระดับสิทธิ์ภายในเครื่องสำเร็จ โดยใช้เพียง ไฟแช็กบุหรี่ แบบเพียโซอิเล็กทริกเพื่อเหนี่ยวนำความผิดพลาดทางแม่เหล็กไฟฟ้าบนบัสหน่วยความจำ DDR3 ของแล็ปท็อป จากผู้ใช้ Linux ที่ไม่มีสิทธิ์ไปจนถึง เชลล์ root
- บนแล็ปท็อป Samsung S3520 ได้บัดกรี ตัวต้านทาน 15Ω และสายไฟที่ทำหน้าที่เป็นเสาอากาศ เข้ากับขา data ของ SODIMM แล้วคลิกไฟแช็กใกล้ ๆ เพื่อสร้างข้อผิดพลาดในหน่วยความจำที่ทำให้บิตบางตำแหน่งพลิก
- ในการทดลองกับ CPython ใช้ความผิดพลาดบนเส้น DQ7 พลิก bit 7 ของพอยน์เตอร์อ็อบเจ็กต์ ให้ไปอ้างอิงโครงสร้าง
bytearrayปลอมภายในbytesแล้วสร้าง primitive สำหรับอ่าน/เขียนหน่วยความจำตามอำเภอใจ - การยกระดับสิทธิ์บน Linux ทำงานโดยพ่น page table จำนวนมากลงในหน่วยความจำกายภาพ จากนั้นเหนี่ยวนำความผิดพลาด bit 29 ระหว่างอ่าน PTE เพื่อให้ mapping ที่ผู้ใช้เข้าถึงได้ชี้ไปยัง page table
- หลังสำเร็จ จะค้นหาหน้าแรกของ
/usr/bin/suในหน่วยความจำกายภาพ แล้วแทนที่ด้วย ELF ขนาดเล็กแบบ setuid root เพื่อ ทำให้ page cache ปนเปื้อน โดยในสภาพแวดล้อมทดลอง ความน่าเชื่อถือที่รู้สึกได้อยู่ราว 50% เมื่อเชื่อมต่อผ่าน SSH และราว 20% เมื่อใช้กราฟิกเชลล์
จุดเริ่มต้นของการทดลอง EMFI ด้วยไฟแช็ก
- แม้ไม่มีบั๊กซอฟต์แวร์ ก็สามารถสร้างพฤติกรรมผิดปกติได้ด้วย การฉีดความผิดพลาด (fault injection)
- วิธีฉีดความผิดพลาดมีทั้งการทำให้ข้อมูลควบคุมของซอฟต์แวร์เสียหาย, power glitch, clock glitch, พัลส์แม่เหล็กไฟฟ้า, เลเซอร์ เป็นต้น
- การฉีดความผิดพลาดบนฮาร์ดแวร์มักต้องอาศัย ความแม่นยำของเวลาและตำแหน่ง ที่จะใส่ความผิดพลาด จึงต้องมีอุปกรณ์เฉพาะทางและมีค่าใช้จ่าย
- แนวทางต้นทุนต่ำมีความพยายามอย่าง PicoEMP ที่ใช้ RP2040 และ "Laser Fault Injection for The Masses"
- จุดเริ่มต้นคือแนวทางที่นำที่จุดเตา BBQ แบบเพียโซอิเล็กทริกมาต่อกับอินดักเตอร์ เพื่อใช้เป็นเครื่องมือ ฉีดความผิดพลาดทางแม่เหล็กไฟฟ้า (EMFI) ราคาประหยัด
- ก่อนหน้านี้เคยโจมตีการ implement AES ด้วยซอฟต์แวร์ที่รันบน Arduino ได้สำเร็จด้วย DFA
- ในบริบทที่การประกาศ Nintendo Switch 2 ใกล้เข้ามา ผู้ทดลองคาดว่าจะมีซอฟต์แวร์ระบบคล้าย Switch 1 และขาดบั๊กซอฟต์แวร์ จึงกลับมาทดลอง EMFI ต้นทุนต่ำอีกครั้ง
เป้าหมายทดสอบและความผิดพลาดบนบัส DDR
- เป้าหมายทดสอบคือแล็ปท็อป Samsung S3520 ผลิตปี 2011 ที่ใช้ CPU Intel i3-2310M และ RAM DDR3 1GB
- เลือกเพราะรัน Arch ซึ่งเป็นดิสโทร Linux เดสก์ท็อปขนาดเบาได้ และหากเสียหายก็ไม่เดือดร้อนมาก
- เป้าหมายคือเขียน exploit ยกระดับสิทธิ์ภายในเครื่อง ที่ทำงานบนพื้นฐานของความผิดพลาดฮาร์ดแวร์ที่ถูกฉีดเข้าไป
- จุดที่เปราะบางที่สุดทางกายภาพที่เลือกคือ บัส DDR ซึ่งเชื่อม DRAM กับระบบ
- SODIMM มีขา DQ 64 ขา คือ DQ0~DQ63 สำหรับส่งบิตข้อมูลอ่าน/เขียน
- อุปกรณ์ทดลองมีโครงสร้างเป็นการบัดกรี ตัวต้านทาน 15Ω และสายไฟ หนึ่งเส้นเข้ากับขาที่คาดว่าเป็น DQ26
- สายไฟรับสัญญาณรบกวนแม่เหล็กไฟฟ้ารอบข้างเหมือนเสาอากาศ แล้วส่งต่อไปยังบัสข้อมูล
- ตัวต้านทานมีไว้จำกัดความแรงของสัญญาณรบกวนเพื่อไม่ให้ขัดขวางการทำงานปกติของหน่วยความจำตลอดเวลา และในทางปฏิบัติอาจไม่จำเป็นก็ได้
- เพียงคลิกไฟแช็กแบบเพียโซอิเล็กทริกทั่วไปใกล้สายเสาอากาศ ก็ทำให้ memtest แสดงข้อผิดพลาดหน่วยความจำได้อย่างเสถียร
- ข้อผิดพลาดที่แสดงทั้งหมดอยู่ในรูปแบบที่ bit 29 พลิก
- แม้ขาที่บัดกรีถูกคาดว่าเป็น DQ26 แต่สาเหตุที่ bit 29 พลิกอาจเป็นเพราะนับขาผิด หรือเมนบอร์ดสลับการเดินสาย data line
- เพราะอยู่ในระดับความเร็วการตอบสนองของนิ้วมือ การ ควบคุม timing ของการฉีดความผิดพลาดจึงไม่แม่นยำ
- เมื่อเกิดความผิดพลาด มีความเป็นไปได้สูงว่าบิตเดียวกันจะพลิกในการอ่านหรือเขียน 64 บิตรายการหนึ่ง
ใช้ประโยชน์จาก bit flip ใน CPython
- การทดลองแรกคือสร้าง exploit ในรูปแบบ sandbox escape บน CPython
- ตัว CPython เองไม่ใช่ sandbox จึงไม่ใช่การข้ามขอบเขตความปลอดภัยจริง แต่เป็นขั้นเตรียมการที่ใช้โครงสร้างภายในที่คุ้นเคย
- ในการทดลองนี้ใช้สายที่บัดกรีกับ DQ7 แทน DQ26 ในภาพก่อนหน้า
- อ็อบเจ็กต์ CPython อยู่ใน heap ของ garbage collection และใน header ของอ็อบเจ็กต์มี refcount กับพอยน์เตอร์ไปยัง type object จากนั้นตามด้วยฟิลด์เฉพาะตามชนิด
- อ็อบเจ็กต์
bytesมีฟิลด์ความยาว แล้วตามด้วยข้อมูลจริงภายใน heap allocation เดียวกัน - อ็อบเจ็กต์
bytearrayมีฟิลด์ความยาว แล้วตามด้วยพอยน์เตอร์ไปยังบัฟเฟอร์ที่เก็บข้อมูลจริง
- อ็อบเจ็กต์
- กลยุทธ์หลักคือใส่โครงสร้าง
bytearrayปลอมเป็นข้อมูลไว้ภายในอ็อบเจ็กต์bytes- หากหลอกให้ CPython ให้ reference ไปยังอ็อบเจ็กต์ปลอมนี้ได้ ก็จะอ่าน/เขียนหน่วยความจำตามอำเภอใจได้ด้วยฟิลด์ความยาวและพอยน์เตอร์ของ
bytearrayที่ผู้โจมตีเลือก
- หากหลอกให้ CPython ให้ reference ไปยังอ็อบเจ็กต์ปลอมนี้ได้ ก็จะอ่าน/เขียนหน่วยความจำตามอำเภอใจได้ด้วยฟิลด์ความยาวและพอยน์เตอร์ของ
- ความผิดพลาดที่พลิก bit 7 มีผลเหมือน บวกหรือลบ 128 ให้พอยน์เตอร์ใน word 64 บิต
- หากวาง
bytearrayปลอมไว้ที่ offset +128 ไบต์ภายในอ็อบเจ็กต์bytesพอยน์เตอร์ของอ็อบเจ็กต์bytesอาจกลายเป็นพอยน์เตอร์ของbytearrayปลอมได้จากความผิดพลาด - การแปลงนี้มีโอกาส 50% ที่จะเป็นทิศทางที่ต้องการ
- หากวาง
- สิ่งสำคัญคือการ glitch การอ่าน/เขียนบนบัสหน่วยความจำ ไม่ใช่ เนื้อหา ของหน่วยความจำเอง
- ไม่ใช่วิธีที่ข้อมูลที่จัดเก็บถูกเปลี่ยนแบบ Rowhammer แต่เป็นการทำให้ access ที่กำลังเกิดขึ้นบนบัสเสียหาย
- เติม reference ไปยังอ็อบเจ็กต์เดียวกันใน tuple ขนาดใหญ่ เพื่อให้การเข้าถึงพอยน์เตอร์ที่ต้องการเป็นกิจกรรมส่วนใหญ่บนบัส
- เนื่องจาก CPU cache ลดการเข้าถึง DRAM จึงสร้างโครงสร้างที่ใหญ่กว่า cache 3MiB แล้วเข้าถึงตามลำดับ เพื่อให้แต่ละครั้งต้องอ่านจาก DRAM
isของ Python ทำงานคล้ายการเปรียบเทียบพอยน์เตอร์ จึงใช้ตรวจสอบได้ว่าพอยน์เตอร์เปลี่ยนหรือไม่
- ซอร์ส exploit CPython ทั้งหมดอยู่ที่ ddr3_dq7.py
- สามารถใช้ตัวแปร
TESTINGจำลอง bit flip ในซอฟต์แวร์โดยไม่ต้องมีฮาร์ดแวร์ได้
- สามารถใช้ตัวแปร
โครงสร้างหน่วยความจำที่จำเป็นต่อการยกระดับสิทธิ์บน Linux
- ในการยกระดับสิทธิ์ภายในเครื่องบน Linux โครงสร้างสำคัญคือ cache, virtual memory กับ page table และ TLB
- DRAM ค่อนข้างช้า CPU จึงใช้ cache L1, L2, L3
- L3 cache ของแล็ปท็อปทดลองคือ 3MiB
- เมื่อ cache hit จะไม่เข้าถึง DRAM และต้องเกิด cache miss จึงจะมีการอ่าน DRAM
- หน่วยขั้นต่ำในมุมมองของ cache คือ cache line และบนแล็ปท็อปนี้มีขนาด 64 ไบต์
- แม้อ่านเพียงหนึ่งไบต์ หากข้อมูลนั้นยังไม่อยู่ใน cache ก็จะเกิดการอ่าน DRAM 64 ไบต์
- บัสข้อมูล DDR กว้าง 64 บิต ดังนั้นการอ่านนี้จะถูกจัดการเป็น burst ของการเข้าถึงต่อเนื่อง 8 ครั้ง
- virtual memory ของ x86-64 ถูก implement ด้วย page ขนาด 4KiB และ page table รูปแบบต้นไม้
- แพลตฟอร์มนี้มี page table 4 ชั้น
- page table แต่ละตัวเป็น page ขนาด 4KiB และมี PTE 64 บิตจำนวน 512 รายการ
- PTE ชั้นบนชี้ไปยังที่อยู่กายภาพของ page table ชั้นถัดไป ส่วน PTE level 0 ชี้ไปยัง page กายภาพเป้าหมาย
- ที่อยู่กายภาพของ root page table ถูกเก็บไว้ในรีจิสเตอร์ CPU CR3
- ส่วนที่ต้องใช้ใน PTE คือฟิลด์ที่อยู่กายภาพ
- เมื่อ mask บิต flag ออก จะเหลือที่อยู่หน่วยความจำกายภาพที่จัดแนวตาม page
- TLB คือฮาร์ดแวร์ภายใน CPU ที่ cache mapping ของ page จาก virtual address ไป physical address
- ไม่ทราบขนาด TLB ที่แน่นอนของแล็ปท็อปทดลอง แต่ดูเหมือนจะอยู่ราว 1024 entries
ดึง page table เข้ามาในหน่วยความจำของผู้ใช้
- กลยุทธ์ exploit บน Linux ได้แรงบันดาลใจจากองค์ประกอบของ Rowhammer exploit ของ Mark Seaborn
- เป้าหมายคือ map page table ของ process ตัวเองให้เป็นหน่วยความจำที่ผู้ใช้เข้าถึงได้
- เมื่อเป็นเช่นนั้นก็จะแก้ไข PTE เพื่อเข้าถึงหน่วยความจำกายภาพตามอำเภอใจได้
- แทนที่จะควบคุมการจัดวางหน่วยความจำกายภาพอย่างแม่นยำ จะเติมหน่วยความจำกายภาพให้ตรง 50% ด้วย page table level-0
- จากนั้นเข้าถึง mapping R/W ซ้ำ ๆ เพื่อหลบเลี่ยง TLB
- เพราะจำนวน mapping เกินขนาด TLB จึงบังคับให้เกิดการเดิน page table ในแต่ละครั้งได้
- เป้าหมายคือทำให้เกิดความผิดพลาด bit 29 ระหว่างอ่าน PTE level-0 ในการเดินดังกล่าว
- เมื่อ bit 29 พลิก ที่อยู่กายภาพที่ PTE ชี้ไปจะเปลี่ยนไปด้วย offset 512MiB
- หากโชคดี ที่อยู่ที่เปลี่ยนไปจะชี้ไปยัง page table level-0 ตัวหนึ่งที่พ่นไว้ก่อนหน้า
- ในกรณีนี้ mapping ที่เดิมควรมองเห็นเป็น page R/W ปกติ จะเปิดเผย page table ออกมาเหมือนเป็น page R/W ปกติ
- ตามทฤษฎี bit flip ใด ๆ ตั้งแต่ bit 29 ถึง bit 12 ก็อาจใช้งานได้
- bit 12 เท่ากับ offset 4KiB
- แก่นสำคัญคือ PTE ชี้ไป “ที่อื่น” และหน่วยความจำกายภาพราว 50% ถูกเติมด้วย page table ที่นำมาใช้โจมตีได้
- การบัดกรีสายเสาอากาศอาจไม่จำเป็นเสมอไป
- หากสร้างสัญญาณรบกวนแม่เหล็กไฟฟ้าที่แรงพอได้ ก็มีความเป็นไปได้ แต่โอกาสระบบ crash หรือเสียหายจะสูงกว่ามาก
วิธีพ่น page table level-0
- ขั้นแรกสร้างไฟล์บนหน่วยความจำด้วย memfd_create ของ Linux
- ทำหน้าที่เดียวกับไฟล์
/dev/shm/ใน exploit ของ Mark Seaborn แต่ไม่แตะ filesystem โดยตรง
- ทำหน้าที่เดียวกับไฟล์
- map บัฟเฟอร์เดียวกันหลายครั้งด้วย mmap
- ใช้ตัวเลือก
MAP_FIXEDเพื่อบังคับให้แต่ละ mapping จัดแนว 2MiB ใน virtual memory - การจัดแนวนี้รับประกันว่าจะสร้าง page table level-0 ใหม่ทุกครั้ง
- ใช้ตัวเลือก
- Linux มีข้อจำกัดจำนวน mapping ต่อ process หรือ VMA ประมาณ 2^16
- จึงทำให้แต่ละ mapping ยาว 32MiB เพื่อให้ mapping หนึ่งสร้าง page table level-0 จำนวน 16 ตัว
- แต่ละ mapping ใช้พื้นที่ 32MiB ใน virtual address space แต่ PTE ชี้ไปยัง physical page เดียวกัน
- ต้นทุนหน่วยความจำกายภาพมีเพียง page table level-0 เท่านั้น
- ด้วยวิธีนี้สามารถพ่น page table ได้จนกว่าหน่วยความจำจะเต็ม
อ่าน/เขียนหน่วยความจำกายภาพและทำให้ page cache ของ su ปนเปื้อน
- ระหว่างรอความผิดพลาด จะเข้าถึง mapping R/W ซ้ำ ๆ และหากค่าที่ส่งคืนไม่ตรงกับที่คาด จะตรวจพบความผิดพลาด
- หากข้อมูลที่ส่งคืนดูเหมือน PTE แปลว่าได้สิทธิ์เข้าถึง R/W ไปยัง page table แล้ว
- ขั้นถัดไปคือหาว่า page table นี้สอดคล้องกับ virtual address ใด
- แก้ PTE ให้ชี้ไปยังที่อยู่กายภาพ 0
- จากนั้นสแกน mapping R/W อีกครั้งเพื่อหาว่า mapping ใดเปลี่ยนไป
- แม้แก้ PTE แล้ว MMU จะไม่รู้ทันที
- เพราะ mapping virtual-physical ถูก cache ไว้ใน TLB
- เนื่องจากไม่ทราบวิธี flush TLB โดยตรงจาก user space จึงเข้าถึง mapping R/W หลายพันรายการซ้ำ ๆ เพื่อเติมค่าใหม่ลง TLB และผลักค่าเดิมออกไป
- ณ จุดนี้จะสามารถอ่าน/เขียน หน่วยความจำกายภาพ ทั้งหมดได้
- จากนั้นเปิดไฟล์ executable
/usr/bin/suแบบ read-only แล้ว mmap หน้าแรก/usr/bin/suเป็น executable แบบ setuid root- สแกนหน่วยความจำกายภาพทั้งหมดเพื่อหา page เดียวกัน
- เมื่อพบ physical page นั้น จะเขียนทับด้วย ELF payload ขนาดต่ำกว่า 4KiB ที่เปิดเชลล์ root
- เมื่อ
suถูกเรียกใช้ครั้งถัดไป Linux จะเห็นว่าหน้าแรกอยู่ในหน่วยความจำแล้ว และไม่อ่านซ้ำจากดิสก์- จึงใช้ page cache ที่ปนเปื้อนซ้ำและรัน ELF ที่ถูกฉีดเข้าไป
- ELF ที่ฉีดเข้าไปจะล้าง page cache ด้วย
echo 1 > /proc/sys/vm/drop_cachesเพื่อให้การรันsuครั้งถัดไปกลับมาทำงานตามปกติ
- ซอร์ส exploit Linux ทั้งหมดอยู่ที่ linux_x86_64_lpe.c
ความน่าเชื่อถือและข้อจำกัดของสภาพแวดล้อม
- ในการรันเดโม โชคดีที่เกิด glitch ที่ดีจากการคลิกไฟแช็กเพียงครั้งเดียว
- ในความพยายามหลายครั้งก่อนหน้า ระบบทั้งระบบ crash
- ความน่าเชื่อถือโดยรวมของ exploit ไม่ได้ถูกวัดอย่างเข้มงวด
- เมื่อปิดหน้าจอแล็ปท็อปและเชื่อมต่อผ่าน SSH ความรู้สึกอยู่ที่ราว 50%
- ในกราฟิกเชลล์ใกล้เคียง 20%
- ระบบทดลองใช้กราฟิกแบบรวม
- การเข้าถึงหน่วยความจำของ GPU อาจรบกวน exploit
- background service ที่เกี่ยวกับ pipewire, sshd, systemd และ swap ก็เปิดอยู่ด้วย
- เป็นทางเลือกเพื่อคงสภาพแวดล้อม Linux เดสก์ท็อปที่สมจริง และหากปิดใช้งาน ความน่าเชื่อถืออาจสูงขึ้น
- หากติดตั้ง RAM มากกว่านี้ ก็อาจเติม page table ได้ในสัดส่วนที่สูงกว่า และเพิ่มความน่าเชื่อถือโดยรวมได้
การใช้งานที่เป็นไปได้และคำถามที่ยังเหลือ
- หากสามารถทำ EMFI ยกระดับสิทธิ์ภายในเครื่องบน Windows ได้อย่างน่าเชื่อถือ ก็อาจส่งผลต่อสถานการณ์ที่ anti-cheat แบบอิง TPM จำกัดซอฟต์แวร์ที่อนุญาตให้รันบนระบบ
- เรื่องคล้ายกันอาจเกิดกับการตรวจสอบ SafetyNet หรือ Play Integrity ของ Android ได้ แต่การใส่ glitch modchip ลงในโทรศัพท์ทำได้ยากกว่า
- ในการเพิ่มประสิทธิภาพระดับต่ำ ความรู้เรื่อง page table และ TLB มักไม่ได้สำคัญโดยตรงเสมอไป แต่ใน exploit นี้ โครงสร้างที่รักษาภาพลวงของ virtual memory กลายเป็นเป้าหมายโจมตีโดยตรง
- ขอบเขตการใช้งานยังมีหลายประเด็นที่ต้องตรวจสอบ
- ใช้ได้กับ DDR4, DDR5 หรือไม่
- ใช้ได้กับ ARM หรือไม่
- ECC หลายประเภท โดยเฉพาะ DDR5 Link-ECC ช่วยบรรเทาได้มากน้อยเพียงใด
- วิธีที่ง่ายที่สุดในการ trigger ความผิดพลาดลักษณะเดียวกันด้วยอุปกรณ์อย่าง RP2040 ทางอิเล็กทรอนิกส์คืออะไร
- ใช้หนีออกจาก hypervisor ได้หรือไม่
- สามารถทำเป็น WebKit exploit หรือ Nintendo Switch kernel exploit ได้หรือไม่
2 ความคิดเห็น
นึกถึงตอนถอดตัวจุดไฟออกจากไฟแช็กไปโกงเพิ่มเครดิตเหรียญในตู้เกมอาร์เคดเลย
ความคิดเห็นจาก Hacker News
แรงบันดาลใจตรงนี้คือการ ได้สิทธิ์ root บน Switch 2 และการได้ root บน Linux ก็เป็นเพียงการพิสูจน์แนวคิด
เป้าหมายไม่ใช่การแสดงช่องโหว่ความปลอดภัยพื้นฐานที่นำไปใช้โจมตีได้จริง แต่ใกล้เคียงกับการทวงคืนความเป็นเจ้าของฮาร์ดแวร์ของตัวเองอย่างแท้จริง โดยไม่ต้องทำลาย TPM หรือระบบแอนตีชีตระดับเคอร์เนลของเกม
งานนี้น่าประทับใจและน่ายินดีที่ช่วยปกป้องเสรีภาพด้านซอฟต์แวร์ แต่ฉันอยากสนับสนุนทางเลือกอื่นมากกว่า ทำไมต้องให้ตัวเลขที่ดูเหมือนฐานติดตั้งและกำไรแก่พวกเขาด้วยล่ะ? ซื้อ Steam Deck หรืออุปกรณ์พกพาอื่นที่ให้ root access เป็นฟีเจอร์ตั้งแต่แรกก็ได้
บทความเขียนได้ดีมากและความท้าทายก็น่าทึ่ง แต่สมองฉันตอบสนองไปทาง สามัญสำนึกของการแฮ็ก ว่า “ถ้ามีการเข้าถึงทางกายภาพ ก็จบแล้ว”
สิ่งแรกที่นึกถึงคือ ถ้ามีการเข้าถึงทางกายภาพ ก็รีแฟลช BIOS ติดตั้งไดรเวอร์แบ็กดอร์ บูตด้วยไลฟ์ OS แล้วแก้
/etc/{passwd,shadow,groups, etc}ได้เลยแต่แล้วก็นึกขึ้นได้ว่าถ้าดิสก์ถูกเข้ารหัส การโจมตีส่วนใหญ่ที่อาศัยการเข้าถึงทางกายภาพจะทำไม่ได้ และในกรณีนั้น การโจมตีแบบนี้ก็ดูน่าสนใจมาก ไอเดียเรื่องเสาอากาศยังต่อยอดเป็นฮาร์ดแวร์ที่ฝังอุปกรณ์รบกวนไว้ได้ และทำให้สื่อสารกับภายนอกผ่านช่องทางไร้สาย เพื่อให้ผู้โจมตีสร้างการรบกวนจากระยะไกลได้ ถ้ามีเว็บไซต์ที่ผู้โจมตีควบคุมไว้หลอกให้เหยื่อเข้าไปเยี่ยมชมด้วย ก็เริ่มดูสมจริงขึ้น
เทคนิค การรบกวนทางแม่เหล็กไฟฟ้า นี้เป็นการหลอก CPU เอง ดังนั้นตราบใดที่ยังไม่มีอัลกอริทึมการเพจแบบใหม่ออกมา ฉันก็ยังไม่แน่ใจว่าจะแก้ได้อย่างไร
PC ของฉันก็ใช้ full-disk encryption เหมือนกัน แต่เมื่อบูตแล้ว คีย์ไฟล์ที่ใช้ถอดรหัสก็ถูกใช้งาน และนับจากจุดนั้นมันก็กลายเป็น PC ที่เข้าถึงทางกายภาพได้
ชอบมาก ประเด็นคือเกิด การพลิกบิตจากไฟฟ้าสถิต ระหว่างการอ่านหรือเขียนหน่วยความจำ และถ้ามีการบัดกรีด้วย ก็สามารถเปลี่ยนพอยน์เตอร์ที่ “ปลอดภัย” ให้กลายเป็นพอยน์เตอร์อันตรายที่ต้องการได้แบบกำหนดได้แน่ชัด
ในทางประวัติศาสตร์ มุมมองต่อการเข้าถึงทางกายภาพคือ “ถ้าคู่ต่อสู้ได้เครื่องไป ก็เกมจบ” TPM และ trusted execution environment ได้เปลี่ยนมุมมองนี้เป็น “แม้ผู้ใช้จะเข้าถึงทางกายภาพได้ แต่การคำนวณบางอย่างภายใน enclave ก็ยังเชื่อถือได้”
ขั้นต่อไปนี่แหละที่น่าสนใจที่สุด จะได้ผลลัพธ์ที่เชื่อถือได้พอสมควรโดยไม่ต้องบัดกรีได้ไหม? ดูน่าจะยากกว่ามาก เพราะมีการคิดรับมือกับการรบกวนทางไฟฟ้าไว้เยอะแล้ว แต่ก็อาจเป็นไปได้ ถ้าทุกครั้งที่กดไฟแช็ก มีบิตสุ่ม 1 บิตพลิกในค่าที่อ่านแบบ 64 บิต และเอ็กซ์พลอยต์ทำงานได้ด้วยการพลิกเพียงหนึ่งใน 4 บิตที่เป็นไปได้ จำนวนครั้งที่ต้องลองโดยเฉลี่ยก็อาจไม่มากนัก
เพราะคุณสามารถเปลี่ยนค่าตรงส่วนไหนของหน่วยความจำก็ได้ตามเวลาที่ต้องการ จึงไม่จำเป็นต้องหวังพึ่งการพลิกบิตแบบสุ่ม แค่ฉีดทั้งโปรแกรมเข้าไปเลยก็ได้
แค่อ่านชื่อเรื่อง ฉันก็นึกว่าเป็นบทความที่มีคน ได้สิทธิ์ root บนไฟแช็กบุหรี่ และก็พร้อมจะเชื่อเต็มที่
เตาอบที่บ้านพ่อแม่ฉันยังได้รับอัปเดตซอฟต์แวร์เป็นประจำ เลยไม่ได้สงสัยเลยว่าไฟแช็กจะ “ฉลาด” ได้ไหม
แน่นอนว่าต้องมีชิปไว้หมุน LiDAR พร้อมทั้งปล่อยแฟลช LED แรง ๆ เอฟเฟ็กต์เฟด แรงสั่นสะเทือน และเอฟเฟ็กต์เสียงด้วย อยากให้มีใครทำเดโมขึ้นมาจริง ๆ ถ้าหน้าตาเหมือนรีวอลเวอร์เล็ก ๆ ก็น่าจะดี แต่เพื่อความปลอดภัยของนิ้วกับฮอตด็อก คงต้องเสริม virtual memory controller ให้แน่นหนาขึ้น
แค่การหลอมตะกั่วจะซับซ้อนได้ขนาดนี้เชียว ดังนั้นบทความเรื่องการรูตไฟแช็กก็ฟังดูน่าเชื่อได้เต็มที่
ทำให้นึกถึงเอ็กซ์พลอยต์ที่เคยใช้กับตู้เกมอาร์เคดในซิดนีย์ช่วงยุค 80~90 ที่โรงเรียนมี ตัวจุดไฟแบบเพียโซ ที่พวกเราเรียกว่า “clicker” อยู่ในเครื่องทำความร้อนแก๊ส และสามารถถอดออกมาได้
เราเอา clicker นั้นไปที่อาร์เคดแถวบ้าน แล้วกดแกร็กที่มุมใดมุมหนึ่งของ CRT ระบบจะได้รับแรงกระตุ้นและเครดิตเกมก็เพิ่มขึ้นมา
เดาว่าเป็นเพราะกราวด์ของ CRT ใช้สายกราวด์ร่วมกับอุปกรณ์ตรวจจับเหรียญในเชิงกายภาพ พอเวลาผ่านไปเจ้าของร้านก็เริ่มรู้ทันและเพิ่มอะไรทำนองสัญญาณเตือนเข้าไป แต่ก่อนหน้านั้นมันเป็นช่วงเวลาที่สุดยอดจริงๆ
ทำอยู่หลายปีจนเจ้าของร้านเริ่มจับได้ แล้วก็เริ่มเอาพลาสติกใสมาคลุมตู้เกมอาร์เคด จากนั้นพอตู้ถูกปิดด้วยพลาสติกก็ต้องเจาะรูด้านหลังไว้ระบายอากาศ และเราก็พบว่าสามารถใช้แท่งไม้ไผ่กดคันโยกที่ใช้ลงทะเบียนการหยอดเหรียญได้
พอเป็นแบบนั้น พวกเขาก็ย้ายช่องระบายอากาศไปไว้ด้านบนแทนด้านหลังเพื่อไม่ให้แตะคันโยกได้ แต่คราวนี้เรากลับรู้ว่าสามารถดันเหรียญขึ้นไปทางช่องคืนเหรียญเพื่อไปโดนคันโยกลงทะเบียนเหรียญได้ เกมฟรีก็เลยยังดำเนินต่อไป สุดท้ายพวกเขาถึงขั้นติดสกรูแหลมไว้ในกล่องช่องคืนเหรียญให้บาดนิ้ว แล้วหลังจากนั้นพวกเราก็ซื้อ SEGA มาเล่นเอง สนุกมากจริงๆ
ไม่รู้ว่าจงใจออกแบบไว้แบบนั้นเพื่อให้พนักงานทดสอบฟรีหรือเปล่า แต่เพื่อนคนนั้นมุดไปด้านหลังแล้วเล่นฟรีต่อเนื่องอยู่เรื่อยๆ
เวอร์ชัน “Jungle Jive” ถ้าใช้ตัวจุดไฟไฟฟ้าของไฟแช็กกระตุ้นเบาๆ ที่ช่องรับโลหะ จะมีโทเค็นออกมาจากอีกฝั่งของเครื่อง ถ้ากดแกร็กถี่เกินไปมากเกินไปมันจะเข้าโหมดเตือน ทำคนเดียวก็ได้ แต่ชุดที่เหมาะที่สุดคือทีม 3 คน: 1 คนคอยดูพนักงาน, 1 คนกด clicker, 1 คนคอยเก็บโทเค็น
https://www.amazon.com/CYBERPUNK-Outlaws-Hackers-Computer-Fr...
ถ้าอ่านในฐานะคนออสเตรเลีย มันจะตีความไปอีกแบบ ตามทักษะการเจรจา บางทีก็อาจได้ root ด้วยแค่ไฟแช็กบุหรี่หนึ่งอัน
ไม่ใช่แค่เอ็กซ์พลอยต์ที่สนุก แต่ยังเป็นมินิอินโทรที่ยอดเยี่ยมสำหรับอธิบายว่า แคชใน CPU ทำงานอย่างไร ด้วย
จำได้ว่าประมาณปีที่แล้วมีบทความที่อธิบายว่าคอมพิวเตอร์ทำงานและถูกสร้างขึ้นมาอย่างไร โดยเริ่มจากส่วนที่เล็กที่สุดอย่างลอจิกเกต มีใครจำได้ไหมว่าเป็นเว็บไซต์อะไร?
https://www.nand2tetris.org/course
“มันเป็นแค่ตัวต้านทาน 15 โอห์มหนึ่งตัวกับสายเส้นหนึ่งที่บัดกรีเข้ากับ DQ26 สายนี้จะทำตัวเหมือนเสาอากาศ รับ สัญญาณรบกวนแม่เหล็กไฟฟ้า ใกล้เคียงแล้วส่งตรงเข้าไปยัง data bus”
นี่เป็นการแฮ็กที่เจ๋งจริงๆ ใช้ไฟแช็กเพื่อสร้างสัญญาณรบกวนแม่เหล็กไฟฟ้าเนี่ยนะ น่าเอาไปจุดข้างๆ DDR bus แล้วดูว่าจะเกิดอะไรขึ้น
แน่นอนว่าถ้าต้อง บัดกรีเสาอากาศเข้ากับหน่วยความจำ ก่อน มันก็ทำได้อยู่แล้ว :-)
ถึงอย่างนั้นก็ยังเป็นบทความที่ยอดเยี่ยมและละเอียดมากเกี่ยวกับวิธีนำกลิตช์ลักษณะนี้ไปใช้โจมตีจริง ไฟแช็กบุหรี่ยังใช้เดินวนแถวประตูหลังของดาต้าเซ็นเตอร์เพื่อรอให้แอดมินออกมาสูบบุหรี่ได้ด้วย
ตอนเห็นชื่อเรื่องครั้งแรก นึกว่าจะเป็นเรื่องการแฮ็กรถ Hyundai รุ่นใหม่ด้วยอุปกรณ์ไฟแช็กบุหรี่แบบ USB-C