การดำเนินการของโปรแกรมที่อาจเป็นอันตรายบน Linux


33

ฉันกำลังเขียนโปรแกรมที่จะทดสอบโปรแกรมที่เขียนโดยนักเรียน ฉันกลัวว่าฉันจะไม่ไว้ใจพวกเขาและฉันต้องแน่ใจว่ามันจะไม่จบลงอย่างเลวร้ายสำหรับคอมพิวเตอร์ที่ใช้งาน

ฉันกำลังคิดเกี่ยวกับการทำให้ผู้ใช้ทดสอบข้อผิดพลาดที่มีการเข้าถึงทรัพยากรระบบอย่าง จำกัด และเรียกใช้โปรแกรมในฐานะผู้ใช้รายนั้น แต่จากสิ่งที่ฉันพบในเน็ตจนถึงการสร้างระบบเสมือนจะเป็นตัวเลือกที่ปลอดภัยที่สุด ...

ใครสามารถช่วยฉันด้วยการเลือกวิธีการที่ถูกต้อง? ความปลอดภัยเป็นเรื่องใหญ่สำหรับฉัน ในทางกลับกันฉันไม่ต้องการทางออกที่เกินกำลังและเสียเวลามากมายในการเรียนรู้สิ่งที่ฉันไม่ต้องการ


7
เพียงแค่เรียกใช้โปรแกรมใน linux ในเบราว์เซอร์ ( bellard.org/jslinux ) มันเป็นกล่องทรายที่ดีมาก :)
Fixee

ว้าวน่าสนใจจริงๆ! แต่ฉันจะต้องเขียนอินเทอร์เฟซบางอย่างเพื่อใช้ (เนื่องจากกระบวนการทั้งหมดเป็นไปโดยอัตโนมัติ) ... ฉันต้องลองดู หากปรากฎว่า Javascript Linux นี้เป็นมากกว่าแกดเจ็ตฉันยังสามารถใช้งานได้
korda

ฉันตั้งใจแสดงความคิดเห็นของฉันว่าเป็นเรื่องตลก แต่ถ้าคุณสามารถใช้มันได้ สุจริตคำตอบ LiveCD (พร้อม RAMdisk) เป็นทางออกที่ดี
Fixee

ถ้าฉันจะจัดการให้ใช้ฉันก็จะใช้มันบนหน้าเว็บที่ฉันสามารถเข้าถึงผลลัพธ์ได้ - นั่นจะดีและสะดวกสบายจริงๆ นับปัจจัย geek ด้วย;) และดิสก์สดไม่ใช่ตัวเลือก - เพราะฉันบอกว่าฉันกำลังทำโปรแกรมมันจะทำงานบนเซิร์ฟเวอร์บางเครื่องดังนั้นการรีบูตไม่ใช่สิ่งที่ฉันสามารถจ่ายได้ ... ฉันเดาว่าฉันจะติดกับเครื่องเสมือนอยู่ดี ..
korda

คำตอบ:


28
  • เครื่องเสมือนสามารถให้ความปลอดภัยสูงสุดแก่คุณโดยไม่ต้องบูตเครื่องใหม่ แต่ประสิทธิภาพต่ำที่สุด

  • ตัวเลือกอื่นเพื่อความปลอดภัยที่สูงกว่าเครื่องเสมือน: บู๊ตซีดี / ดีวีดี / pendrive ที่ "สด"โดยไม่ต้องเข้าถึงฮาร์ดไดรฟ์ (ปิดการใช้งาน HDD ชั่วคราวใน BIOS ถ้าคุณทำไม่ได้อย่างน้อยก็ไม่ต้องเมานท์ไดรฟ์ / ถอนติดตั้งถ้าติดตั้งโดยอัตโนมัติ - แต่มันปลอดภัยน้อยกว่า)

  • นักเทียบท่าภาชนะเป็นบิตมีความปลอดภัยน้อยทางเลือกให้กับเครื่องเสมือนเต็มรูปแบบ อาจเป็นความแตกต่างที่สำคัญ (ในแง่ของความปลอดภัย) ระหว่างสองสิ่งนี้คือระบบที่ทำงานใน docker ใช้จริงเคอร์เนลของระบบโฮสต์ของคุณ

  • มีโปรแกรมเช่นไอโซเลทที่จะสร้างสภาพแวดล้อมที่ปลอดภัยเป็นพิเศษ - โดยทั่วไปเรียกว่าแซนด์บ็อกซ์ - โดยทั่วไปจะเป็นแบบ chroot-based พร้อมการควบคุมเพิ่มเติม - ค้นหาโปรแกรมที่เหมาะกับคุณ

  • chrootง่าย ๆจะปลอดภัยน้อยที่สุด (โดยเฉพาะอย่างยิ่งในเรื่องการเรียกใช้งานโปรแกรม), แต่อาจเร็วกว่านี้เล็กน้อย, แต่ ... คุณจะต้องสร้าง / คัดลอกรากต้นไม้แยกทั้งต้นและใช้ bind mounts /devเป็นต้น (ดูหมายเหตุ 1ด้านล่าง!) ดังนั้นโดยทั่วไปไม่สามารถแนะนำวิธีนี้ได้โดยเฉพาะหากคุณสามารถใช้sandboxสภาพแวดล้อมที่ปลอดภัยและติดตั้งง่ายขึ้น

