ฉันจะใช้ capsh ได้อย่างไร: ฉันกำลังพยายามเรียกใช้ ping ที่ไม่มีสิทธิพิเศษด้วยความสามารถที่น้อยที่สุด


13

ฉันกำลังทดลองกับความสามารถบน Debian Gnu / Linux

ฉันได้คัดลอก / bin / ping ไปยังไดเรกทอรีการทำงานปัจจุบันของฉัน ตามที่คาดไว้มันไม่ทำงาน แต่เดิมเป็น setuid root

จากนั้นฉันก็ให้ความสามารถในการ ping น้อยที่สุด (ไม่ใช่รูท) ด้วยการทำsudo /sbin/setcap cap_net_raw=ep ./pingและการ ping ของฉันก็เป็นไปตามที่คาดไว้

จากนั้นsudo /sbin/setcap -r ./pingให้ยกเลิกความสามารถนั้น ตอนนี้ไม่ทำงานตามที่คาดไว้

ตอนนี้ผมพยายามที่จะได้รับการทำงาน ping capshใช้

capsh ไม่มีสิทธิ์ดังนั้นฉันต้องเรียกใช้เป็นรูท แต่จากนั้นดร็อปรูทและใช้สิทธิ์อื่น ๆ ทั้งหมด

ฉันคิดว่าฉันต้องการsecure-keep-capsเช่นกันนี่ไม่ได้จัดทำเป็นเอกสารcapshแต่อยู่ในคู่มือความสามารถ /usr/include/linux/securebits.hผมได้หมายเลขบิตจาก ดูเหมือนว่าถูกต้องเนื่องจากผลลัพธ์ของการ--printแสดงบิตเหล่านี้จะถูกต้อง

ฉันเล่นซอเป็นเวลาหลายชั่วโมงจนฉันมีสิ่งนี้

sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"

อย่างไรก็ตามpingข้อผิดพลาดด้วยping: icmp open socket: Operation not permittedนี่คือสิ่งที่เกิดขึ้นเมื่อไม่มีความสามารถ นอกจากนี้ยังมี--printการแสดงนี้ไม่พอเราต้องCurrent: =p cap_net_raw+ie

sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"จะกำหนดความสามารถในการCurrent: = cap_net_raw+eipนี้ถูกต้อง rootแต่ใบเราเป็น

แก้ไข-1

ฉันได้ลองแล้ว sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"

สิ่งนี้ผลิต:

touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted

ข้อผิดพลาดแรกคาดว่าเป็นsecure-noroot: yes แต่ที่สองไม่ได้Current: = cap_net_raw+eip

แก้ไข-2

ถ้าฉันใส่ไว้==ก่อนหน้า--printตอนนี้ก็จะปรากฏCurrent: = cap_net_raw+iขึ้นเพื่ออธิบายข้อผิดพลาดก่อนหน้านี้ แต่ไม่ใช่ว่าทำไมเราถึงสูญเสียความสามารถเมื่อเปลี่ยนจากรูทฉันก็secure-keep-capsควรแก้ไขมัน

แก้ไข-3

จากสิ่งที่ฉันเห็นฉันสูญเสียประสิทธิผล (e) และได้รับอนุญาต (p) เมื่อเรียกใช้ exec สิ่งนี้คาดว่าจะเกิดขึ้น แต่ฉันคิดว่าการรักษาความปลอดภัยควรปิดกั้นการสูญหาย ฉันพลาดอะไรไปรึเปล่า.

แก้ไข-4

ฉันทำการค้นคว้าเพิ่มเติมและอ่านคู่มืออีกครั้ง ดูเหมือนว่าปกติeและpความสามารถจะหายไปเมื่อ: คุณเปลี่ยนจากผู้ใช้root(หรือนำไปใช้secure-norootทำให้ผู้ใช้รูทปกติ) สิ่งนี้สามารถแทนที่ได้ด้วยsecure-keep-caps; เมื่อคุณโทรexecมาฉันจะบอกได้ว่านี่เป็นค่าคงที่

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

ดังนั้นตอนนี้คำถามของฉันคือสิ่งที่ฉันขาดหายไปมีcapshไว้เพื่ออะไร

แก้ไข-5

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


รุ่น:

  • capshจากlibcap2-binเวอร์ชันแพ็คเกจ1:2.22-1.2
  • ก่อนที่จะแก้ไข-3 ผมคว้าล่าสุดcapshจากgit://git.debian.org/collab-maint/libcap2.gitและเริ่มใช้มัน
  • uname -a Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux ผู้ใช้ที่ดินคือ 32 บิต

