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 ความคิดเห็น
ความเห็นจาก Hacker News
ผู้ใช้คนหนึ่งกล่าวว่าเมื่อหลายเดือนก่อนเขาเคยตอบคำถามบน StackOverflow เกี่ยวกับการ "ย้อนกลับ RNG (ตัวสร้างเลขสุ่ม)" ผู้ใช้นี้โจมตี Java RNG ซึ่งใช้ดีไซน์ LCG (linear congruential generator) ที่คล้ายกับ MSVC RNG โดยส่งเอาต์พุตเป็นสถานะภายในที่ถูกตัดทอน จึงทำให้วิธีโจมตีคล้ายกันมาก
ผู้ใช้อีกคนคาดว่า ถ้าเซิร์ฟเวอร์ใช้ RNG ตัวเดียวกัน ก็อาจใช้ประโยชน์จากสิ่งนี้ได้ในทางทฤษฎี หากเป็นเซิร์ฟเวอร์ที่มีการใช้งานต่ำ มี ping ต่ำ สามารถได้กรอบเวลาที่แม่นยำของสถานะปัจจุบันของ RNG และสามารถสร้างเหตุการณ์อื่นที่มีความผันผวนทางเศรษฐกิจสูงได้อย่างรวดเร็ว
ผู้ใช้อีกคนชี้ว่า RNG แบบ linear congruential ที่ให้มานั้นสร้างตัวเลขที่แตกต่างกันได้เพียง 12445 ค่าเท่านั้นก่อนจะวนซ้ำ และกล่าวว่าการใช้งานอัลกอริทึมนี้ด้วยพารามิเตอร์ที่ดีกว่าน่าจะสมเหตุสมผลกว่า
ผู้ใช้คนหนึ่งบอกว่า World of Warcraft (WoW) เป็นจุดเริ่มต้นที่ทำให้เขาสนใจการเขียนโปรแกรม โดยตอนเกมออกเขาอายุ 6 ขวบ และเมื่อมี private server เกิดขึ้น เขาก็เริ่มสนใจวิธีสร้าง NPC ของตัวเอง จากนั้นจึงได้เรียนรู้ Lua วิธีคอมไพล์ private server core, SVN และวิธี apply patch
ผู้ใช้ที่แชร์คำกล่าวของ John von Neumann กล่าวว่า วิธีการสร้างเลขสุ่มทั้งหมดเป็นบาป และโต้แย้งว่ากระบวนการคำนวณเชิงเลขที่เคร่งครัดไม่ใช่วิธีสร้างเลขสุ่ม
ผู้ใช้คนหนึ่งกล่าวว่าเขาเคยเขียนสคริปต์สำหรับระบบประมูลของ WoW ซึ่งสามารถสแกนการประมูลทั้งหมด ซื้อไอเท็มที่ตั้งราคาต่ำกว่ามูลค่า และนำกลับไปลงประมูลใหม่ได้ หากมีใครลดราคา สคริปต์ก็จะยกเลิกแล้วลงประมูลใหม่ในราคาที่ต่ำกว่านิดหน่อย
มีผู้ใช้คนหนึ่งกล่าวถึงกรณีที่ Hacker News เคยถูกแฮ็กเพราะเลขสุ่มที่อ่อนแอ พร้อมให้ลิงก์ที่เกี่ยวข้อง
มีผู้ใช้คนหนึ่งใช้สำนวนว่า "เมื่อตัวแปรไม่เปลี่ยน และค่าคงที่ไม่คงที่"
มีผู้ใช้คนหนึ่งบอกว่าแม้เขาจะไม่ได้เล่น WoW แต่เคยได้ยินมาว่าแอดออนจำนวนมากใช้ private chat เป็นช่องทางสื่อสาร และถ้ามีวิธีทำได้ ผู้คนก็จะหามันเจอและใช้งานมันในที่สุด
มีผู้ใช้คนหนึ่งกล่าวถึงแรงจูงใจทางเศรษฐกิจที่เกี่ยวข้องกับ RNG ว่า หากไม่มีอะไรที่มีเดิมพันจริงจัง (เช่น เกม) RNG ที่ไม่สมบูรณ์ก็เพียงพอแล้ว แต่ถ้ามีเงินหรือความปลอดภัยเข้ามาเกี่ยวข้อง (เช่น กระเป๋าเงินคริปโตหรือคาสิโนออนไลน์) ความสมบูรณ์ของ RNG จะกลายเป็นเรื่องสำคัญอย่างมาก