หมายเหตุ 0:การทุกแง่มุมของผู้ใช้ "พิเศษ" เช่นที่nobodyบัญชี: นี้จะช่วยให้แทบจะไม่ได้chrootการรักษาความปลอดภัยมากน้อยกว่าแม้เรียบง่าย nobodyผู้ใช้ยังสามารถเข้าถึงไฟล์และโปรแกรมที่ได้อ่านและรันสิทธิ์ที่กำหนดไว้สำหรับอื่น ๆ su -s /bin/sh -c 'some command' nobodyคุณสามารถทดสอบด้วย และหากคุณมีใครสามารถเข้าถึงไฟล์การกำหนดค่า / ประวัติ / แคช (โดยไม่ได้ตั้งใจหรือช่องโหว่ความปลอดภัยเล็กน้อย) โปรแกรมที่ทำงานด้วยnobodyสิทธิ์อนุญาตสามารถเข้าถึงได้ grep สำหรับข้อมูลลับ (เช่น "pass =" ฯลฯ ) และใน มีหลายวิธีที่ส่งผ่านเน็ตหรืออะไรก็ตาม

หมายเหตุ 1:ตามที่ Gilles ระบุไว้ในความคิดเห็นด้านล่างสภาพแวดล้อม chroot ง่าย ๆ จะให้ความปลอดภัยน้อยมากต่อการหาช่องโหว่ที่มีเป้าหมายเพื่อเพิ่มระดับสิทธิ์ chroot เพียงผู้เดียวทำให้รู้สึกถึงความปลอดภัยอย่างชาญฉลาดหากสภาพแวดล้อมมีน้อยที่สุดประกอบด้วยโปรแกรมที่ได้รับการยืนยันความปลอดภัยเท่านั้น (แต่ยังคงมีความเสี่ยงในการใช้ช่องโหว่ระดับเคอร์เนลที่อาจเกิดขึ้นได้) และโปรแกรมที่ไม่น่าเชื่อถือทั้งหมด ในฐานะผู้ใช้ที่ไม่ได้เรียกใช้กระบวนการใด ๆ นอก chroot สิ่งที่ chroot ป้องกันไม่ให้ (ด้วยข้อ จำกัด ที่กล่าวถึงที่นี่) คือการเจาะระบบโดยตรงโดยไม่มีการเพิ่มสิทธิ์ อย่างไรก็ตามตามที่ Gilles ได้ระบุไว้ในความคิดเห็นอื่นแม้กระทั่งระดับความปลอดภัยนั้นก็อาจถูกหลบเลี่ยงได้ทำให้โปรแกรมสามารถแยกออกจาก chroot ได้


ขอบคุณสำหรับคำตอบ. ฉันเป็นคนใหม่จริง ๆ เมื่อพูดถึงเรื่องแบบนี้คุณช่วยอธิบายฉันได้ไหม: ทำไมฉันต้องป้องกันไม่ให้โปรแกรมอ่านไฟล์ในระบบ (เช่น chroot)? (หากโปรแกรมไม่สามารถแก้ไขได้)
korda

บัญชีผู้ใช้ทดสอบการชนจะช่วยให้คุณรักษาความปลอดภัยพื้นฐานบางอย่างเพื่อตรวจสอบว่า ยังมีอีกหลายสิ่งที่คุณอาจต้องการ / จำเป็นต้องป้องกัน เหล่านั้นสามารถจะอยู่ในรูปแบบของการหาประโยชน์จากช่องโหว่ที่พบฝังอยู่ในโปรแกรมหรือบางแฮ็สังคม, การรวบรวมข้อมูลเพื่อวัตถุประสงค์ในการโจมตีระยะไกลในอนาคต ... และอาจจะมากขึ้น
rozcietrzewiacz

สาเหตุที่เราเป็น: มีวิธีป้องกันผู้ใช้จากการเชื่อมต่ออินเทอร์เน็ตหรือไม่?
korda

1
ฉันสงสัยว่าnobodyมีอินเทอร์เน็ตหรือไม่
korda

1
@rozcietrzewiacz ข้อกำหนดที่สำคัญสำหรับ chroot เพื่อให้การป้องกันใด ๆ คือไม่ให้เรียกใช้โปรแกรม chrooted ในฐานะผู้ใช้ที่กำลังเรียกใช้โปรแกรมนอก chroot มิฉะนั้นกระบวนการ chrooted สามารถ ptrace กระบวนการที่ไม่ใช่ chrooted และทำอะไรแบบนั้น
Gilles 'หยุดความชั่วร้าย'

10

