Bit setuid dường như không có tác dụng đối với bash


14

Tôi đã thử nghiệm một chút và nhận thấy một điều kỳ lạ: đặt bit setuid lên một bản sao của bash nằm ở đó /usr/bin/bash-testdường như không có tác dụng. Khi tôi chạy một phiên bản bash-test, thư mục chính của tôi không được đặt thành /rootvà khi tôi chạy whoamilệnh từ đó bash-test, tên người dùng của tôi không được báo cáo là root, cho thấy rằng nó bash-testkhông chạy bằng root. Tuy nhiên, nếu tôi thiết lập bit setuid whoami, tôi đã được báo cáo là root trong bất kỳ shell nào, như mong đợi.

Tôi cũng đã cố gắng thiết lập bit setuid /usr/bin/bashvà quan sát hành vi tương tự.

Tại sao bash không chạy bằng root khi tôi đặt bit setuid trên nó? Selinux có thể có cái gì đó để làm với điều này?

linux  bash  setuid 

1
bạn tìm thêm thông tin về setuid trong câu hỏi này .
Anthon

Cũng xem Setuid được làm sáng tỏ bởi Chen, Dean và Wagner. Đó là một tờ giấy cũ nhưng nó vẫn được áp dụng.

Câu trả lời:


21

Giải thích là loại khó chịu: bash chính là lý do. stracelà bạn của chúng tôi (phải là gốc SUID để nó hoạt động):

getuid()                                = 1000
getgid()                                = 1001
geteuid()                               = 0
getegid()                               = 1001
setuid(1000)                            = 0
setgid(1001)                            = 0

bash phát hiện ra rằng nó đã được khởi động SUID root (UID! = EUID) và sử dụng sức mạnh gốc của nó để ném sức mạnh này đi, đặt lại EUID thành UID. Và sau này thậm chí là FSUID, chỉ để chắc chắn ...:

getuid()                                = 1000
setfsuid(1000)                          = 1000
getgid()                                = 1001
setfsgid(1001)                          = 1001

Cuối cùng: không có cơ hội. Bạn phải bắt đầu bash với root UID (tức là sudo).

Chỉnh sửa 1

Trang người đàn ông nói điều này:

Nếu shell được bắt đầu với id người dùng (nhóm) hiệu quả không bằng id người dùng thực (nhóm) và tùy chọn -p không được cung cấp, không có tệp khởi động nào được đọc, các hàm shell không được kế thừa từ môi trường, SHELLOPTS Các biến BASHOPTS, CDPATH và GLOBIGNORE, nếu chúng xuất hiện trong môi trường, sẽ bị bỏ qua và id người dùng hiệu quả được đặt thành id người dùng thực. Nếu tùy chọn -p được cung cấp khi gọi, hành vi khởi động là như nhau, nhưng id người dùng hiệu quả không được đặt lại.

Nhưng điều này không làm việc cho tôi. -pthậm chí không được đề cập trong số các tùy chọn khởi động. Tôi cũng đã thử --posix; cũng không làm việc.


2

Trong mọi trường hợp, chương trình gốc SUID không chạy với môi trường của root ( $HOME, cấu hình cho shell, bất cứ thứ gì), nó chạy với quyền hạn gốc (nghĩa là nó có thể xóa bất kỳ tệp nào, thay đổi bất kỳ quyền nào, v.v.).

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.