งูหลาม sandboxing เป็นเรื่องยาก Python เป็นวิปัสสนาโดยเนื้อแท้ในหลายระดับ
นอกจากนี้ยังหมายความว่าคุณสามารถค้นหาวิธีการจากโรงงานสำหรับประเภทเฉพาะจากประเภทเหล่านั้นและสร้างวัตถุระดับต่ำใหม่ซึ่งจะเรียกใช้โดยตรงโดยล่ามโดยไม่ จำกัด
นี่คือตัวอย่างของการค้นหาวิธีที่สร้างสรรค์ในการทำลายกล่องทราย Python:
แนวคิดพื้นฐานอยู่เสมอเพื่อหาวิธีในการสร้างประเภทหลามฐาน; ฟังก์ชั่นและคลาสและแยกออกจากเชลล์โดยการขอรับ Python interpreter เพื่อรัน bytecode (ไม่ จำกัด !)
เหมือนกันและอื่น ๆ ที่ใช้กับexec
คำสั่ง ( exec()
ฟังก์ชันใน Python 3)
ดังนั้นคุณต้องการ:
ควบคุมการคอมไพล์ไบต์ของรหัสไพ ธ อนอย่างน้อยที่สุดหรืออย่างน้อยโพสต์โปรเซส bytecode เพื่อลบการเข้าถึงชื่อที่ขึ้นต้นด้วยขีดล่าง
สิ่งนี้ต้องการความรู้ที่ลึกซึ้งว่า Python interpreter ทำงานอย่างไรและโครงสร้างของ Python bytecode เป็นอย่างไร รหัสวัตถุซ้อนกัน; bytecode ของโมดูลครอบคลุมเฉพาะข้อความระดับบนสุดเท่านั้นแต่ละฟังก์ชันและคลาสประกอบด้วยลำดับ bytecode ของตัวเองรวมทั้งข้อมูลเมตาที่มีออบเจ็กต์ bytecode อื่น ๆสำหรับฟังก์ชั่นและคลาสที่ซ้อนกัน
คุณจำเป็นต้องมีรายการที่อนุญาตพิเศษที่สามารถใช้ได้ รอบคอบ
โมดูลหลามมีการอ้างอิงถึงโมดูลอื่น หากคุณนำเข้าos
มีชื่อท้องถิ่นos
ในโมดูลเนมสเปซของคุณที่อ้างถึงos
โมดูล สิ่งนี้สามารถนำผู้โจมตีที่มุ่งมั่นไปยังโมดูลที่สามารถช่วยให้พวกเขาหลุดพ้นจากกล่องทราย pickle
โมดูลเช่นช่วยให้คุณโหลดวัตถุโค้ดตัวอย่างดังนั้นหากใด ๆเส้นทางผ่านโมดูลอนุญาตพิเศษนำไปสู่pickle
โมดูลคุณมีปัญหายังคง
คุณต้อง จำกัด โควต้าเวลาอย่างเคร่งครัด แม้แต่โค้ดที่ neutered ที่สุดก็ยังสามารถพยายามที่จะทำงานได้ตลอดไปโดยมัดทรัพยากรของคุณ
ลองดูที่RestrictedPythonซึ่งพยายามที่จะให้การควบคุม bytecode ที่เข้มงวดแก่คุณ RestrictedPython
แปลงรหัส Python เป็นสิ่งที่ช่วยให้คุณสามารถควบคุมชื่อโมดูลและวัตถุที่อนุญาตใน Python 2.3 ถึง 2.7
หากRestrictedPython
มีความปลอดภัยเพียงพอสำหรับวัตถุประสงค์ของคุณจะขึ้นอยู่กับนโยบายที่คุณใช้ ไม่อนุญาตให้เข้าถึงชื่อที่เริ่มด้วยการขีดเส้นใต้และรายการที่อนุญาตพิเศษอย่างเคร่งครัดโมดูลจะเป็นการเริ่มต้น
ในความคิดของฉันตัวเลือกที่แข็งแกร่งอย่างแท้จริงเท่านั้นคือการใช้ Virtual Machine แยกต่างหากอันที่ไม่มีการเข้าถึงเครือข่ายไปยังโลกภายนอกที่คุณทำลายหลังจากการวิ่งแต่ละครั้ง สคริปต์ใหม่แต่ละตัวจะได้รับ VM ใหม่แทน ด้วยวิธีนี้แม้ว่าโค้ดจะจัดการกับ Python sandbox ของคุณ (ซึ่งไม่น่าจะเป็นไปได้) ผู้โจมตีทุกคนที่ได้รับการเข้าถึงจะมีอายุสั้นและไม่มีค่า