1
คุณลองใช้ตัวอย่างของ Lekensteyn ด้วยการปล่อยอัปสตรีมในภายหลังหรือไม่? การได้รับcapshจาก repo ที่ดูแลรักษาร่วมกันจะไม่ให้“ ล่าสุด” แก่คุณcapshแพ็คเกจ Debian ยังไม่รองรับความสามารถรอบข้าง ต้นน้ำ 2.27 ทำ
Stephen Kitt

1
@StephenKitt ดีที่จะรู้ แต่คำถามเดิมคือสิ่งที่ใช้คือcapshในกรณีที่ไม่มีสภาพแวดล้อม (เหมือนเดิม) ฉันกำลังคิดถึงอะไร มันต้องมีประโยชน์
ctrl-alt-delor

คำตอบ:


11

ความสามารถเป็นคุณสมบัติของกระบวนการ ตามเนื้อผ้ามีสามชุด:

  • ความสามารถที่อนุญาต ( p ): ความสามารถที่อาจ "เปิดใช้งาน" ในกระบวนการปัจจุบัน
  • ความสามารถที่มีประสิทธิภาพ ( e ): ความสามารถที่สามารถใช้งานได้ในกระบวนการปัจจุบัน
  • ความสามารถในการสืบทอด ( i ): ความสามารถของไฟล์ที่อาจได้รับการสืบทอด

โปรแกรมที่ทำงานในฐานะรูทมักมีความสามารถที่ได้รับอนุญาตและมีประสิทธิภาพอย่างเต็มที่ดังนั้น "การเพิ่ม" ความสามารถเพิ่มเติมจึงไม่มีผลกระทบที่สังเกตได้ (ชุดความสามารถในการสืบทอดได้ปกติจะว่างเปล่า) เมื่อsetcap cap_net_raw+ep pingคุณเปิดใช้งานความสามารถเหล่านี้โดยค่าเริ่มต้นสำหรับผู้ใช้ที่รันโปรแกรมนี้

น่าเสียดายที่ความสามารถเหล่านี้ถูกผูกไว้กับไฟล์ที่เรียกใช้งานและจะไม่ถูกเก็บไว้หลังจากดำเนินการกับกระบวนการลูกใหม่ Linux 4.3 เปิดใช้งานความสามารถของ Ambientซึ่งอนุญาตให้ความสามารถนั้นสืบทอดโดยกระบวนการลูก (ดูการเปลี่ยนความสามารถในช่วง execve ()ในความสามารถ (7) )

ขณะเล่นด้วยความสามารถโปรดทราบข้อผิดพลาดเหล่านี้:

  • เมื่อเปลี่ยนผู้ใช้จากรูทเป็นไม่ใช่รูทความสามารถที่มีประสิทธิภาพและได้รับอนุญาตจะถูกล้างออก (ดูผลของการเปลี่ยน ID ผู้ใช้ต่อความสามารถในความสามารถ (7) ) คุณสามารถใช้--keep=1ตัวเลือกของcapshเพื่อหลีกเลี่ยงการล้างชุด
  • ชุดความสามารถในการทำงานโดยรอบจะถูกลบทิ้งเมื่อเปลี่ยนผู้ใช้หรือ ID กลุ่ม โซลูชัน: เพิ่มความสามารถรอบข้างหลังจากเปลี่ยน ID ผู้ใช้ แต่ก่อนดำเนินการกระบวนการย่อย
  • สามารถเพิ่มความสามารถให้กับความสามารถรอบข้างที่ตั้งไว้หากมีอยู่ในทั้งความสามารถที่ได้รับอนุญาตและที่สืบทอดได้

capshโปรแกรมจาก libcap 2.25 ไม่ได้มีความสามารถในการปรับเปลี่ยนความสามารถรอบ แต่รุ่นต่อมาเพิ่มตัวเลือกใหม่ โปรดทราบว่าการสั่งซื้อตัวเลือกมีความสำคัญ ตัวอย่างการใช้งาน:

sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \
    --keep=1 --user=nobody --addamb=cap_net_raw -- \
    -c "./ping -c1 127.0.0.1"

เคล็ดลับ: คุณสามารถเพิ่ม--printตัวเลือกได้ทุกที่ในcapshบรรทัดคำสั่งและดูสถานะความสามารถปัจจุบัน

หมายเหตุ: cap_setpcapจำเป็นสำหรับ--addambในขณะที่cap_setuid,cap_setgidจำเป็นสำหรับ--userตัวเลือก


