ทำไม setuid ไม่สามารถใช้งานกับไฟล์ที่เรียกทำงานได้?


9

ฉันรู้ว่าการเปิดใช้งาน setuid กับสคริปต์มีปัญหาด้านความปลอดภัยและดังนั้นจึงไม่ได้ใช้งานเป็นค่าเริ่มต้น แต่คาดว่าจะใช้งานได้สำหรับไฟล์ปฏิบัติการ ฉันสร้างและปฏิบัติการซึ่งแสดง uid เป็นคำสั่งต่อไปนี้อธิบายไว้ในโพสต์นี้: อนุญาต setuid ในสคริปต์เชลล์

แต่มันกลับ uid เดียวกัน (1000) sudo chmod +s ./setuid-testทั้งก่อนและหลังการทำงาน ฉันคิดว่านี่หมายความว่า setuid ไม่มีผลกระทบใด ๆ ต่อการปฏิบัติการของฉันทำไมและวิธีการแก้ปัญหา?

รหัสแหล่งที่มา:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

สร้างและเรียกใช้ด้วย

$ gcc -o setuid-test setuid-test.c
$ ./setuid-test
1000
$ sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
$ ./setuid-test
1000

เมื่อทำงานls -laนี่คือสิ่งที่ฉันได้รับ:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test

2
ผู้ใช้อื่นเป็นเจ้าของไฟล์ที่เรียกใช้งานได้ซึ่งไม่ใช่แบบที่คุณใช้อยู่หรือไม่? (setuid ไม่ได้หมายถึงการเปลี่ยนเป็นรูทมันหมายถึงการเปลี่ยนผู้ใช้ที่เป็นเจ้าของไฟล์ปฏิบัติการ)
cjm

PHPLearner ฉันคิดว่าคุณต้องเกี่ยวข้องกับกลุ่ม / ผู้ใช้เพื่อเปลี่ยน SUID ของไฟล์
ryekayo

@cjm me@me:~$ ls -la setuid-test---- ส่งคืน -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP Learner

7
โปรแกรมของคุณทำงานได้ตามที่คาดหวังในระบบ Ubuntu 14.04 ของฉันถ้ามันอยู่ในโฮมไดเร็กตอรี่ของฉัน, แต่ไม่ใช่เมื่ออยู่ใน / tmp, เพราะพารามิเตอร์ที่ใช้ในการ mount / tmp ห้ามโปรแกรม setuid โปรแกรมของคุณอยู่ที่ไหน
Mark Plotnick

2
พิมพ์ในไดเรกทอรีที่จะหาจุดติดแล้วdf . mount | grep nameofmountpointมีnosuidธงที่ระบุไว้ที่นั่นหรือไม่?
Mark Plotnick

คำตอบ:


10

ระบบไฟล์ส่วนใหญ่ที่ออกแบบมาสำหรับ Unix / Linux สามารถติดตั้งด้วยnosuidแอ็ตทริบิวต์ซึ่งจะป้องกัน setuid หรือ setgid ไบนารีที่อยู่บนระบบไฟล์เหล่านั้นจากการแก้ไข uid ที่มีประสิทธิภาพหรือ gid ของกระบวนการ มักใช้เมื่อติดตั้งระบบไฟล์ "ไม่น่าเชื่อถือ" ซึ่งอยู่ภายใต้การควบคุมของผู้ที่ไม่ใช่ผู้ดูแลระบบ

ในกรณีของคุณระบบไฟล์ที่คุณใช้คือประเภท ecryptfs ซึ่งเป็นไปตามaskubuntu: ข้อผิดพลาดเมื่อรันไบนารีด้วย root setuid ภายใต้โฮมไดเร็กตอรี่ที่เข้ารหัสเข้ารหัสบังคับให้ nosuid (และ nodev) โดยอัตโนมัติเริ่มจากเวอร์ชันเมื่อสองสามปีก่อน

นี่คือคำอธิบายสาเหตุของการเปลี่ยนแปลงจากhttps://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409 :

Vincent Danen 2012-07-20 11:25:56 EDT
มีรายงานว่าผู้ช่วยส่วนตัวการเข้ารหัส ecryptfs (/sbin/mount.ecryptfs_private) ซึ่งเป็น setuid-root สามารถอนุญาตให้ผู้ใช้ในท้องถิ่นที่ไม่มีสิทธิ์ได้รับการแชร์การเข้ารหัส ecrypt ที่ผู้ใช้ควบคุม บนระบบโลคัล เนื่องจากผู้ช่วย ecryptfs ไม่เมาท์ระบบไฟล์ด้วยแฟล็ก "nosuid" และ "nodev" จึงเป็นไปได้ที่ผู้ใช้จะเมานต์ระบบไฟล์ที่มีไบนารี setuid-root และ / หรือไฟล์อุปกรณ์ที่อาจนำไปสู่การเพิ่มสิทธิ์ของพวกเขา สิ่งนี้สามารถทำได้ผ่านอุปกรณ์ USB หากผู้ใช้มีการเข้าถึงระบบจริง
...
บังคับให้เพิ่มค่าสถานะการเมานต์ MS_NOSUID และ MS_NODEV ให้เป็นเวอร์ชัน 99


หากระบบอนุญาตให้ผู้ใช้เมานต์ระบบไฟล์ที่อนุญาตให้ setuid ระบบจะกลายเป็นรูทเล็กน้อย 1) สร้างปฏิบัติการ 2) อื่น ๆchown root, chmod +s3) ติดมัน 4) เรียกใช้ปฏิบัติการ
Ctrl-Alt-Delor

1

SetUID บิตในการเรียกใช้งานอนุญาตให้เรียกใช้งานได้ที่เจ้าของไฟล์(ไม่ใช่ superuser) เพื่อให้สามารถรัน executable ในฐานะ root ให้ดำเนินการ:

sudo chown 0:0 ./setuid-test

แน่นอน แต่นั่นไม่ใช่ปัญหา เป็นไปได้ที่จะมีโปรแกรมที่กำหนดให้ผู้ใช้อื่นนอกเหนือจากรูท ในสถานการณ์ในคำถามsetuid-testควรแสดงnobodyUID ของ
Gilles 'หยุดชั่วร้าย'

@Gilles คุณถูกต้อง ฉันคาดหวังว่าการทดสอบ setuid จะแสดงnobodyไม่ใช่root
PHP Learner

"SetUID บิตในการเรียกใช้งานอนุญาตให้เรียกใช้งานได้ที่เจ้าของไฟล์" และเจ้าของไฟล์ของฉันคือnobodyดังนั้นฉันคาดหวัง65534ผลตอบแทน แต่ฉันเห็น1000ใครก็ตามที่เป็นเจ้าของ!
ผู้เรียน PHP

2
ตรวจสอบตัวเลือกการเมานต์ของระบบไฟล์ที่โปรแกรมทดสอบของคุณทำงาน หากติดตั้งไว้แสดงnosuidว่าโปรแกรมของคุณไม่สามารถทำงานได้
ตอบโต้

1
@countermode @MarkPlotnick mount | grep /home/meส่งคืน /home/me/.Private on /home/me type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=xxx,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=0123456789abcdef,ecryptfs_fnek_sig=fedcba9876543210)
ผู้เรียน PHP
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.