การอนุญาตไฟล์ใน Linux

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

การอนุญาตไฟล์ใน Linux

การอนุญาตไฟล์เป็นทางเลือกที่ปลอดภัยสำหรับไฟล์ปฏิบัติการ SUID แต่อาจดูสับสนเล็กน้อยในตอนแรก


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

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

การอนุญาตนั้นดีสำหรับบริการที่โดยปกติแล้วจะทำงานในฐานะรูทเสมอ แต่ยูทิลิตี้บรรทัดคำสั่งล่ะ? โชคดีที่สิ่งนี้ได้รับการสนับสนุนเช่นกันหากคุณติดตั้งยูทิลิตี้ที่ถูกต้อง หากคุณใช้ Ubuntu คุณจะต้องมีแพ็คเกจดังกล่าว libcap2-bin. คุณจะต้องเรียกใช้เคอร์เนลที่ไม่ล้าสมัย (จากเวอร์ชัน 2.6.24).

ฟังก์ชันเหล่านี้อนุญาตให้เชื่อมโยงกับไฟล์ปฏิบัติการได้ คล้ายกับการตั้งค่าบิต SUID แต่สำหรับชุดสิทธิ์เฉพาะเท่านั้น คุณประโยชน์ setcap ใช้เพื่อเพิ่มและลบการอนุญาตออกจากไฟล์

ขั้นตอนแรกคือการเลือกสิทธิ์ที่คุณต้องการ เพื่อประโยชน์ของบทความนี้ ฉันถือว่ามีเครื่องมือวินิจฉัยเครือข่ายที่เรียกว่า tracewalkซึ่งควรจะสามารถใช้งานได้ ซ็อกเก็ตดิบ. โดยปกติแล้วจะต้องเรียกใช้แอปพลิเคชันในฐานะรูท แต่เมื่อดู รายการ ปรากฎว่าต้องได้รับอนุญาตเท่านั้น CAP_NET_RAW.

สมมติว่าคุณอยู่ในไดเร็กทอรีที่มีไบนารีอยู่ tracewalkคุณสามารถเพิ่มการอนุญาตนี้ได้ดังนี้:

sudo setcap cap_net_raw=eip tracewalk

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

setcap -v cap_new_raw=eip tracewalk

หรือคุณสามารถแสดงรายการการอนุญาตทั้งหมดที่กำหนดไว้สำหรับการปฏิบัติการที่กำหนด:

getcap tracewalk

สำหรับการอ้างอิง คุณยังสามารถลบการอนุญาตทั้งหมดออกจากไฟล์ปฏิบัติการได้ด้วย:

setcap -r tracewalk

ณ จุดนี้ คุณควรจะสามารถเรียกใช้ไฟล์ปฏิบัติการได้ในฐานะผู้ใช้ที่ไม่มีสิทธิ์ และควรจะสามารถทำงานกับซ็อกเก็ตดิบได้ แต่ไม่มีสิทธิ์อื่นใดที่ผู้ใช้รูทมี

แล้วคำต่อท้ายแปลกๆ นี้หมายถึงอะไร? =eip? สิ่งนี้จำเป็นต้องมีความเข้าใจเกี่ยวกับลักษณะของการอนุญาต แต่ละกระบวนการมีสิทธิ์สามชุด - มีประสิทธิผล สืบทอดได้ และได้รับอนุญาต:

  • มีประสิทธิภาพ สิทธิ์คือสิทธิ์ที่กำหนดว่ากระบวนการสามารถทำอะไรได้จริง ตัวอย่างเช่น ไม่สามารถจัดการกับซ็อกเก็ตดิบได้หาก CAP_NET_RAW ไม่อยู่ในชุดที่มีประสิทธิภาพ
  • มีอยู่ การอนุญาตคือสิ่งที่กระบวนการได้รับอนุญาตให้มีหากร้องขอโดยใช้การเรียกที่เหมาะสม พวกเขาป้องกันไม่ให้กระบวนการทำอะไรจริง ๆ เว้นแต่จะมีการเขียนเป็นการเฉพาะเพื่อขออนุญาตดังกล่าว ซึ่งช่วยให้สามารถเขียนกระบวนการเพื่อเพิ่มสิทธิ์ที่สำคัญให้กับการตั้งค่าที่มีผลเฉพาะในช่วงเวลาที่จำเป็นเท่านั้น
  • สืบทอดได้ การอนุญาตคือสิทธิ์ที่สามารถสืบทอดได้ในชุดที่สามารถเข้าถึงได้ของกระบวนการลูกที่สร้าง ในระหว่างการผ่าตัด fork() หรือ clone() กระบวนการลูกจะได้รับสำเนาของการอนุญาตของกระบวนการหลักเสมอ เนื่องจากยังคงใช้งานไฟล์ปฏิบัติการเดียวกัน ณ จุดนั้น ชุดที่สืบทอดได้จะใช้เมื่อ exec() (หรือเทียบเท่า) ถูกเรียกให้แทนที่ไฟล์ปฏิบัติการด้วยไฟล์อื่น ณ จุดนี้ ชุดที่พร้อมใช้งานของกระบวนการจะถูกมาสก์โดยชุดที่สืบทอดได้เพื่อรับชุดที่สามารถเข้าถึงได้ซึ่งจะถูกใช้สำหรับกระบวนการใหม่

