นักพัฒนาแอปพลิเคชันชาวปากีสถานชื่อ Ammar Askar ได้โพสต์ในบล็อกของตัวเองว่าเจอช่องโหว่ในเกม Minecraft ที่สามารถทำให้ผู้เล่นส่งข้อมูลบางอย่างไปที่เครื่องเซิร์ฟเวอร์เพื่อให้เครื่องเซิร์ฟเวอร์หยุดทำงานได้ เขาเจอช่องโหว่นี้และได้แจ้งไปยัง Mojang ตั้งแต่ 2 ปีก่อนแล้ว แต่จนถึงปัจจุบันก็ยังไม่มีการแก้ไข เลยตัดสินใจเปิดเผยข้อมูลออกมา
(หมายเหตุ: เนื้อหาข่าวมีแค่ย่อหน้าเดียวข้างบน ส่วนที่เหลือต่อไปนี้เป็นข้อมูลทางเทคนิคมากๆ ใครไม่สนใจสามารถข้ามได้)
สาเหตุของช่องโหว่เกิดจากโพรโทคอลของเกม Minecraft อนุญาตให้ผู้เล่นส่งข้อมูลไปยังเซิร์ฟเวอร์ได้ว่าใน Inventory มีไอเทมอะไรอยู่บ้าง โดยใช้รูปแบบการเก็บข้อมูลแบบ NBT (ลักษณะคล้ายๆ JSON) ซึ่งเป็นโครงสร้างข้อมูลที่สามารถมีข้อมูลอยู่ข้างในซ้อนๆ ต่อกันไปอีกได้ ตัวอย่างการเก็บข้อมูลไอเทม “หนังสือ” อย่างเช่นในรูปด้านล่าง ก็จะมีบอกข้อมูล เช่น author, title, pages เป็นต้น
ในที่นี้ ทางเซิร์ฟเวอร์เกมอนุญาตให้ผู้เล่นส่งข้อมูลในลักษณะซ้อนกันหลายๆ ชั้นได้ ซึ่งก็ทำให้เราสามารถสร้าง “ข้อมูลปลอม” ที่มีชุดข้อมูลจำนวนมากซ้อนกันอยู่ แล้วส่งไปให้ทางเซิร์ฟเวอร์ได้ ตัวอย่างเช่นข้อมูลในรูปด้านล่าง มี list ซ้อนกันอยู่ถึง 5 ระดับ
ข้อมูลชุดนี้ ในส่วน rekt ที่อยู่บนสุด จะมีข้อมูล list ที่ซ้อนกันอยู่ข้างใน 300 list แต่ละ list จะมี sublist อีกอย่างละ 10 รายการ แต่ละ sublist ก็จะมีรายการย่อยซ้อนต่อกันไปอีก 10 รายการ จนสุดที่ 5 ระดับที่ตัวข้อมูลรองรับไหว
ดังนั้นปริมาณ list ทั้งหมดที่อยู่ในข้อมูลชุดนี้คือ 10^5 * 300 = 30,000,000 list (สามสิบล้าน) ขนาดของข้อมูลทั้งหมดคือ 26.6 MB แต่เวลา Minecraft ส่งข้อมูลจะบีบอัดโดยใช้อัลกอริทึม zlib ทำให้ข้อมูลเหลือขนาดแค่ 39 kB
เมื่อเซิร์ฟเวอร์ได้รับข้อมูลแล้วเอาไปประมวลผล ก็จะขยายไฟล์กลับคืนมาแล้วเจอว่ามีข้อมูลขนาดใหญ่มากเกือบๆ 27 MB ซึ่งนอกจากจะล้น Buffer แล้ว ตัวเซิร์ฟเวอร์ยังจะพยายามสร้าง Object ขึ้นมากว่า 30 ล้านชิ้นภายในทันทีทันใด ทำให้หน่วยความจำและซีพียูไม่พอที่จะประมวลผลจนหยุดทำงานในที่สุด
ตอนนี้มีโค้ดสำหรับโจมตีช่องโหว่นี้แล้ว อยู่บน Github โหลดมาลองเล่นกันได้
– จบส่วนที่เป็นข้อมูลทางเทคนิค –
ตอนนี้ดูเหมือนว่าทาง Mojang จะยังไม่มีแถลงการณ์อะไรออกมา ยังไงตอนนี้ใครที่เปิดเซิร์ฟเวอร์ Minecraft ถ้าเจอว่าเครื่องค้างหรือเซิร์ฟเวอร์ล่มโดยไม่ทราบสาเหตุก็น่าจะมาจากตรงนี้แหละครับ วิธีแก้ก็คงต้องรอแพตช์กันอย่างเดียว
UPDATE!! Mojang ปล่อยแพตช์เวอร์ชัน 1.8.4 มาแก้ปัญหานี้แล้วครับ ใครที่เปิดเซิร์ฟเวอร์ Minecraft อยู่ตามไปอัปเดตกันได้
ที่มา – Ars Technica, Ammar Askar