2 คะแนน โดย GN⁺ 2024-01-15 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

When Random Isn't

  • เป็นเรื่องเล่าจากเมื่อราว 10 ปีก่อน โปรดเข้าใจว่าอาจมีบางส่วนที่จำได้ไม่แม่นยำเพราะโค้ดต้นฉบับหายไปแล้ว
  • มีการลดทอนรายละเอียดบางอย่างลง เพื่อให้ใครก็ตามที่ชอบความปลอดภัยคอมพิวเตอร์สามารถอ่านได้อย่างเพลิดเพลิน
  • ตอนอายุ 14 ฉันค้นพบ World of Warcraft และติดงอมแงม
  • ฉันค้นพบแอดออนที่ใช้ปรับแต่งส่วนติดต่อผู้ใช้ของเกมได้ และเริ่มทำเอง
  • แอดออนที่เขียนด้วยภาษา Lua ประกอบด้วยไฟล์ซอร์ส .lua ไม่กี่ไฟล์
  • ฉันหลงใหลกับการที่เกมสามารถโหลดและรันซอร์สโค้ดที่เราเขียนเองได้โดยตรง

ความปลอดภัยของแอดออน

  • การเปิดให้ผู้ใช้มีแอดออนที่ตั้งโปรแกรมได้อาจดูเป็นความคิดที่ไม่ดี เพราะอาจนำไปสู่บอทได้
  • ระบบที่ Blizzard สร้างขึ้นนั้นค่อนข้างชาญฉลาดในการป้องกันพฤติกรรมการเขียนโปรแกรมตามอำเภอใจ
  • องค์ประกอบ UI ส่วนใหญ่เป็นเพียงของตกแต่งหรือให้ข้อมูล จึงแทบไม่มีข้อจำกัด
  • API สำหรับเก็บข้อมูล เช่น การเรียกดูพลังชีวิตของตัวละคร ก็ไม่มีข้อจำกัด
  • แต่ API บางตัวถูกป้องกันไว้ให้เรียกใช้ได้จากโค้ดทางการของ Blizzard เท่านั้น
  • API ส่วนใหญ่ที่เกี่ยวข้องกับการกระทำจริงภายในเกมถูกป้องกันไว้
  • API สำหรับดูตำแหน่งในโลกและทิศทางกล้องก็ถูกป้องกันในช่วงหนึ่งเช่นกัน
  • หากต้องการสร้างปุ่มสำหรับร่ายเวทเฉพาะอย่าง คุณสามารถสร้างปุ่มพิเศษที่เมื่อคลิกแล้วจะรันโค้ดในสภาพแวดล้อมที่ปลอดภัย
  • ปุ่มเหล่านี้ไม่สามารถสร้าง ทำลาย หรือย้ายได้ระหว่างการต่อสู้ เพื่อป้องกันการทำงานอัตโนมัติระหว่างต่อสู้
  • สภาพแวดล้อมที่ปลอดภัยสามารถตั้งค่าได้แบบเป็นโปรแกรมว่าจะร่ายเวทอะไร แต่ไม่อนุญาตให้เก็บข้อมูลที่จำเป็นต่อระบบอัตโนมัติแบบอิสระ

ช่องทางลับแบบ backdoor

  • หลายปีต่อมา เมื่อเริ่มสนใจการเขียนโปรแกรมที่ "จริงจัง" มากขึ้น ฉันก็แทบไม่ได้เล่น World of Warcraft แล้ว
  • แต่ฉันยังคิดอยากทำให้สภาพแวดล้อมที่ปลอดภัยนี้ใช้การไม่ได้อยู่เสมอ
  • แทนที่จะใช้ซอฟต์แวร์ของบุคคลที่สาม ฉันอยากแก้โจทย์นี้ด้วยเครื่องมือที่อนุญาตทางเทคนิค เพื่อความท้าทาย
  • ฉันพบว่า random อยู่ในรายชื่อฟังก์ชันที่อนุญาตในสภาพแวดล้อมที่ปลอดภัย และจึงคิดวิธีใช้มันลักลอบส่งข้อมูลเข้าไป

ปัญหาของตัวสร้างเลขสุ่ม

  • พบว่า random เป็นเพียงตัวห่ออย่างง่ายของฟังก์ชัน rand ในภาษา C
  • การติดตั้งใช้งานของ rand เป็น linear congruential generator ที่เรียบง่ายและอ่อนแอ
  • ฉันพัฒนาวิธีส่งข้อมูลโดยอาศัยการวิศวกรรมย้อนกลับสถานะภายในของ RNG

