เมื่อฉันรูตฉันสามารถสร้างผู้ใช้ / กลุ่มจำลองตั้งสิทธิ์การใช้ไฟล์ตามนั้นและดำเนินการตามกระบวนการในฐานะผู้ใช้นั้นได้ อย่างไรก็ตามฉันไม่ได้ดังนั้นจะมีวิธีการที่จะบรรลุสิ่งนี้โดยไม่ต้องเป็นราก?
chroot
จะเข้าที่นั่นตามธรรมชาติ แต่แล้วคุณก็ไม่รูทอีก
เมื่อฉันรูตฉันสามารถสร้างผู้ใช้ / กลุ่มจำลองตั้งสิทธิ์การใช้ไฟล์ตามนั้นและดำเนินการตามกระบวนการในฐานะผู้ใช้นั้นได้ อย่างไรก็ตามฉันไม่ได้ดังนั้นจะมีวิธีการที่จะบรรลุสิ่งนี้โดยไม่ต้องเป็นราก?
chroot
จะเข้าที่นั่นตามธรรมชาติ แต่แล้วคุณก็ไม่รูทอีก
คำตอบ:
Qs ที่คล้ายกันมากขึ้นพร้อมคำตอบที่ควรค่าแก่การเอาใจใส่:
หมายเหตุ:คำตอบบางข้อนั้นชี้ไปยังโซลูชันเฉพาะที่ยังไม่ได้กล่าวถึงที่นี่
อันที่จริงมีค่อนข้างเครื่องมืองูไม่กี่กับการดำเนินการที่แตกต่างกัน แต่หลายคนอาจจะยังไม่ปลอดภัยจากการออกแบบ (เช่นfakeroot
, LD_PRELOAD
-based) หรือไม่สมบูรณ์ (เช่นfakeroot-ng
, ptrace
-based) หรือจะต้องมีราก ( chroot
หรือplash
กล่าวถึงในตอนfakechroot ป้ายคำเตือน )
นี่เป็นเพียงตัวอย่าง ฉันคิดว่ารายชื่อพวกเขาทุกด้านโดยด้านที่มีข้อบ่งชี้ของ 2 คุณสมบัติเหล่านี้ ( "สามารถเชื่อถือได้?", "ต้องมีรากที่จะตั้งขึ้น?") บางทีอาจเป็นเพราะระบบปฏิบัติการระดับการใช้งานการทำงานแบบเสมือน
โดยทั่วไปคำตอบนั้นครอบคลุมช่วงความเป็นไปได้ที่อธิบายไว้ทั้งหมดและอีกมากมาย:
Chroot-based helpers (ซึ่งจะต้องเป็น setUID root เนื่องจากchroot
ต้องการ root หรืออาจchroot
ทำงานใน namespace ที่แยกได้ - ดูด้านล่าง):
[เพื่อเล่าเพิ่มเติมเกี่ยวกับพวกเขา!]
hsh-run
และ hsh-shell
( Hasherถูกออกแบบมาสำหรับการสร้างซอฟต์แวร์ในลักษณะที่ปลอดภัยและทำซ้ำได้)อีกวิธีที่น่าเชื่อถือแยก (นอกเหนือจากชั่นหนึ่ง ) จะเป็นฉบับสมบูรณ์ syscall สกัดกั้นผ่านตามที่อธิบายไว้ใน manpage สำหรับ:seccomp
ptrace
fakeroot-ng
ซึ่งแตกต่างจากการใช้งานก่อนหน้านี้ fakeroot-ng ใช้เทคโนโลยีที่ทำให้กระบวนการที่ติดตามไม่มีทางเลือกว่าจะใช้ "บริการ" ของ fakeroot-ng หรือไม่ การคอมไพล์โปรแกรมแบบสแตติกการเรียกเคอร์เนลโดยตรงและจัดการพื้นที่ที่อยู่ของตัวเองนั้นเป็นเทคนิคทั้งหมดที่สามารถนำมาใช้เพื่อเลี่ยงผ่าน LD_PRELOAD โดยใช้การควบคุมตามกระบวนการและไม่ได้ใช้กับ fakeroot-ng ในทางทฤษฎีแล้วมันเป็นไปได้ที่จะปั้น fakeroot-ng เพื่อให้สามารถควบคุมกระบวนการที่ติดตามได้ทั้งหมด
แม้ว่ามันจะเป็นไปได้ในทางทฤษฎี แต่ก็ยังไม่ได้ทำ Fakeroot-ng สันนิษฐานว่าสมมติฐาน "ประพฤติอย่างดี" บางอย่างเกี่ยวกับกระบวนการที่ถูกติดตามและกระบวนการที่ทำลายสมมติฐานเหล่านั้นอาจสามารถหากไม่รอดโดยสิ้นเชิงแล้วอย่างน้อยก็หลีกเลี่ยงสภาพแวดล้อม "ปลอม" บางอย่างที่กำหนดโดย fakeroot- งะ ดังนั้นคุณจึงได้รับคำเตือนอย่างยิ่งให้ใช้ fakeroot-ng เป็นเครื่องมือรักษาความปลอดภัย รายงานข้อผิดพลาดที่อ้างว่ากระบวนการสามารถจงใจหลบหนีการควบคุมของ root-ng โดยเจตนาจะถูกปิดเป็น "ไม่ใช่ข้อผิดพลาด" หรือทำเครื่องหมายว่ามีลำดับความสำคัญต่ำ
เป็นไปได้ว่านโยบายนี้จะมีการทบทวนอีกครั้งในอนาคต อย่างไรก็ตามในขณะนี้คุณได้รับคำเตือนแล้ว
ยังตามที่คุณสามารถอ่านได้fakeroot-ng
ตัวมันเองไม่ได้ออกแบบมาเพื่อจุดประสงค์นี้
(BTW ฉันสงสัยว่าทำไมพวกเขาเลือกที่จะใช้seccomp
วิธี -based สำหรับ Chromium มากกว่าptrace
-based ... )
จากเครื่องมือที่ไม่ได้กล่าวถึงข้างต้นฉันสังเกตGeordiด้วยตัวเองเพราะฉันชอบที่โปรแกรมควบคุมนั้นเขียนใน Haskell
fakeroot-ng
วิธีการหนึ่งที่รู้จักกันเพื่อให้เกิดการแยกผ่านวิธีการ seccomp sandboxing ที่ใช้ใน Google โครเมี่ยม แต่วิธีนี้สมมติว่าคุณเขียนผู้ช่วยซึ่งจะดำเนินการบางอย่าง (คนที่ได้รับอนุญาต) ของการเข้าถึงไฟล์ "ดัก" และ syscalls อื่น ๆ และแน่นอนพยายาม "สกัดกั้น" syscalls และเปลี่ยนเส้นทางไปยังผู้ช่วย (บางทีมันอาจหมายถึงสิ่งต่าง ๆ เช่นการแทนที่ syscalls ที่ถูกดักจับในรหัสของกระบวนการควบคุมดังนั้นจึงไม่มีเสียง จะค่อนข้างง่ายถ้าคุณสนใจคุณควรอ่านรายละเอียดมากกว่าแค่คำตอบของฉัน)
ข้อมูลที่เกี่ยวข้องเพิ่มเติม (จาก Wikipedia):
(รายการสุดท้ายดูเหมือนจะน่าสนใจถ้าใครกำลังมองหาseccomp
โซลูชันที่ใช้งานทั่วไปนอก Chromium นอกจากนี้ยังมีโพสต์บล็อกที่มีมูลค่าการอ่านจากผู้เขียน "seccomp-nurse": SECCOMP เป็นวิธีแก้ปัญหา Sandbox? )
ภาพประกอบของวิธีการนี้จากโครงการ "seccomp-nurse" :
มีเคยปรากฏในปี 2009 ยังมีข้อเสนอแนะในการแก้ไขเคอร์เนล Linuxเพื่อให้มีความยืดหยุ่นมากขึ้นในseccomp
โหมด - เพื่อให้ "กายกรรมจำนวนมากที่เราต้องการในปัจจุบันสามารถหลีกเลี่ยงได้" ( "กายกรรม" หมายถึงภาวะแทรกซ้อนของการเขียนที่มีผู้ช่วยในการดำเนินการหลาย syscalls อาจจะเป็นผู้บริสุทธิ์ในนามของกระบวนการตัดสินจำคุกและของแทน syscalls อาจจะเป็นผู้บริสุทธิ์ในกระบวนการตัดสินจำคุกเป็นได้.) บทความ LWNเขียนถึงประเด็นนี้:
หนึ่งข้อเสนอแนะที่ออกมาคือการเพิ่ม "โหมด" ใหม่เพื่อ seccomp API ได้รับการออกแบบโดยมีแนวคิดว่าแอพพลิเคชั่นที่แตกต่างกันอาจมีข้อกำหนดด้านความปลอดภัยที่แตกต่างกัน มันมีค่า "โหมด" ซึ่งระบุข้อ จำกัด ที่ควรใส่ มีการใช้งานโหมดดั้งเดิมเท่านั้น แต่สามารถเพิ่มโหมดอื่น ๆ ได้อย่างแน่นอน การสร้างโหมดใหม่ที่อนุญาตให้กระบวนการเริ่มต้นระบุว่าการเรียกใช้ระบบใดที่จะได้รับอนุญาตจะทำให้เครื่องมืออำนวยความสะดวกมีประโยชน์มากขึ้นสำหรับสถานการณ์เช่น Chrome sandbox
Adam Langley (รวมถึง Google) ได้โพสต์แพตช์ซึ่งทำเช่นนั้น การนำไปใช้งาน "โหมด 2" ใหม่ยอมรับ bitmask ที่อธิบายว่าการเรียกของระบบใดที่สามารถเข้าถึงได้ หากหนึ่งในนั้นคือ prctl () ดังนั้นรหัส sandboxed สามารถ จำกัด การเรียกใช้ระบบของตัวเองเพิ่มเติมได้ (แต่ไม่สามารถเรียกคืนการเข้าถึงการเรียกใช้ระบบที่ถูกปฏิเสธ) ทั้งหมดบอกว่ามันดูเหมือนทางออกที่สมเหตุสมผลซึ่งจะทำให้ชีวิตของนักพัฒนากล่องทรายง่ายขึ้น
ที่กล่าวว่ารหัสนี้อาจไม่สามารถผสานเพราะการสนทนาได้ย้ายไปเป็นไปได้อื่น ๆ
"seccomp ที่ยืดหยุ่น" นี้จะนำความเป็นไปได้ของ Linux เข้ามาใกล้เพื่อมอบคุณสมบัติที่ต้องการในระบบปฏิบัติการโดยไม่จำเป็นต้องเขียนตัวช่วยที่ซับซ้อน
(บล็อกโพสต์ที่มีเนื้อหาเดียวกันกับคำตอบนี้: http://geofft.mit.edu/blog/sipb/33โดยพื้นฐาน)
unshare
)การแยกผ่านเนมสเปซ ( unshare
-based solutions ) - ไม่ได้กล่าวถึงที่นี่ - เช่นการไม่แบ่งจุดเมานท์ (รวมกับ FUSE?) อาจเป็นส่วนหนึ่งของโซลูชันที่ทำงานได้สำหรับคุณที่ต้องการ จำกัด การเข้าถึงระบบไฟล์ของกระบวนการที่ไม่น่าเชื่อถือ
เพิ่มเติมเกี่ยวกับเนมสเปซตอนนี้เมื่อการดำเนินการเสร็จสิ้นแล้ว (เทคนิคการแยกนี้ยังเป็นที่รู้จักภายใต้ nme "Linux Containers" หรือ "LXC"ใช่ไหม? .. ):
มีความเป็นไปได้ที่จะสร้างเนมสเปซผู้ใช้ใหม่เพื่อให้ "กระบวนการสามารถมี ID ผู้ใช้ที่ไม่มีสิทธิ์แบบปกตินอกเนมสเปซผู้ใช้ในขณะเดียวกันก็มี ID ผู้ใช้เป็น 0 ภายในเนมสเปซนั่นหมายความว่ากระบวนการนั้น สำหรับการดำเนินการภายในเนมสเปซผู้ใช้ แต่ไม่มีสิทธิ์สำหรับการดำเนินการภายนอกเนมสเปซ "
สำหรับคำสั่งที่ใช้งานได้จริงให้ทำสิ่งนี้ดูคำตอบได้ที่:
แต่แน่นอนว่าการรับประกัน "คุก" ที่ต้องการนั้นสามารถนำไปใช้งานได้โดยการตั้งโปรแกรมในพื้นที่ผู้ใช้ ( โดยไม่ต้องมีการสนับสนุนเพิ่มเติมสำหรับฟีเจอร์นี้จากระบบปฏิบัติการบางทีนั่นอาจเป็นเหตุผลว่าทำไมคุณสมบัตินี้ไม่ได้รวมอยู่ใน ); กับภาวะแทรกซ้อนมากหรือน้อย
ดังกล่าวptrace
-หรือseccomp
sandboxing ชั่นสามารถมองเห็นเป็นบางสายพันธุ์ของการดำเนินการค้ำประกันโดยการเขียน Sandbox ผู้ช่วยที่จะควบคุมกระบวนการอื่น ๆ ของคุณซึ่งจะถือว่าเป็น "กล่องดำ" โปรแกรมระบบปฏิบัติการยูนิกซ์โดยพลการ
อีกวิธีหนึ่งคือการใช้เทคนิคการเขียนโปรแกรมที่สามารถดูแลเกี่ยวกับผลกระทบที่ต้องไม่ได้รับอนุญาต (จะต้องเป็นคุณที่เขียนโปรแกรมแล้วพวกมันไม่ใช่กล่องดำอีกต่อไป) พูดถึงเรื่องนี้โดยใช้ภาษาโปรแกรมบริสุทธิ์ (ซึ่งจะบังคับให้คุณเขียนโปรแกรมโดยไม่มีผลข้างเคียง) เช่นHaskellจะทำให้เอฟเฟกต์ทั้งหมดของ โปรแกรมอย่างชัดเจนดังนั้นโปรแกรมเมอร์สามารถทำให้แน่ใจได้ว่าจะไม่มีผลต่อการไม่อนุญาต
ฉันเดาว่ามีสิ่งอำนวยความสะดวกในการทำแซนด์บ็อกซ์สำหรับการเขียนโปรแกรมเหล่านั้นในภาษาอื่นเช่น Java
cf เลย "Sandboxed Haskell" ข้อเสนอโครงการ
NaCl - ไม่พูดถึงที่นี่ -เป็นของกลุ่มนี้ใช่ไหม
บางหน้าสะสมข้อมูลในหัวข้อนี้ก็ชี้ไปที่คำตอบที่นั่น:
chroot
แต่อาจจะยังคงต้องการ สิทธิ์ root จริง ...
นี่เป็นข้อ จำกัด พื้นฐานของโมเดลการอนุญาตยูนิกซ์: รูทเท่านั้นที่สามารถมอบสิทธิ์
คุณไม่จำเป็นต้องรูทเพื่อใช้งานเครื่องเสมือน (ไม่จริงสำหรับเทคโนโลยี VM ทั้งหมด) แต่นี่เป็นโซลูชันเฮฟวี่เวท
User-mode Linuxเป็นโซลูชันการจำลองเสมือนแบบ Linux-on-Linux ที่มีน้ำหนักเบา ไม่ใช่เรื่องง่ายที่จะตั้งค่า คุณจะต้องเติมพาร์ติชั่นรูท (ในไดเรกทอรี) อย่างน้อยที่สุดก็จำเป็นต้องบูท (ไฟล์ไม่กี่ไฟล์/etc
, /sbin/init
และการพึ่งพา, โปรแกรมล็อกอิน, เชลล์และโปรแกรมอรรถประโยชน์)
ฉันเดาว่าคุณสามารถมีโชคกับLD_PRELOAD
การสกัดกั้นการเข้าถึงไฟล์บางอย่าง แต่นี่อาจเป็นเรื่องยุ่งยาก
LD_PRELOAD
ไม่สามารถเชื่อถือได้ (สามารถหลีกเลี่ยงได้) แต่การสกัดกั้นผ่านptrace
ทำได้
LD_PRELOAD
การแก้ปัญหาโดยใช้ไม่สามารถเชื่อถือได้เป็นมาตรการรักษาความปลอดภัย
จากรายการทั้งหมดฉันจะเพิ่ม:
fakeroot (จากผู้ดูแลแพคเกจเดเบียน): มุ่งสร้างแพ็คเกจด้วยเครื่องมือ "เป็นมิตร" นี่ไม่ใช่การแยกที่สมบูรณ์ แต่ช่วยสร้างแพ็คเกจกับผู้ใช้และอุปกรณ์ปลอมและไฟล์หลอกพิเศษอื่น ๆ
fakechroot (ซึ่งใช้ fakeroot) โปรแกรมนี้มีข้อบกพร่องมากมาย ตัวอย่างเช่น "/ etc / hosts" เป็นฮาร์ดโค้ดใน glibc: คุณไม่สามารถเปลี่ยนได้ด้วยเครื่องมือนี้
qemu: คุณต้องรวบรวมเคอร์เนล linux แต่ผลลัพธ์นั้นเร็วมากและนี่คือเครื่อง "ปลอม" (เช่นเสมือน) ที่มีสิทธิ์รูทจริง คุณสามารถสร้างและเมานต์อิมเมจสำหรับบูตได้
Firejail เป็นเครื่องมือที่ดีในการเข้าคุกกระบวนการใด ๆ ไม่ว่าจะมีการเข้าถึงรูทด้วยตัวเลือกมากมายและมีความยืดหยุ่นสูง: