Tại sao setuid không hoạt động trên thực thi?


9

Tôi biết rằng việc bật setuid trên các tập lệnh có vấn đề bảo mật và do đó không hoạt động theo mặc định, nhưng mong rằng nó hoạt động cho các tệp thực thi. Tôi đã tạo và thực thi để hiển thị uid như một đầu ra theo hướng dẫn được mô tả trong bài viết này: Cho phép setuid trên các tập lệnh shell

Nhưng nó trả về cùng một uid (1000) cả trước và sau khi chạy sudo chmod +s ./setuid-test. Tôi nghĩ điều này có nghĩa là setuid không có bất kỳ ảnh hưởng nào đến khả năng thực thi của tôi, tại sao và làm thế nào để giải quyết?

Mã nguồn:

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

Được xây dựng và chạy với

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

Khi chạy ls -la, đây là những gì tôi nhận được:

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

2
Là tệp thực thi thuộc sở hữu của người dùng không phải là người bạn đang chạy nó? (setuid không có nghĩa là thay đổi thành root; nó có nghĩa là thay đổi người dùng sở hữu tệp thực thi.)
cjm

PHPLearner Tôi nghĩ rằng bạn cần liên quan đến một nhóm / người dùng để thay đổi SUID của một tệp
ryekayo

@cjm me@me:~$ ls -la setuid-test---- trả về -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
Học viên PHP

7
Chương trình của bạn hoạt động như mong đợi trên hệ thống Ubuntu 14.04 của tôi nếu nó nằm trong thư mục chính của tôi, nhưng không phải khi nó ở / tmp, vì các tham số được sử dụng để gắn kết / tmp cấm các chương trình setuid. Chương trình của bạn nằm ở đâu?
Đánh dấu Plotnick

2
Nhập df .vào thư mục để tìm điểm gắn kết, sau đó mount | grep nameofmountpoint. Có một nosuidlá cờ được liệt kê ở đó?
Đánh dấu Plotnick

Câu trả lời:


10

Hầu hết các hệ thống tệp được thiết kế cho Unix / Linux đều có thể được gắn với một nosuidthuộc tính, điều này sẽ ngăn các nhị phân setuid hoặc setgid nằm trên các hệ thống tệp đó thay đổi uid hoặc gid hiệu quả của một tiến trình. Nó thường được sử dụng khi gắn các hệ thống tập tin "không đáng tin cậy", những hệ thống nằm dưới sự kiểm soát của người không phải là quản trị viên.

Trong trường hợp của bạn, hệ thống tập tin bạn đang sử dụng là loại ecryptfs, theo yêu cầu của Ubuntu: Lỗi khi chạy nhị phân với root setuid trong thư mục nhà được mã hóa sẽ tự động thực thi nosuid (và gật đầu), bắt đầu với các phiên bản từ vài năm trước.

Dưới đây là mô tả về lý do của sự thay đổi, từ https://ormszilla.redhat.com/show_orms.cgi?id=CVE-2012-3409 :

Vincent Danen 2012-07-20 11:25:56 EDT
Người ta đã báo cáo rằng trình trợ giúp gắn kết mã hóa riêng tư (/sbin/mount.ecryptfs_private), được thiết lập gốc, có thể cho phép người dùng địa phương không có quyền truy cập để chia sẻ cổ phiếu ecryptfs do người dùng kiểm soát trên hệ thống địa phương. Vì trình trợ giúp ecryptfs không gắn hệ thống tệp với cờ "nosuid" và "gật đầu", nên người dùng có thể gắn hệ thống tệp chứa tệp nhị phân gốc và / hoặc tệp thiết bị có thể dẫn đến sự leo thang của các đặc quyền của họ. Điều này có thể được thực hiện thông qua một thiết bị USB, nếu người dùng có quyền truy cập vật lý vào hệ thống.
...
Buộc các cờ gắn MS_NOSUID và MS_NODEV đã được thêm vào phiên bản 99.


Nếu hệ thống cho phép người dùng gắn kết một hệ thống tệp cho phép setuid, thì nó sẽ không đáng kể để trở thành root. 1) tạo một thực thi 2) ở nơi khác chown root, chmod +s3) gắn kết nó 4) chạy thực thi
ctrl-alt-delor

1

Bit setUID trên tệp thực thi cho phép chạy thực thi tại chủ sở hữu tệp (không phải siêu người dùng). Để có thể chạy thực thi như root, hãy thực thi:

sudo chown 0:0 ./setuid-test

Chắc chắn, nhưng đó không phải là vấn đề. Có thể có một chương trình được thiết lập cho người dùng khác ngoài root. Trong kịch bản trong câu hỏi, setuid-testnên hiển thị nobodyUID.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Bạn nói đúng. Tôi hy vọng rằng màn hình thử nghiệm setuid nobody, chứ không phảiroot
Học viên PHP

"Bit setUID trên tệp thực thi cho phép chạy thực thi tại chủ sở hữu tệp" và chủ sở hữu tệp của tôi là nobody, do đó tôi mong đợi được 65534trả lại, nhưng tôi thấy 1000bất cứ ai là chủ sở hữu!
Học viên PHP

2
Kiểm tra các tùy chọn gắn kết của hệ thống tập tin mà chương trình thử nghiệm của bạn chạy. Nếu nó được gắn kết nosuid, thì chương trình của bạn không thể hoạt động.
phản ứng

1
@countmode @MarkPlotnick mount | grep /home/metrả về /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)
Học viên PHP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.