นำทุกอย่างมาประกอบกัน

  • เมื่อสามารถวิศวกรรมย้อนกลับสถานะภายในของ RNG ได้แล้ว ฉันก็สามารถตัดสินใจทำงานอัตโนมัติแบบใดก็ได้ภายในสภาพแวดล้อมที่ปลอดภัย
  • เข้าถึงข้อมูลในสภาพแวดล้อมที่ไม่ปลอดภัยเพื่อตัดสินใจ แล้วให้สภาพแวดล้อมที่ปลอดภัยดำเนินการที่ถูก "สุ่ม" เลือกไว้

บทสรุป

  • ฉันไม่รู้ว่า Blizzard แก้ปัญหาสถานะ RNG ที่อ่อนแอและใช้ร่วมกันนี้เมื่อไร หรือรู้ตัวหรือไม่ว่ามีปัญหา
  • หลายปีต่อมาเมื่อกลับไปลองโค้ดอีกครั้ง มันก็ใช้งานไม่ได้แล้ว
  • แม้มันจะเป็นการอาศัยช่องโหว่ในวิดีโอเกมที่จริง ๆ แล้วฉันไม่ได้อยากนำไปใช้จริง แต่การควบคุมสิ่งที่ดูเหมือนสุ่มได้นั้นมีเสน่ห์ราวกับเวทมนตร์

ความเห็นของ GN⁺

  • บทความนี้นำเสนอตัวอย่างที่น่าสนใจเกี่ยวกับความปลอดภัยคอมพิวเตอร์และการเขียนโปรแกรม
  • กระบวนการสำรวจวิธีที่สร้างสรรค์ในการหลบเลี่ยงความปลอดภัยภายในเกม ช่วยตอกย้ำความสำคัญของทักษะการเขียนโปรแกรมและการตระหนักถึงช่องโหว่ที่อาจเกิดขึ้น
  • เรื่องราวการใช้จุดอ่อนของ RNG เป็นกรณีศึกษาที่ให้บทเรียน เตือนนักพัฒนาซอฟต์แวร์ถึงความสำคัญของความปลอดภัยและอัลกอริทึม

