0Pricing
Lua Academy · บทเรียน

การป้องกันการหลบหนีจากแซนด์บ็อกซ์

บล็อกการเข้าถึงไลบรารี 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แบบจำลอง _ENV ใน Lua 5.2+
  2. การสร้างแซนด์บ็อกซ์แบบจำกัด
  3. การป้องกันการหลบหนีจากแซนด์บ็อกซ์
  4. ขีดจำกัดทรัพยากรและการตรวจวัด
← กลับไปที่ Lua Academy