สวัสดีทุกคน. เรากำลังเริ่มทำงานอย่างแข็งขันและกำลังเตรียมการเปิดตัวอันทรงพลังมากมายในเดือนมกราคม เหนือสิ่งอื่นใด มีการประกาศการลงทะเบียนสำหรับหลักสูตรใหม่ที่ทุกคนชื่นชอบ
การอนุญาตไฟล์เป็นทางเลือกที่ปลอดภัยสำหรับไฟล์ปฏิบัติการ 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
เพื่อบังคับให้ไลบรารีของตนถูกเรียกตามการตั้งค่าของระบบและดังนั้นจึงมีรหัสที่กำหนดเองของตัวเองดำเนินการด้วยสิทธิ์เช่นเดียวกับแอปพลิเคชันที่เรียก
นั่นคือทั้งหมดที่ ดูรายละเอียดโปรแกรมหลักสูตรเพิ่มเติมได้ที่
ที่มา: will.com