1 ความคิดเห็น

 
GN⁺ 2024-01-15
ความเห็นจาก Hacker News
  • ผู้ใช้คนหนึ่งกล่าวว่าเมื่อหลายเดือนก่อนเขาเคยตอบคำถามบน StackOverflow เกี่ยวกับการ "ย้อนกลับ RNG (ตัวสร้างเลขสุ่ม)" ผู้ใช้นี้โจมตี Java RNG ซึ่งใช้ดีไซน์ LCG (linear congruential generator) ที่คล้ายกับ MSVC RNG โดยส่งเอาต์พุตเป็นสถานะภายในที่ถูกตัดทอน จึงทำให้วิธีโจมตีคล้ายกันมาก

    • แชร์ประสบการณ์การตอบคำถามคล้ายกันเกี่ยวกับ "การย้อนกลับ RNG" บน StackOverflow โดย Java RNG และ MSVC RNG ต่างก็ใช้ดีไซน์ LCG จึงถูกโจมตีในลักษณะคล้ายกันได้
  • ผู้ใช้อีกคนคาดว่า ถ้าเซิร์ฟเวอร์ใช้ RNG ตัวเดียวกัน ก็อาจใช้ประโยชน์จากสิ่งนี้ได้ในทางทฤษฎี หากเป็นเซิร์ฟเวอร์ที่มีการใช้งานต่ำ มี ping ต่ำ สามารถได้กรอบเวลาที่แม่นยำของสถานะปัจจุบันของ RNG และสามารถสร้างเหตุการณ์อื่นที่มีความผันผวนทางเศรษฐกิจสูงได้อย่างรวดเร็ว

    • คาดการณ์ถึงความเป็นไปได้ในการใช้ประโยชน์จากเรื่องนี้ภายใต้เงื่อนไขบางอย่าง หากเซิร์ฟเวอร์ใช้ RNG เดียวกัน
  • ผู้ใช้อีกคนชี้ว่า RNG แบบ linear congruential ที่ให้มานั้นสร้างตัวเลขที่แตกต่างกันได้เพียง 12445 ค่าเท่านั้นก่อนจะวนซ้ำ และกล่าวว่าการใช้งานอัลกอริทึมนี้ด้วยพารามิเตอร์ที่ดีกว่าน่าจะสมเหตุสมผลกว่า

    • ชี้ปัญหาว่า RNG แบบ linear congruential สร้างตัวเลขได้จำกัดและวนซ้ำ พร้อมเน้นความจำเป็นในการปรับปรุงอัลกอริทึม
  • ผู้ใช้คนหนึ่งบอกว่า World of Warcraft (WoW) เป็นจุดเริ่มต้นที่ทำให้เขาสนใจการเขียนโปรแกรม โดยตอนเกมออกเขาอายุ 6 ขวบ และเมื่อมี private server เกิดขึ้น เขาก็เริ่มสนใจวิธีสร้าง NPC ของตัวเอง จากนั้นจึงได้เรียนรู้ Lua วิธีคอมไพล์ private server core, SVN และวิธี apply patch

    • แชร์ประสบการณ์ที่ WoW จุดประกายความสนใจด้านการเขียนโปรแกรม ผ่าน private server และการเรียนรู้ Lua จนได้ทักษะโปรแกรมมิ่ง
  • ผู้ใช้ที่แชร์คำกล่าวของ John von Neumann กล่าวว่า วิธีการสร้างเลขสุ่มทั้งหมดเป็นบาป และโต้แย้งว่ากระบวนการคำนวณเชิงเลขที่เคร่งครัดไม่ใช่วิธีสร้างเลขสุ่ม

    • อ้างคำกล่าวของ John von Neumann เกี่ยวกับการสร้างเลขสุ่ม โดยเน้นว่ากระบวนการคำนวณเชิงเลขที่เคร่งครัดไม่ใช่วิธีสร้างเลขสุ่ม
  • ผู้ใช้คนหนึ่งกล่าวว่าเขาเคยเขียนสคริปต์สำหรับระบบประมูลของ WoW ซึ่งสามารถสแกนการประมูลทั้งหมด ซื้อไอเท็มที่ตั้งราคาต่ำกว่ามูลค่า และนำกลับไปลงประมูลใหม่ได้ หากมีใครลดราคา สคริปต์ก็จะยกเลิกแล้วลงประมูลใหม่ในราคาที่ต่ำกว่านิดหน่อย

    • แชร์ประสบการณ์การใช้สคริปต์ในระบบประมูลของ WoW เพื่อสร้างทองได้ไม่จำกัด
  • มีผู้ใช้คนหนึ่งกล่าวถึงกรณีที่ Hacker News เคยถูกแฮ็กเพราะเลขสุ่มที่อ่อนแอ พร้อมให้ลิงก์ที่เกี่ยวข้อง

    • กล่าวถึงกรณีที่ Hacker News เคยถูกแฮ็กเพราะเลขสุ่มที่อ่อนแอ พร้อมชี้ให้เห็นปัญหาด้านความปลอดภัย
  • มีผู้ใช้คนหนึ่งใช้สำนวนว่า "เมื่อตัวแปรไม่เปลี่ยน และค่าคงที่ไม่คงที่"

    • ใช้สำนวนเชิงเสียดสีเกี่ยวกับบทบาทของตัวแปรและค่าคงที่ในการเขียนโปรแกรม
  • มีผู้ใช้คนหนึ่งบอกว่าแม้เขาจะไม่ได้เล่น WoW แต่เคยได้ยินมาว่าแอดออนจำนวนมากใช้ private chat เป็นช่องทางสื่อสาร และถ้ามีวิธีทำได้ ผู้คนก็จะหามันเจอและใช้งานมันในที่สุด

    • แสดงความคิดเห็นว่าแอดออนของ WoW ใช้ private chat เป็นช่องทางสื่อสาร และผู้คนย่อมหาวิธีค้นหาและใช้งานมันได้
  • มีผู้ใช้คนหนึ่งกล่าวถึงแรงจูงใจทางเศรษฐกิจที่เกี่ยวข้องกับ RNG ว่า หากไม่มีอะไรที่มีเดิมพันจริงจัง (เช่น เกม) RNG ที่ไม่สมบูรณ์ก็เพียงพอแล้ว แต่ถ้ามีเงินหรือความปลอดภัยเข้ามาเกี่ยวข้อง (เช่น กระเป๋าเงินคริปโตหรือคาสิโนออนไลน์) ความสมบูรณ์ของ RNG จะกลายเป็นเรื่องสำคัญอย่างมาก

    • ชี้ว่าในสถานการณ์ที่ไม่สำคัญมาก เช่น เกม RNG ที่ไม่สมบูรณ์ก็อาจเพียงพอ แต่ในกรณีที่เกี่ยวข้องกับมูลค่าทางการเงินหรือความปลอดภัย ความถูกต้องของ RNG มีความสำคัญอย่างยิ่ง