ทำไมไม่มี core dump ถูกสร้างขึ้นเมื่อแอพพลิเคชั่นตั้งค่า SUID ไว้?


16

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

ปัญหา:

$ cd /tmp
$ cat /etc/security/limits.conf | grep core
*     -     core     unlimited
root  -     core     unlimited

$ ls -l ohai
-rwsr-sr-x 1 root root 578988 2011-06-23 23:29 ohai

$ ./ohai
...
Floating point exception

$ sudo -i
# ./ohai
...
Floating point exception (core dumped)
# chmod -s ohai
# exit
$ ./ohai
...
Floating point exception (core dumped)

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

mkdir -p /var/coredumps/
chown root:adm /var/coredumps/
chmod 772 /var/coredumps/

echo "kernel.core_pattern = /var/coredumps/core.%u.%e.%p" >> /etc/sysctrl.conf
echo "fs.suid_dumpable = 2" >> /etc/sysctl.conf

echo -e "*\t-\tcore\tunlimited" >> /etc/security/limits.conf
echo -e "root\t-\tcore\tunlimited" >> /etc/security/limits.conf

ตอนนี้สิ่งที่ต้องทำคือเพิ่ม ACL ไปยัง / var / coredumps เพื่อให้ผู้ใช้สามารถเพิ่มไฟล์ได้เท่านั้นและไม่ต้องแก้ไขหรืออ่านไฟล์เหล่านั้นอีกเลย ข้อด้อยเพียงอย่างเดียวคือฉันยังคงมีปัญหากับแอปพลิเคชัน chroot'ed ซึ่งจะต้องมีbind mountหรืออะไรทำนองนั้น

คำตอบ:


21

หน่วยความจำของโปรแกรม setuid อาจมีข้อมูลที่เป็นความลับ ดังนั้นการถ่ายโอนข้อมูลหลักจะต้องอ่านได้โดยรูทเท่านั้น

หากการถ่ายโอนข้อมูลหลักเป็นของ root ฉันไม่เห็นช่องโหว่ความปลอดภัยที่ชัดเจนแม้ว่าเคอร์เนลจะต้องระมัดระวังไม่ให้เขียนทับไฟล์ที่มีอยู่

Linux ปิดใช้งานการถ่ายโอนข้อมูลหลักสำหรับโปรแกรม setxid ในการเปิดใช้งานคุณต้องทำอย่างน้อยที่สุดต่อไปนี้ (ฉันไม่ได้ตรวจสอบว่าเพียงพอแล้ว):

  • เปิดใช้งานทิ้งหลัก setuid ทั่วไปโดยการตั้งค่าfs.suid_dumpablesysctl 2 echo 2 >/proc/sys/fs/suid_dumpableเช่นกับ (หมายเหตุ: 2 ไม่ใช่ 1; 1 หมายถึง“ ฉันกำลังดีบั๊กระบบโดยรวมและต้องการลบการรักษาความปลอดภัยทั้งหมด”)
  • โทรprctl(PR_SET_DUMPABLE, 1)จากโปรแกรม

คุณเป็นฮีโร่ส่วนตัวของฉันแล้ว!
DipSwitch

@DipSwitch Strange นั่นไม่ใช่สิ่งที่เอกสารสำหรับfs.suid_dumpableพูดว่า ลองตั้งค่าfs.suid_dumpableโดยไม่ต้องโทรpctrlในโปรแกรมได้หรือไม่? บางทีฉันอาจเข้าใจผิดเอกสารและคุณได้รับแกน แต่เป็นเจ้าของโดย root ในกรณีนี้
Gilles 'หยุดความชั่วร้าย'

อึอึแย่ ... ไฟล์นี้เป็นเจ้าของโดย root แต่% u (uid) ใน core_pattern กำลังหลอกฉันตั้งแต่แรกเห็น
DipSwitch

วิธีนี้ดูเหมือนจะใช้กับโปรแกรมที่ทำงานภายใต้ "sudo -s" อย่างน้อยก็สำหรับเคอร์เนล 2.6.27
เซทโนเบิล

7

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

จากตัวอย่างด้านบนของคุณดูเหมือนว่าคุณจะได้รับการถ่ายโอนข้อมูลหลักเมื่อทำงานเป็น root หรือถ้าคุณลบการเพิ่มสิทธิ์

ในขณะที่มันอาจจะมีประโยชน์ (สำหรับนักพัฒนาเท่านั้น methinks) เพื่อให้สามารถเข้าถึง coredump จากโปรแกรม setuid มันเป็นหลุมรักษาความปลอดภัยและควรจะอยู่ในสถานที่


1
ฉันเกรงว่าคุณจะพูดอะไรแบบนั้น :(
DipSwitch

0

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

ปัญหา: ไม่ทราบว่าเกิดอะไรขึ้นที่นั่น:

sudo id
Segmentation fault

การแก้ไข: ย้าย suid bit จากsudoไปยังvalgrindทำงานได้ดี:

chmod +s /usr/bin/valgrind
chmod -s /usr/bin/sudo
valgrind /usr/bin/sudo id

หากมีการติดตั้ง debuginfo, backtrace ที่ดีจะถูกเขียนออกมา


และในขณะเดียวกันจนกว่าคุณจะจำได้ว่าจะรีเซ็ตคำอุทานทุกคนและป้าทิลลีสามารถทำvalgrindสิ่งที่พวกเขาต้องการ อย่าทำเช่นนี้มันเป็นความเสี่ยงด้านความปลอดภัยขนาดใหญ่
vonbrand

เฉพาะในเครื่องทดสอบและเพื่อวัตถุประสงค์ในการทดสอบเท่านั้น
Jakuje

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