เมลท์ดาวน์/สเปคเตอร์

ภาพรวม

เมื่อวันที่ 3 มกราคม Project Zero ได้เปิดเผยช่องโหว่ใน CPU สมัยใหม่ที่กระบวนการใช้ในการอ่านหน่วยความจำที่กำหนดเองได้ (โดยที่แย่ที่สุด) ซึ่งรวมถึงหน่วยความจำที่ไม่ได้เป็นของโปรเซสนั้นด้วย เราตั้งชื่อช่องโหว่เหล่านี้ว่า Spectre และ Meltdown Chrome ทำอะไรบ้างเพื่อช่วยรักษาเว็บ ให้ปลอดภัย และนักพัฒนาเว็บควรทำอย่างไรกับเว็บไซต์ของตน

สรุปคร่าวๆ

ในฐานะผู้ใช้ท่องเว็บ คุณควรอัปเดตระบบปฏิบัติการและเบราว์เซอร์อยู่เสมอ นอกจากนี้ ผู้ใช้ Chrome อาจพิจารณาเปิดใช้การแยกเว็บไซต์

หากคุณเป็นนักพัฒนาเว็บ ทีม Chrome จะแนะนำสิ่งต่อไปนี้

  • หากเป็นไปได้ ให้ป้องกันไม่ให้คุกกี้เข้าสู่หน่วยความจำของกระบวนการแสดงผลโดยใช้แอตทริบิวต์คุกกี้ SameSite และ HTTPOnly และหลีกเลี่ยงการอ่านจาก document.cookie
  • ตรวจสอบว่าประเภท MIME ถูกต้องและระบุส่วนหัว X-Content-Type-Options: nosniff สำหรับ URL ที่มีเนื้อหาที่เจาะจงหรือผู้ใช้ที่ละเอียดอ่อน เพื่อรับประโยชน์สูงสุดจากการบล็อกการอ่านข้ามต้นทางสำหรับผู้ใช้ที่เปิดใช้การแยกเว็บไซต์
  • เปิดใช้การแยกเว็บไซต์และแจ้งให้ทีม Chrome ทราบหากทำให้เกิดปัญหากับเว็บไซต์

หากคุณสงสัยว่าทำไมขั้นตอนเหล่านี้จึงเป็นประโยชน์ โปรดอ่านต่อ

ความเสี่ยง

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

ทั้ง Meltdown และ Spectre อาจอนุญาตให้กระบวนการอ่านหน่วยความจำที่ไม่ควรทำได้ บางครั้งเอกสารหลายฉบับจากเว็บไซต์ที่ต่างกัน อาจต้องมีการแชร์กระบวนการเดียวกันใน Chrome ปัญหานี้อาจเกิดขึ้นเมื่อผู้ใช้เปิดอีกคนหนึ่งโดยใช้ window.open, <a href="..." target="_blank"> หรือ iframe หากเว็บไซต์มีข้อมูลที่เจาะจงผู้ใช้ ก็มีโอกาสที่เว็บไซต์อื่นจะใช้ช่องโหว่ใหม่เหล่านี้เพื่ออ่านข้อมูลผู้ใช้นั้นได้

การบรรเทาปัญหา

ทีมวิศวกรของ Chrome และทีมวิศวกร V8 กำลังดำเนินการเพื่อลดภัยคุกคามนี้

การแยกเว็บไซต์

ผลกระทบจากการแสวงหาประโยชน์จาก Spectre จะลดลงอย่างมากจากการป้องกันไม่ให้ข้อมูลที่ละเอียดอ่อนแชร์กระบวนการโดยใช้โค้ดที่ผู้โจมตีควบคุม ทีม Chrome พยายามพัฒนาฟีเจอร์ที่เรียกว่า "การแยกเว็บไซต์" ดังนี้

ยังไม่ได้เปิดใช้การแยกเว็บไซต์โดยค่าเริ่มต้น เนื่องจากมีปัญหาที่ทราบ 2 ประการและทีม Chrome ต้องการทำการทดสอบในขอบเขตนี้ให้มากที่สุด หากคุณเป็นนักพัฒนาเว็บ คุณควรเปิดใช้การแยกเว็บไซต์และตรวจสอบว่าเว็บไซต์ยังคงใช้งานได้หรือไม่ หากต้องการเลือกใช้ตอนนี้ ให้เปิดใช้ chrome://flags#enable-site-per-process หากพบเว็บไซต์ที่ใช้งานไม่ได้ โปรดช่วยเราโดยรายงานข้อบกพร่องและระบุว่าคุณได้เปิดใช้การแยกเว็บไซต์

