การแก้ไขผื่นส่งผลให้การแก้ไขช่องโหว่ Spectre ในเคอร์เนล Linux ไม่สมบูรณ์

ผู้พัฒนาโครงการ Grsecurity แบ่งปัน เรื่องราวเตือนที่แสดงให้เห็นว่าการกำจัดคำเตือนของคอมไพเลอร์อย่างไม่รอบคอบสามารถนำไปสู่ช่องโหว่ในโค้ดได้อย่างไร เมื่อปลายเดือนพฤษภาคม มีการเสนอการแก้ไขสำหรับเคอร์เนล Linux สำหรับเวกเตอร์ใหม่ของการใช้ประโยชน์จากช่องโหว่ Spectre ผ่านการเรียกระบบ ptrace

ในขณะที่ทดสอบแพตช์ นักพัฒนาสังเกตเห็นว่าเมื่อสร้าง คอมไพลเลอร์จะแสดงคำเตือนเกี่ยวกับการผสมโค้ดและคำจำกัดความ (โครงสร้างถูกกำหนดไว้หลังโค้ด โดยกำหนดค่าให้กับตัวแปรที่มีอยู่):

ดัชนี int = n;
ถ้า (n <HBP_NUM) { ดัชนี = array_index_nospec (ดัชนี, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[index];

ไลนัสยอมรับ การแก้ไข ไปยังสาขาหลักของคุณ มีการกำจัด จากคำเตือนโดยการย้ายคำจำกัดความของตัวแปรไปที่บล็อก if:

ถ้า (n < HBP_NUM) { ดัชนี int = array_index_nospec (n, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[index];

ในเดือนกรกฎาคม การแก้ไขยังถูกย้ายไปยังสาขาเคอร์เนลที่เสถียร 4.4, 4.9, 4.14, 4.19 และ 5.2 ผู้ดูแลสาขาที่มั่นคงก็ประสบกับคำเตือนเช่นกัน และแทนที่จะตรวจสอบเพื่อดูว่าได้รับการแก้ไขในสาขาหลักของ Linus แล้ว พวกเขากลับทำการแก้ไขด้วยตนเอง ปัญหาก็คือว่าโดยไม่ได้คิดถึงเรื่องนี้จริงๆ พวกเขาก็แค่ ย้าย การกำหนดโครงสร้างขึ้น ดังนั้นการเรียก array_index_nospec ซึ่งให้การป้องกันช่องโหว่โดยตรงจะไม่ถูกใช้อีกต่อไปเมื่อกำหนดโครงสร้าง และแทนที่จะใช้ตัวแปร "index" ตัวแปร "n" จะถูกใช้เสมอ:

ดัชนี int = n;
ถ้า (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
ดัชนี = array_index_nospec (ดัชนี, HBP_NUM);

ที่มา: opennet.ru

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