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

ภาพรวม

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

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

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

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

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

  1. ไฟล์มีประเภท MIME เป็น HTML, XML, JSON หรือข้อความ/ธรรมดา และ
  2. มีX-Content-Type-Options: nosniffส่วนหัวการตอบกลับ HTTP หรือการวิเคราะห์เนื้อหาอย่างรวดเร็ว ("การสแกน") ยืนยันว่าประเภทนั้นถูกต้อง
  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 ขอแนะนำให้เพิ่มส่วนหัว Content-Type ในการตอบกลับทั้งหมด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