ตัวอย่างการใช้ช่องโหว่ "Spectre" ที่เปิดเผยตั้งแต่วันที่ 2 มกราคม 2018 (CVE-2017-5753 และ CVE-2017-5715)
Spectre ทำลายการแยกระหว่างแอปพลิเคชันต่างๆ ช่วยให้ผู้โจมตีหลอกโปรแกรมที่ปราศจากข้อผิดพลาดซึ่งปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดเพื่อให้ความลับของพวกเขารั่วไหล ในความเป็นจริง การตรวจสอบความปลอดภัยของแนวทางปฏิบัติที่ดีที่สุดดังกล่าวจะเพิ่มพื้นที่การโจมตีและอาจทำให้แอปพลิเคชันเสี่ยงต่อ Spectre มากขึ้น
C ใช้ libs:
เรากำลังใส่ข้อความ "The Magic Words are Squeamish Ossifrage" ในหน่วยความจำ จากนั้นเราก็พยายามอ่านมันโดยใช้ช่องโหว่ หากระบบมีช่องโหว่ คุณจะเห็นข้อความเดียวกันในเอาต์พุต อ่านจากหน่วยความจำ
ในโค้ดนี้ หากคำสั่งที่คอมไพล์แล้วใน victim_function()
ถูกดำเนินการตามลำดับโปรแกรมที่เข้มงวด ฟังก์ชันจะอ่านจาก array1[0..15]
เท่านั้น เนื่องจากขนาดอาร์เรย์ 1 = 16 อย่างไรก็ตาม เมื่อดำเนินการแบบเก็งกำไร การอ่านนอกขอบเขตจะอ่าน เป็นไปได้ ฟังก์ชัน readMemoryByte()
ทำการเรียกการฝึกหลายครั้งไปยัง victim_function()
เพื่อให้ตัวทำนายสาขาคาดหวังค่าที่ถูกต้องสำหรับ x จากนั้นจึงเรียกด้วย x นอกขอบเขต สาขาที่มีเงื่อนไขคาดการณ์ผิด และการดำเนินการเก็งกำไรที่ตามมาจะอ่านไบต์ลับโดยใช้ค่า x นอกขอบเขต จากนั้นโค้ดเก็งกำไรจะอ่านจาก array2[array1[x] * 512]
ทำให้ค่าของ array1[x]
รั่วไหลเข้าสู่สถานะแคช เพื่อให้การโจมตีเสร็จสมบูรณ์ จะใช้ฟลัช+โพรบแบบธรรมดาเพื่อระบุว่าแคชไลน์ใดใน array2
ที่ถูกโหลด โดยเผยให้เห็นเนื้อหาในหน่วยความจำ การโจมตีเกิดขึ้นซ้ำหลายครั้ง ดังนั้นแม้ว่าไบต์เป้าหมายจะไม่ได้ถูกแคชในตอนแรก แต่การวนซ้ำครั้งแรกจะนำไบต์นั้นไปไว้ในแคช
รหัสที่ไม่ได้รับการปรับให้เหมาะสมจะอ่านประมาณ 10KB/วินาทีบน i7 Surface Pro 3
gcc -std=c99 Source.c -o spectre.out
หรือ make
สร้างโปรเจ็กต์ว่างใหม่และเพิ่ม Source.c จากนั้นคลิกที่ Build
.spectre.out
โดยไม่มีพารามิเตอร์
.spectre.out {address} {length}
พร้อมพารามิเตอร์: