Quá trình siêu người dùng có thể thay đổi ID người dùng thực và ID nhóm của một quy trình, không khớp với những người trong tệp mật khẩu không?


11

Từ APUE

ID người dùng thực và ID nhóm thực của một quá trình xác định chúng ta thực sự là ai. Hai trường này được lấy từ mục nhập mật khẩu của chúng tôi khi chúng tôi đăng nhập. Thông thường, các giá trị này không thay đổi trong phiên đăng nhập, mặc dù có nhiều cách để quy trình siêu người dùng thay đổi chúng

Quá trình siêu người dùng có thể thay đổi ID người dùng thực và ID nhóm thực của một quy trình, sao cho mối quan hệ giữa ID người dùng thực và ID nhóm thực không khớp với những người trong tệp mật khẩu? Ví dụ, nếu người sử dụng Timkhông phải là một thành viên của nhóm oceancho mỗi tập tin mật khẩu, một quá trình superuser có thể thay đổi ID người dùng thực và ID nhóm thực sự của một quá trình được Timoceantương ứng?


5
Một điều rõ ràng quan trọng ở đây: một quy trình chạy với các đặc quyền siêu người dùng có khả năng thay đổi UID và GID của chính nó , chứ không phải các quy trình khác.
filbranden


Cơ sở dữ liệu thông tin người dùng hoàn toàn là người dùng. Kernel chỉ quan tâm đến UID và GID, không phải cơ sở dữ liệu người dùng hoặc nhóm.
炸鱼 薯条

Câu trả lời:


15

Có, một quy trình siêu người dùng có thể thay đổi ID người dùng thực và ID nhóm thực của nó thành bất kỳ giá trị nào mà nó mong muốn. Các giá trị trong /etc/passwd/etc/shadowlà cấu hình cho những giá trị nào sẽ được đặt, nhưng không giới hạn các giá trị có thể.

Chỉnh sửa số 1

Nó có nghĩa là các chương trình như loginsẽ đọc các giá trị từ các tệp, vì vậy các tệp là tệp cấu hình hoặc tệp đầu vào. Họ không bị ràng buộc về những gì một chương trình có thể làm. Một quá trình siêu người dùng có thể chuyển bất kỳ giá trị nào cho kernel và kernel sẽ không kiểm tra bất kỳ tập tin nào.

Một chương trình có thể gọi

setgid (54321);
setuid (12345);

và điều này sẽ hoạt động, ngay cả khi không có id nào được đề cập trong bất kỳ tệp nào.


9

Tệp mật khẩu và tệp nhóm không được đọc, chúng chỉ được đọc bởi quá trình đăng nhập, để đặt id người dùng thực và id nhóm thực.

Không có gì trong kernel đề cập đến các tập tin này. Đăng nhập phải mở các tệp, xử lý chúng và đặt hai ID. Nó có thể được viết khác nhau để có được những ID này từ một nơi khác. Ví dụ từ một cơ sở dữ liệu nối mạng.

Bất kỳ quy trình nào có khả năng CAP_SETUID đều có thể đặt các ID này, root có khả năng này.

Mô hình bảo mật trong Unix, là một phần được triển khai trong kernel và một phần được triển khai trong tiến trình chạy với các khả năng nâng cao (ví dụ như root).


Lưu ý rằng /etc/passwd/etc/groupcũng được đọc bởi ls, psvà bất kỳ chương trình nào khác cần dịch tên người dùng / nhóm sang / từ ID người dùng / nhóm. (Họ có thể thực hiện việc này thông qua một thư viện, hơn là biết về các phương pháp lưu trữ các chi tiết này.)


1
Chúng ( /etc/passwd, /etc/groups) cũng được đọc bởi các quy trình muốn hiển thị hoặc xử lý tên người dùng thay vì ID số bên trong, ví dụ psls.
Jonas Schäfer

3

Trong số những thứ khác, mục đích của /etc/passwdviệc dịch tên người dùng sang UID của người dùng . Nếu bạn không quan tâm UID của bob là gì, bạn không cần tệp đó. Nếu bạn chỉ muốn thay đổi thành UID / GID tùy ý, hãy sử dụng các tòa nhà có liên quan:

int setuid(uid_t uid);
int setgid(gid_t gid);

Lưu ý rằng một quy trình đặc quyền với CAP_SETUIDvà các CAP_SETGID khả năng (mà quy trình gốc thường có) chỉ có thể thay đổi UID và GID của chính nó, chứ không phải quy trình chạy khác.

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.