การบล็อกเอกสารข้ามเว็บไซต์

แม้ว่าหน้าแบบข้ามเว็บไซต์ทั้งหมดจะถูกจัดในกระบวนการแยกกัน แต่หน้าเว็บก็ยังคงสามารถขอทรัพยากรย่อยแบบข้ามเว็บไซต์บางรายการได้ เช่น รูปภาพและ JavaScript การแยกเว็บไซต์มีฟีเจอร์ "การบล็อกเอกสารข้ามเว็บไซต์" ที่จำกัดการตอบสนองของเครือข่ายที่จะส่งไปยังกระบวนการของโหมดแสดงภาพ เพื่อช่วยป้องกันไม่ให้ข้อมูลที่ละเอียดอ่อนรั่วไหลจากข้อมูลนี้

เว็บไซต์จะขอข้อมูล 2 ประเภทจากเซิร์ฟเวอร์ได้ ได้แก่ "เอกสาร" และ "ทรัพยากร" เอกสารในที่นี้คือไฟล์ HTML, XML, JSON และข้อความ เว็บไซต์สามารถรับเอกสารจากโดเมนของตนเองหรือจากโดเมนอื่นๆ ที่มีส่วนหัว CORS ที่อนุญาตได้ ทรัพยากรรวมถึงรูปภาพ, JavaScript, CSS และแบบอักษร โดยสามารถรวมทรัพยากรได้จากทุกเว็บไซต์

นโยบายการบล็อกเอกสารข้ามเว็บไซต์จะป้องกันไม่ให้กระบวนการรับ "เอกสาร" จากต้นทางอื่นๆ ในกรณีต่อไปนี้

  1. ซึ่งมีประเภท MIME เป็น HTML, XML, JSON หรือข้อความ/ธรรมดา และ
  2. โดเมนดังกล่าวมีส่วนหัวการตอบกลับ HTTP แบบ X-Content-Type-Options: nosniff หรือการวิเคราะห์เนื้อหาด่วน ("Sniffing") จะยืนยันว่าเป็นประเภทที่ถูกต้อง
  3. CORS ไม่ได้อนุญาตการเข้าถึงเอกสารอย่างชัดเจน

เอกสารที่นโยบายนี้บล็อกไว้จะแสดงว่ากระบวนการว่างเปล่า แม้ว่าคำขอจะยังคงเกิดขึ้นในเบื้องหลัง

ตัวอย่างเช่น สมมติว่าผู้โจมตีสร้างแท็ก <img> ที่มีไฟล์ JSON ซึ่งมีข้อมูลที่ละเอียดอ่อน เช่น <img src="https://yourbank.com/balance.json"> หากไม่มีการแยกเว็บไซต์ เนื้อหาของไฟล์ JSON จะส่งไฟล์ดังกล่าวไปยังหน่วยความจำของกระบวนการแสดงผล ซึ่งตัวแสดงผลจะพบว่าไม่ใช่รูปแบบรูปภาพที่ถูกต้องและจะไม่แสดงผลรูปภาพ แต่ตอนนี้สเปคเตอร์ทำให้ เราอ่านความทรงจำมากๆ ได้ การบล็อกเอกสารข้ามเว็บไซต์จะป้องกันเนื้อหาของไฟล์นี้ไม่ให้เข้าสู่หน่วยความจำของการประมวลผลที่ตัวแสดงผลกำลังทำงาน เนื่องจากประเภท MIME ถูกบล็อกโดยการบล็อกเอกสารข้ามเว็บไซต์

ตามเมตริกผู้ใช้ มีไฟล์ JavaScript และ CSS จำนวนมากที่ส่งด้วยประเภท MIME text/html หรือ text/plain Chrome จะพยายามดักจับการตอบสนองเพื่อให้แน่ใจว่าประเภท MIME ถูกต้องเพื่อหลีกเลี่ยงการบล็อกทรัพยากรที่มีการทำเครื่องหมายเป็นเอกสารโดยไม่ได้ตั้งใจ การดักฟังนี้ไม่สมบูรณ์แบบ ดังนั้นหากคุณแน่ใจว่าตั้งค่าส่วนหัว Content-Type ในเว็บไซต์ถูกต้องแล้ว ทีม Chrome ขอแนะนำให้เพิ่มส่วนหัว X-Content-Type-Options: nosniff ลงในคำตอบทั้งหมด

