ความสามารถในการใช้งานในสคริปต์โดยไม่ต้อง setcap'ing ล่ามไบนารี?


14

ตอนนี้ฉันกำลังใช้cap_net_bind_service MY_USERNAMEใน /etc/security/capability.conf
ตอนนี้ผมก็ต้องชุดcap_net_bind_service+iล่ามภาษาสคริปต์ที่ชื่นชอบเพื่อให้สามารถที่จะเพิ่มCAP_NET_BIND_SERVICEไปที่มีประสิทธิภาพชุดผ่าน libcap [-ng]

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

คำตอบ:


4

โดยปกติแล้วความสามารถนั้นได้รับมาจากเด็ก ๆ ตามที่ระบุไว้ในmanpage :

เด็กที่สร้างผ่าน fork (2) สืบทอดสำเนาของชุดความสามารถของผู้ปกครอง

ปัญหาของสคริปต์คือไฟล์เหล่านั้นไม่ใช่ไฟล์เรียกทำงานโดยตรง เคอร์เนลต้องผ่านรายการตรวจสอบ (รหัสเคอร์เนลอยู่ที่ fs / binfmt _ *. c) หนึ่งในนั้นคือ "binfmt_script.c" ที่ตรวจสอบบรรทัดแรกสำหรับ shebang จากนั้นเรียกล่ามตัวจริง (ตัวแปลที่แท้จริงใน shebang) โดยใช้สคริปต์ของคุณเป็นอาร์กิวเมนต์ ดังนั้นจึงมีการเรียกใช้ล่ามมาตรฐาน / ทั่วไปและอ่านสคริปต์ของคุณเป็นอาร์กิวเมนต์

หมายความว่าคุณจะต้องตั้งค่าความสามารถของล่ามไม่ใช่ในสคริปต์ สิ่งเดียวกันนี้ใช้กับsuidบิตและแฟล็กพิเศษอื่น ๆ

ดังนั้นไม่ว่าคุณจะทำสำเนาล่ามของคุณตั้งค่าความสามารถที่คุณต้องการ (เช่นตรวจสอบว่าไม่มีใครสามารถเข้าถึงมันผ่าน chmod / chown) และเรียกล่ามที่คัดลอกมานี้ใน shebang ของคุณ คุณอาจทำตรรกะ setcap ในสคริปต์ของคุณ


ตกลงไม่เห็นคำถามที่ถามเมื่อ 2 ปีที่แล้ว แต่ไม่เคยปิด ... นอกจากนี้ดูเหมือนว่าซ้ำกันของunix.stackexchange.com/questions/87348/…
Adrien M.

แต่เท่านั้นi(สืบทอด), รับ exec ที่ผ่านมา และiไม่ทำสิ่งใดในตัวมันเองมันจะทำงานได้ก็ต่อเมื่อไฟล์นั้นมีการจับคู่iและฉันก็eบิต (ที่มีประสิทธิภาพ) (ยกเว้นว่าสคริปต์ / ไฟล์ที่เรียกใช้งานได้จะตั้งค่านั้น) มันซับซ้อนยิ่งกว่าที่ setuid นี่ไม่ใช่เอฟเฟกต์สคริปต์
ctrl-alt-delor

1
ฉันคิดว่า Shebang ถูกอ่านโดยเคอร์เนลไม่ใช่เปลือก? ( stackoverflow.com/questions/3009192/how-does-the-shebang-work/… )
Philip Couling

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