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

ภาพรวม

เมื่อวันที่ 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 ใช้ความพยายามหลายอย่างเพื่อลดภัยคุกคามนี้

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

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

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

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

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

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

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

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

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

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