6

คำตอบของ Lekensteyn นั้นถูกต้องและครบถ้วน แต่ฉันจะพยายามให้คำอธิบายอีกมุมมองที่แตกต่างกันซึ่งจะพยายามเน้นปัญหาที่ความสามารถรอบข้างตั้งขึ้น

เมื่อคุณเรียกใช้sudo capsh --user=<some_user> --มีการเรียกใช้ระบบที่น่าสนใจ 2 ระบบที่ทำให้ความสามารถในการคำนวณใหม่ (และอาจลดลง):

  1. setuid: ตามman capabilities:

SECBIT_KEEP_CAPS การตั้งค่าสถานะนี้อนุญาตเธรดที่มีอย่างน้อยหนึ่ง 0 UIDs เพื่อรักษาความสามารถเมื่อมันสลับ UID ทั้งหมดของมันเป็นค่าที่ไม่ใช่ศูนย์ หากไม่ได้ตั้งค่าสถานะนี้ดังนั้น UIDswitch จะทำให้เธรดสูญเสียความสามารถทั้งหมด

กล่าวอีกนัยหนึ่งในcapshคำสั่งของเราด้านบนเราต้องแน่ใจว่า SECBIT_KEEP_CAPS ถูกตั้งค่าในระหว่างการsetuidเรียกระบบ มิฉะนั้นความสามารถทั้งหมดจะหายไป นี่คือสิ่งที่--keep=1จะทำ ดังนั้นตอนนี้คำสั่งจะกลายเป็นsudo capsh --user=<some_user> --keep=1 --

  1. execve: ถ้าเราใช้--keep=1ตัวเลือกชุดความสามารถทั้งหมด (มีประสิทธิภาพได้รับอนุญาตสืบทอดได้) จะถูกเก็บไว้จนกระทั่งการexecveเรียกใช้ระบบ แต่execveจะทำให้ความสามารถในการคำนวณใหม่ (สำหรับผู้ใช้ที่ไม่ใช่รูท) เช่นกันและในลักษณะที่ไม่ชัดเจน กล่าวโดยย่อก่อนที่จะมีการเพิ่มความสามารถรอบข้างสำหรับความสามารถในการตั้งค่า "อนุญาต" ของเธรดหลังจากการexecveโทร:

    • ไฟล์ต้องมีความสามารถที่ใน "อนุญาต" ชุด setcap cap_net_raw+p /bin/bashซึ่งสามารถทำได้ด้วย การทำเช่นนี้จะทำให้การออกกำลังกายทั้งหมดไร้ประโยชน์เนื่องจากชุดความสามารถของเธรด (นอกเหนือจากชุดขอบเขต) ไม่มีผลกระทบใด ๆ อีกต่อไป
    • ทั้งไฟล์และด้ายจะต้องมีความสามารถที่พวกเขาในชุด "สืบทอด" คุณอาจคิดว่าsetcap cap_net_raw+iมันจะใช้กลอุบาย แต่ปรากฎว่าexecveเป็นสาเหตุที่ทำให้สิทธิ์การสืบทอดของเธรดลดลงเมื่อถูกเรียกโดยผู้ใช้ที่ไม่มีสิทธิพิเศษ (ซึ่งปัจจุบันเราขอขอบคุณsetuid) ดังนั้นจึงไม่มีวิธีที่จะตอบสนองเงื่อนไขนี้ในฐานะผู้ใช้ที่ไม่มีสิทธิได้

ความสามารถรอบข้างที่นำมาใช้ใน Linux 4.3 ช่วยให้เธรดสามารถคงความสามารถไว้แม้หลังจากsetuidผู้ใช้ที่ไม่มีสิทธิพิเศษตามมาด้วยexecveแล้วโดยไม่ต้องพึ่งพาความสามารถของไฟล์


2

อาจมีข้อบกพร่อง / คุณสมบัติในเคอร์เนล มีการอภิปรายกันบ้าง:

ฉันไม่มีความคิดหากมีสิ่งใดเกิดขึ้นเพื่อแก้ไข

อย่าเข้าใจฉันผิด - พฤติกรรมปัจจุบันปลอดภัย แต่มันก็ปลอดภัยที่ได้รับในทางของสิ่งที่ควรจะทำงาน

แก้ไข: ตามhttp://man7.org/linux/man-pages/man7/capabilities.7.htmlมีความสามารถใหม่ที่ตั้งค่า Ambient (ตั้งแต่ Linux 4.3) ดูเหมือนว่าจะอนุญาตสิ่งที่จำเป็น

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