การป้องกันการหลบหนีจากแซนด์บ็อกซ์
บล็อกการเข้าถึงไลบรารี debug การใช้ rawget/rawset ในทางที่ผิด และการรั่วไหลของ upvalue
การป้องกันการหลบหนีจากแซนด์บ็อกซ์ เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหาการหลบหนี
แม้จะใช้สภาพแวดล้อมที่มีรายการอนุญาต ผู้โจมตีที่มีความคิดสร้างสรรค์ก็อาจหาวิธีเข้าถึงสภาพแวดล้อมส่วนกลางจริงได้ บทเรียนนี้ครอบคลุมช่องทางหลบหนีที่ทราบและวิธีปิดช่องทางเหล่านั้น
การโจมตีเมทาเทเบิลของสตริง
ใน Lua สตริงมีเมทาเทเบิลร่วมกันที่เปิดเผยไลบรารีสตริง โค้ดในแซนด์บ็อกซ์สามารถใช้สตริงเพื่อรับการอ้างอิงไปยัง string.rep และจากจุดนั้นเข้าถึงไลบรารีอื่นได้
-- Escape vector (before patching):
local s = "hello"
local getenv = s.rep -- reaches string library
-- Fix: use setmetatable on all sandboxed strings (not practical)
-- Better fix: override debug.getmetatable in the sandboxการบล็อกผ่าน rawget/rawset
หากมี rawget อยู่ในแซนด์บ็อกซ์ โค้ดจะสามารถใช้เพื่อข้ามข้อจำกัดของ __index และอ่านจากตารางจริงได้โดยตรง
-- Fix: exclude rawget, rawset, rawequal, rawlen from the sandbox envการเข้าถึงไลบรารี debug
ไลบรารี debug สามารถอ่านและแก้ไขอัปแวลูใด ๆ ได้ รวมถึง _ENV จึงต้องนำไลบรารีนี้ออกจากแซนด์บ็อกซ์ทั้งหมด
ตาราง package.loaded
หากเข้าถึง require หรือ package ได้ โค้ดในแซนด์บ็อกซ์อาจเข้าถึงโมดูลที่โหลดไว้แล้ว รวมถึง os และ io
-- Fix: exclude require and package from the sandbox envโครูทีนและ resume
โครูทีนในแซนด์บ็อกซ์ที่โฮสต์เรียกทำงานต่ออาจถูกใช้เพื่อดึงสถานะออกไปได้ โปรดใช้ coroutine.wrap อย่างระมัดระวัง และอย่าเรียกโครูทีนในแซนด์บ็อกซ์ให้ทำงานต่อด้วยสิทธิ์ระดับสูง
การไล่ดูอัปแวลู
หากไม่มีไลบรารี debug โค้ดในแซนด์บ็อกซ์จะไม่สามารถไล่ดูอัปแวลูได้ แต่หากรวม debug.getupvalue ไว้โดยไม่ตั้งใจ ก็อาจใช้เข้าถึง _G ได้
__newindex ใน safeEnv
เพิ่ม __newindex ลงในเมทาเทเบิลของสภาพแวดล้อมแซนด์บ็อกซ์ เพื่อป้องกันไม่ให้โค้ดในแซนด์บ็อกซ์สร้างตัวแปรโกลบอลใหม่ที่บดบังตัวแปรที่ปลอดภัย
setmetatable(safeEnv, {
__newindex = function(_, k, v)
-- allow only whitelisted keys or reject
error("Global assignment not allowed: " .. k)
end
})พร็อกซีสำหรับไลบรารีคณิตศาสตร์
แทนที่จะส่งต่อตาราง math จริง ซึ่งใช้เมทาเทเบิลร่วมกับไลบรารีมาตรฐาน ให้สร้างสำเนาแบบตื้นที่มีเฉพาะฟังก์ชันที่จำเป็น
การทดสอบการหลบหนีโดยอัตโนมัติ
จัดเก็บชุดการทดสอบแบบสุ่มข้อมูลที่ลองรูปแบบการหลบหนีที่รู้จักกับแซนด์บ็อกซ์ของคุณ เรียกใช้ชุดการทดสอบนี้ทุกครั้งที่เปลี่ยนแปลงโค้ดแซนด์บ็อกซ์
การป้องกันหลายชั้น
ไม่มีแซนด์บ็อกซ์ใดสมบูรณ์แบบ ควรใช้การป้องกันหลายชั้น ได้แก่ สภาพแวดล้อมที่จำกัดสิทธิ์ + ขีดจำกัดคำสั่ง + ขีดจำกัดหน่วยความจำ + การแยกโพรเซสระดับระบบปฏิบัติการ เช่น โพรเซสย่อยหรือคอนเทนเนอร์แยกต่างหาก
แซนด์บ็อกซ์ระดับระบบปฏิบัติการ
เพื่อความปลอดภัยสูงสุด ให้เรียกใช้ Lua ในโพรเซสย่อยที่มีข้อจำกัดระดับระบบปฏิบัติการ เช่น seccomp บน Linux, App Sandbox บน macOS หรือ Docker ที่ใช้ระบบไฟล์แบบอ่านอย่างเดียว
คำถามเกี่ยวกับการหลบหนีจากแซนด์บ็อกซ์
เหตุใดจึงต้องไม่นำ rawget มาไว้ในแซนด์บ็อกซ์
สรุป: การป้องกันการหลบหนีจากแซนด์บ็อกซ์
ไม่นำ debug, rawget/rawset, package, require และ load มาไว้ในแซนด์บ็อกซ์ ป้องกันสภาพแวดล้อมแซนด์บ็อกซ์ด้วย __newindex คัดลอกตารางไลบรารีแทนการอ้างอิงตารางต้นฉบับ และเพิ่มการแยกระดับระบบปฏิบัติการเป็นชั้นป้องกันเพื่อความปลอดภัยสูงสุด
คำถามที่พบบ่อย
บทเรียน “การป้องกันการหลบหนีจากแซนด์บ็อกซ์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การป้องกันการหลบหนีจากแซนด์บ็อกซ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การป้องกันการหลบหนีจากแซนด์บ็อกซ์”
บล็อกการเข้าถึงไลบรารี debug การใช้ rawget/rawset ในทางที่ผิด และการรั่วไหลของ upvalue คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การป้องกันการหลบหนีจากแซนด์บ็อกซ์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แบบจำลอง _ENV ใน Lua 5.2+
- การสร้างแซนด์บ็อกซ์แบบจำกัด
- การป้องกันการหลบหนีจากแซนด์บ็อกซ์
- ขีดจำกัดทรัพยากรและการตรวจวัด