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