Sự khác biệt giữa id người dùng thực và hiệu quả được tạo bởi vì bạn có thể cần phải tạm thời nhận dạng danh tính của người dùng khác (hầu hết thời gian, sẽ là root
, nhưng có thể là bất kỳ người dùng nào). Nếu bạn chỉ có một id người dùng, thì sẽ không có cách nào thay đổi lại id người dùng ban đầu của bạn sau đó (trừ việc sử dụng từ của bạn, và trong trường hợp bạn là root
, sử dụng đặc quyền của root
để thay đổi thành người dùng bất kỳ) . Vì vậy, id người dùng thực sự là người bạn thực sự (người sở hữu quy trình) và id người dùng hiệu quả là hệ điều hành xem xét quyết định liệu bạn có được phép làm điều gì đó hay không (hầu hết thời gian, có một số ngoại lệ).
Khi bạn đăng nhập, shell đăng nhập đặt cả id người dùng thực và hiệu quả vào cùng một giá trị (id người dùng thực) của bạn như được cung cấp bởi tệp mật khẩu.
Bây giờ, nó cũng xảy ra mà bạn thực hiện một chương trình setuid, vả lại chạy như một người dùng khác (ví dụ root
) chương trình setuid là cũng phải làm một cái gì đó thay cho bạn. Cái này hoạt động ra sao?
Sau khi thực hiện chương trình setuid, nó sẽ có id thực của bạn (vì bạn là chủ sở hữu quy trình) và id người dùng có hiệu lực của chủ sở hữu tệp (ví dụ root
) vì nó được thiết lập.
Chương trình thực hiện bất kỳ phép thuật nào cần thực hiện với đặc quyền superuser và sau đó muốn thực hiện điều gì đó nhân danh bạn. Điều đó có nghĩa là, cố gắng làm điều gì đó mà bạn không nên làm sẽ không thành công. sao làm được vậy? Vâng, rõ ràng bằng cách thay đổi id người dùng hiệu quả của nó thành id người dùng thực sự!
Hiện tại chương trình setuid không có cách nào để chuyển đổi vì tất cả hạt nhân biết là id của bạn và ... id của bạn. Bang, bạn đã chết.
Đây là những gì mà id người dùng đã đặt được lưu.
FYI - cũng có id người dùng hệ thống tệp, như được nêu trên trang Wikipedia: https://en.wikipedia.org/wiki/User_identifier –