หากต้องการลองใช้การบล็อกเอกสารข้ามเว็บไซต์ ให้เลือกใช้การแยกเว็บไซต์ตามที่อธิบายไว้ข้างต้น

คุกกี้ SameSite รายการ

กลับไปดูตัวอย่างด้านบนกัน: <img src="https://yourbank.com/balance.json"> วิธีนี้จะใช้ได้ผลเฉพาะในกรณีที่ yourbank.com ได้เก็บคุกกี้ที่บันทึกผู้ใช้ไว้โดยอัตโนมัติ โดยทั่วไประบบจะส่งคุกกี้สำหรับคำขอทั้งหมดที่ส่งไปยังเว็บไซต์ที่ตั้งค่าคุกกี้ แม้ว่าคำขอนั้นจะสร้างโดยบุคคลที่สามโดยใช้แท็ก <img> ก็ตาม คุกกี้ SameSite เป็นแอตทริบิวต์ใหม่ที่ระบุว่าคุกกี้ควรแนบกับคำขอที่มาจากเว็บไซต์เดียวกันเท่านั้น ดังนั้นจึงเป็นชื่อ น่าเศร้าที่ตอนที่เขียนเฉพาะ Chrome และ Firefox เวอร์ชัน 58+ เท่านั้นที่รองรับแอตทริบิวต์นี้

HTTPOnlyและdocument.cookie

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

เมื่อคุณลิงก์ไปยังหน้าอื่นโดยใช้ target="_blank" หน้าที่เปิดอยู่มีสิทธิ์เข้าถึงออบเจ็กต์ window สามารถไปยังหน้าเว็บไปยัง URL อื่น หากไม่มีการแยกเว็บไซต์จะเป็นกระบวนการเดียวกับหน้าเว็บของคุณ ลิงก์ไปยังหน้าเว็บภายนอกที่เปิดในหน้าต่างใหม่ควรระบุ rel="noopener" เสมอเพื่อปกป้องหน้าเว็บของคุณได้ดียิ่งขึ้น

ตัวจับเวลาความละเอียดสูง

ในการใช้ประโยชน์จาก Meltdown หรือ Spectre ผู้โจมตีต้องวัดระยะเวลาที่ใช้ในการอ่านค่าหนึ่งๆ จากหน่วยความจำ ด้วยเหตุนี้คุณจึงต้องใช้ตัวจับเวลา ที่เชื่อถือได้และแม่นยำ

API รายการหนึ่งที่แพลตฟอร์มเว็บมีให้คือ performance.now() ซึ่งมีความแม่นยำถึง 5 ไมโครวินาที ดังนั้น เบราว์เซอร์หลักทั้งหมดจึงได้ลดความละเอียดของ performance.now() ลง จึงทำให้การโจมตีของการโจมตีเป็นไปได้ยากขึ้น

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

V8

หากต้องการใช้ Spectre คุณต้องใช้ชุดคำสั่งสำหรับ CPU ที่สร้างขึ้นมาโดยเฉพาะ ทีม V8 ใช้การบรรเทาสำหรับหลักฐานการโจมตีที่ทราบจากแนวคิด และกำลังดำเนินการเปลี่ยนแปลงใน TurboFan ซึ่งเป็นคอมไพเลอร์ที่เพิ่มประสิทธิภาพ เพื่อทำให้โค้ดที่สร้างขึ้นมีความปลอดภัยแม้ในเวลาที่การโจมตีเหล่านี้เกิดขึ้น อย่างไรก็ตาม การเปลี่ยนแปลงการสร้างโค้ดเหล่านี้อาจมีบทลงโทษด้านประสิทธิภาพ

การรักษาเว็บให้ปลอดภัย

การค้นพบ Spectre และ Meltdown รวมถึงผลกระทบต่างๆ ที่ไม่ชัดเจน เราหวังว่าบทความนี้จะแสดงให้เห็นถึงสิ่งที่ทีม Chrome และ V8 กำลังทำเพื่อรักษาความปลอดภัยของแพลตฟอร์มเว็บและวิธีที่นักพัฒนาเว็บจะช่วยเหลือด้วยการใช้ฟีเจอร์ความปลอดภัยที่มีอยู่ได้ หากมีข้อสงสัย โปรดติดต่อเรา ทาง Twitter