ดังนั้นยูทิลิตี้ setcap อนุญาตให้เราเพิ่มการอนุญาตของทั้งสามชุดนี้อย่างเป็นอิสระสำหรับปฏิบัติการที่กำหนด โปรดทราบว่าความหมายของกลุ่มมีการตีความแตกต่างกันเล็กน้อยสำหรับการอนุญาตไฟล์:

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

เมื่อระบุสิทธิ์ผ่านทาง setcap ตัวอักษรสามตัว e, i и p อ้างถึง มีประสิทธิภาพ สืบทอดได้ และเข้าถึงได้ ชุดตามลำดับ ดังนั้นข้อกำหนดก่อนหน้านี้:

sudo setcap cap_net_raw=eip tracewalk

...แสดงว่ามีมติ CAP_NET_RAW จะต้องเพิ่มลงในชุดที่มีอยู่และชุดที่สืบทอดได้ และต้องตั้งค่าบิตที่มีประสิทธิภาพด้วย การดำเนินการนี้จะแทนที่สิทธิ์ที่กำหนดไว้ก่อนหน้านี้ในไฟล์ หากต้องการตั้งค่าการอนุญาตหลายรายการพร้อมกัน ให้ใช้รายการที่คั่นด้วยเครื่องหมายจุลภาค:

sudo setcap cap_net_admin,cap_net_raw=eip tracewalk

คู่มือสิทธิ์ กล่าวถึงทั้งหมดนี้โดยละเอียดยิ่งขึ้น แต่หวังว่าโพสต์นี้จะช่วยให้เข้าใจได้ง่ายขึ้นว่าเกิดอะไรขึ้นเล็กน้อย มีข้อแม้และลูกเล่นเพียงไม่กี่ข้อที่เหลืออยู่ที่ต้องพูดถึง

ขั้นแรก ความสามารถของไฟล์ใช้ไม่ได้กับ symlink - คุณต้องนำไปใช้กับไฟล์ไบนารี่เอง (เช่น เป้าหมายของ symlink)

ประการที่สอง ใช้งานไม่ได้กับสคริปต์ที่ตีความ ตัวอย่างเช่น หากคุณมีสคริปต์ Python ที่คุณต้องการกำหนดสิทธิ์ คุณต้องกำหนดให้กับตัวแปล Python เอง แน่นอนว่านี่เป็นปัญหาด้านความปลอดภัยที่อาจเกิดขึ้น เนื่องจากสคริปต์ทั้งหมดที่เรียกใช้งานด้วยล่ามนั้นจะมีสิทธิ์ตามที่ระบุ แม้ว่านี่ยังดีกว่าการทำให้เป็น SUID อย่างมากก็ตาม วิธีแก้ปัญหาที่พบบ่อยที่สุดน่าจะเป็นการเขียนไฟล์ปฏิบัติการแยกต่างหากในภาษา C หรือเทียบเท่า ซึ่งสามารถดำเนินการที่จำเป็นและเรียกใช้จากสคริปต์ได้ ซึ่งคล้ายกับแนวทางที่ใช้โดย Wireshark ซึ่งใช้ไบนารี่ /usr/bin/dumpcap เพื่อดำเนินการที่มีสิทธิพิเศษ:

$ getcap /usr/bin/dumpcap 
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip

ประการที่สาม สิทธิ์ของไฟล์จะถูกปิดใช้งานหากคุณใช้ตัวแปรสภาพแวดล้อม LD_LIBRARY_PATH ด้วยเหตุผลด้านความปลอดภัยที่ชัดเจน(1). เช่นเดียวกับ LD_PRELOAD, เท่าที่ฉันรู้.

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

นั่นคือทั้งหมดที่ ดูรายละเอียดโปรแกรมหลักสูตรเพิ่มเติมได้ที่ การสัมมนาทางเว็บซึ่งจะจัดขึ้นในวันที่ 24 มกราคม

ที่มา: will.com

เพิ่มความคิดเห็น