ใช้เครื่องเสมือน สิ่งที่น้อยกว่าไม่ได้ให้ความปลอดภัยมาก

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

ฉันจะแนะนำให้เรียกใช้ VirtualBox คุณสามารถตั้งค่าเครื่องเสมือนได้ภายในไม่กี่นาทีจากนั้นติดตั้งการกระจาย Linux ภายในเครื่อง การตั้งค่าที่ไม่ใช่ค่าเริ่มต้นเดียวที่ฉันแนะนำคือการตั้งค่าเครือข่าย: สร้างทั้งอินเทอร์เฟซ“ NAT” (เพื่อสื่อสารกับโลก) และอินเทอร์เฟซ“ โฮสต์เท่านั้น” (เพื่อให้คุณสามารถคัดลอกไฟล์ไปยังและจากโฮสต์ได้อย่างง่ายดาย VM) ปิดการใช้งานอินเทอร์เฟซ NAT ในขณะที่คุณเรียกใช้โปรแกรมของนักเรียน¹; เปิดใช้งานเฉพาะเมื่อคุณติดตั้งหรืออัปเกรดซอฟต์แวร์แพ็กเกจ

ภายในเครื่องเสมือนสร้างผู้ใช้หนึ่งคนต่อนักเรียน

¹ คุณสามารถ จำกัด อินเทอร์เฟซ NAT ให้อยู่ในรายการที่อนุญาตของผู้ใช้ แต่นั่นเป็นขั้นสูงมากกว่าที่คุณต้องการในการตั้งค่าแบบง่ายและตรงประเด็น


2

นี่คือคำอธิบายอย่างละเอียดมากเกี่ยวกับสาเหตุที่ใช้ Chroot ยังคงเป็นตัวเลือกที่ทำงานได้ดีและทำไมระบบปฏิบัติการเต็มรูปแบบหรือการจำลองเสมือนสำหรับฮาร์ดแวร์แบบเต็มโดยเฉพาะอย่างยิ่ง overkill ในสถานการณ์เฉพาะ

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

ตรงกันข้ามกับความเชื่อที่ได้รับความนิยมไม่ใช่ทุกสถานการณ์ที่ต้องใช้การจำลองเสมือนจริงของระบบปฏิบัติการหรือการจำลองฮาร์ดแวร์ทั้งหมด นี่อาจหมายถึงการมีพื้นที่การโจมตีมากกว่านี้เพื่อลองและปกปิด ในทางกลับกันความหมายของระบบความปลอดภัยน้อยลง (ต้นฉบับสำหรับผู้ดูแลระบบที่มีความรู้น้อย)

กฎค่อนข้างง่าย: อย่าใส่อะไรเข้าไปใน chroot ที่ไม่จำเป็น ห้ามรัน daemon ในฐานะรูท ห้ามรัน daemon ในฐานะผู้ใช้ที่รัน daemon นอก chroot

ลบแอปพลิเคชันที่ไม่ปลอดภัย setuid ไบนารี dangling symlink / hardlinks ที่ไม่มีเจ้าของ ประกอบโฟลเดอร์ที่ไม่จำเป็นโดยใช้ nosuid, noexec และ nodev สร้างเวอร์ชันเสถียรล่าสุดของ running daemon จากซอร์สโค้ด และที่สำคัญที่สุดคือความปลอดภัยของระบบฐาน!


2

ฉันจะเพิ่มสิ่งนี้หลังจากตอบคำถามอย่างเป็นทางการแล้ว: MAGIC: Malicious Aging in Circuits / Coresซึ่งโชคไม่ดีที่ถูกขังอยู่ข้างหลังกำแพงของ ACM ผลที่สุดของกระดาษคือมีร่องรอยความกว้างน้อยมากในวงจรที่ใช้ในปัจจุบันในระหว่างอายุการใช้งานและในที่สุดก็พังทลายลง ด้วยการค้นหาคำสั่งที่ถูกต้องและทำซ้ำพวกเขาซ้ำแล้วซ้ำอีกผู้โจมตีสามารถอายุ IC เพื่อความล้มเหลวอย่างรวดเร็ว

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


1

เมื่อวันที่ UNIXes BSD มา (รวมถึง Mac OS X) sandboxมีสิ่งอำนวยความสะดวกที่เรียกว่า manpage พูดว่า

รายละเอียดsandbox ที่สิ่งอำนวยความสะดวกช่วยให้โปรแกรมที่จะสมัครใจ จำกัด การเข้าถึงของพวกเขาเพื่อการดำเนินงานทรัพยากรระบบ กลไกความปลอดภัยนี้มีวัตถุประสงค์เพื่อจำกัดความเสียหายที่อาจเกิดขึ้นในกรณีที่ช่องโหว่ถูกโจมตี ไม่ใช่การแทนที่การควบคุมการเข้าถึงระบบปฏิบัติการอื่น

สิ่งนี้แยกจากchrootสิ่งอำนวยความสะดวกที่มีให้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.