ช่องโหว่ใน eBPF ที่อาจเลี่ยงผ่านการป้องกันการโจมตีของ Spectre 4

มีการระบุช่องโหว่สองช่องโหว่ในเคอร์เนลของ Linux ที่อนุญาตให้ระบบย่อย eBPF บายพาสการป้องกันการโจมตี Spectre v4 (SSB, Speculative Store Bypass) การใช้โปรแกรม BPF ที่ไม่ได้รับสิทธิพิเศษ ผู้โจมตีสามารถสร้างเงื่อนไขสำหรับการดำเนินการเชิงคาดเดาของการดำเนินการบางอย่าง และกำหนดเนื้อหาของพื้นที่ตามอำเภอใจของหน่วยความจำเคอร์เนล คุ้มกันระบบย่อย eBPF ในเคอร์เนลเพื่อเข้าถึงช่องโหว่ต้นแบบที่แสดงให้เห็นถึงความเป็นไปได้ในการโจมตีในทางปฏิบัติ ปัญหาได้รับการแก้ไขในรูปแบบของแพตช์ (1, 2) ซึ่งจะเป็นส่วนหนึ่งของการอัปเดตเคอร์เนล Linux ครั้งต่อไป การอัปเดตในการแจกจ่ายยังไม่ได้เกิดขึ้น (Debian, RHEL, SUSE, Arch, Fedora, Ubuntu)

วิธีการโจมตีของ Spectre 4 นั้นขึ้นอยู่กับการคืนค่าข้อมูลที่ตกลงในแคชของโปรเซสเซอร์หลังจากละทิ้งผลลัพธ์ของการดำเนินการเชิงคาดเดาเมื่อประมวลผลการเขียนและการอ่านแบบสลับกันโดยใช้การกำหนดแอดเดรสทางอ้อม เมื่อการดำเนินการอ่านตามหลังการดำเนินการเขียน (เช่น mov [rbx + rcx], 0x0; mov rax, [rdx + rsi]) อาจทราบค่าชดเชยแอดเดรสการอ่านแล้วเนื่องจากมีการดำเนินการที่คล้ายกัน (ดำเนินการอ่าน บ่อยกว่ามากและสามารถอ่านได้จากแคช) และโปรเซสเซอร์สามารถทำการอ่านล่วงหน้าก่อนเขียนโดยไม่รอให้มีการคำนวณค่าชดเชยทางอ้อมในการเขียน

หากตรวจพบจุดตัดกันของพื้นที่หน่วยความจำสำหรับเขียนและอ่าน หลังจากคำนวณออฟเซ็ตแล้ว โปรเซสเซอร์จะทิ้งผลการอ่านที่ได้มาจากการคาดเดาแล้วและดำเนินการนี้ซ้ำ คุณลักษณะนี้ช่วยให้คำแนะนำในการอ่านสามารถเข้าถึงค่าเก่าในบางแอดเดรสในขณะที่การดำเนินการจัดเก็บยังไม่เสร็จสิ้น หลังจากละทิ้งการดำเนินการเก็งกำไรที่ไม่สำเร็จ ร่องรอยของการดำเนินการยังคงอยู่ในแคช หลังจากนั้นหนึ่งในวิธีการกำหนดเนื้อหาของแคชตามการวิเคราะห์การเปลี่ยนแปลงในเวลาเข้าถึงข้อมูลที่แคชและไม่ได้แคชสามารถใช้เพื่อดึงข้อมูล มัน.

ช่องโหว่แรก (CVE-2021-35477) เกิดจากข้อบกพร่องในกลไกการตรวจสอบโปรแกรม BPF เพื่อป้องกันการโจมตี Spectre 4 ตัวตรวจสอบจะเพิ่มคำสั่งเพิ่มเติมหลังจากดำเนินการจัดเก็บที่อาจเป็นปัญหาไปยังหน่วยความจำ โดยจัดเก็บค่าเป็นศูนย์เพื่อลบล้างร่องรอยของการดำเนินการก่อนหน้านี้ การดำเนินการเขียนเป็นศูนย์นั้นควรจะรวดเร็วมากและบล็อกการดำเนินการเชิงเก็งกำไร เนื่องจากขึ้นอยู่กับตัวชี้ไปยังเฟรมสแต็ก BPF เท่านั้น แต่ในความเป็นจริง มันกลับกลายเป็นว่าเป็นไปได้ที่จะสร้างเงื่อนไขภายใต้คำสั่งที่นำไปสู่การดำเนินการเชิงเก็งกำไรที่มีเวลาที่จะดำเนินการก่อนการดำเนินการเก็บยึด

ช่องโหว่ที่สอง (CVE-2021-3455) เกี่ยวข้องกับความจริงที่ว่าเมื่อตรวจพบการดำเนินการบันทึกหน่วยความจำที่อาจเป็นอันตรายโดยตัวตรวจสอบ BPF พื้นที่ที่ไม่ได้กำหนดค่าเริ่มต้นของสแต็ก BPF จะไม่ถูกพิจารณา การดำเนินการเขียนครั้งแรกที่ไม่ได้รับการป้องกัน . คุณสมบัตินี้นำไปสู่ความเป็นไปได้ในการดำเนินการอ่านเชิงคาดเดา โดยขึ้นอยู่กับพื้นที่หน่วยความจำที่ไม่ได้เตรียมใช้งาน ก่อนที่จะดำเนินการตามคำแนะนำในการจัดเก็บ หน่วยความจำใหม่สำหรับสแต็ก BPF จะถูกจัดสรรโดยไม่ตรวจสอบเนื้อหาที่อยู่ในหน่วยความจำที่จัดสรรแล้ว และมีวิธีจัดการเนื้อหาของพื้นที่หน่วยความจำที่จะถูกจัดสรรให้กับสแต็ก BPF ก่อนที่โปรแกรม BPF จะเริ่มทำงาน

ที่มา: opennet.ru

เพิ่มความคิดเห็น