Tại sao tư nhân bắt buộc phải setgid () cho các nhóm bổ sung


8

Các set*gid()cuộc gọi hệ thống khác nhau đòi hỏi đặc quyền để thay đổi các nhóm trừ một số trường hợp. Thay đổi nhóm chính thành một trong các nhóm bổ sung của quy trình dường như không phải là một trong số chúng có nghĩa là các lệnh newgrp/ sgví dụ cần phải nâng cao các đặc quyền để chuyển đổi nhóm chính.

Có một lý do tại sao setgid()/ setegid()/ setregid()/ setfsgid()không cho phép chuyển sang một nhóm bổ sung mà không có tư nhân? Nếu vậy lý do là gì?


1
Cũng không chắc chắn. Lưu ý rằng bạn có thể chia sẻ tệp cho một trong các nhóm bổ sung của mình, vì vậy nếu bạn có quyền truy cập ghi vào một khu vực không có noexec, nosuid, bạn có thể giải quyết giới hạn đó (bằng cách tạo một bản sao /usr/bin/envvới sự cho phép của setgid).
Stéphane Chazelas

Lệnh newgrp đã thực hiện điều này cho tôi AFAICT nhưng sinh ra một chương trình bên ngoài không phải lúc nào cũng là điều người ta muốn làm.
William Hay

Lưu ý rằng newgrp/sgđề cập đến cơ sở dữ liệu tài khoản, không phải danh sách nhóm bổ sung của quy trình.
Stéphane Chazelas

Nếu gid của bạn không nằm trong danh sách id bổ sung của bạn, thì việc cho phép setgid()sẽ cho phép bạn rời khỏi tư cách thành viên của một nhóm (điều này sẽ gây lo ngại về bảo mật), nhưng một lần nữa bạn cũng có thể làm điều đó với thủ thuật thực thi setgid tương tự như trên, và gid của bạn thường cũng nằm trong danh sách bổ sung của bạn ( initgroups(3)lấy một đối số gid chỉ cho điều đó).
Stéphane Chazelas

Câu trả lời:


3

Tất nhiên, câu đố cơ bản ở đây là kiểm tra quyền hệ thống tập tin dựa trên sự kết hợp giữa (UID hiệu quả và) GID hiệu quả và GID bổ sung. Vì vậy, từ quan điểm kiểm tra quyền truy cập tệp, GID hiệu quả tương đương với GID bổ sung, dẫn đến câu hỏi của OP. (Truyền qua: nếu chúng ta đang nói về Linux, thì thực tế đó là UID / GID của hệ thống tệp được sử dụng trong kiểm tra quyền hệ thống tệp, thay vì UID và GID hiệu quả, nhưng các ID trước hầu như luôn có cùng giá trị như ID sau. )

Vì vậy, phải có một số trường hợp trong đó các GID thực / hiệu quả / được lưu không tương đương với các GID bổ sung. (Tôi nhóm các GID thực / hiệu quả / được lưu lại với nhau, bởi vì các quy tắc cấp phép * gid () thông thường nói rằng một quy trình không có đặc quyền có thể thay đổi bất kỳ một trong các GID đó thành cùng một giá trị như một trong hai quy tắc khác.)

Và thực sự, có một vài trường hợp như vậy. truy cập (2) thực hiện kiểm tra dựa trên ID người dùng và ID nhóm thực của quy trình . Nếu người dùng không có đặc quyền có thể thay đổi ID nhóm thực thành giống như một trong những GID bổ sung không phải là GID được lưu hoặc có hiệu lực, thì hành vi truy cập (2) có thể bị thao túng.

Có những trường hợp khác như vậy. Xem ví dụ về trang man mkdir (2) của Linux . Tùy thuộc vào việc bit chế độ set-GID có được đặt trên thư mục mẹ hay không, một tệp mới được tạo trong thư mục sẽ sở hữu nhóm của nó từ GID hiệu quả của quá trình tạo. Một lần nữa, nếu một quy trình không có đặc quyền có thể thay đổi GID hiệu quả của nó giống như một trong các GID bổ sung của nó, thì nó có thể thao túng quyền sở hữu nhóm của các tệp mới theo những cách không mong muốn. Nhận xét tương tự áp dụng cho mknod (2) và System V IPC gọi semget (2), shmget (2) và Spyget (2).

Ngoài ra còn có một số trường hợp dành riêng cho Linux trong đó các GID thực tế / hiệu quả / được lưu không tương đương với các GID bổ sung. Xem process_vm_readv (2) và prlimit (2), ví dụ.


Lưu ý: @mtk là tác giả của Giao diện lập trình Linux .
Stéphane Chazelas

Các gid hiệu quả xác định quyền sở hữu nhóm của các tập tin mới. Nhưng sau đó, bạn có thể thay đổi nhóm đó thành một trong những gids bổ sung của mình sau đó (và cũng cung cấp bit setgid cho phép quá trình của bạn thực hiện một setgid ()) một cách hiệu quả. Vì vậy, nó có vẻ như một lý do yếu.
Stéphane Chazelas

@ StéphaneChazelas: đồng ý, nó hơi yếu. Trên OTOH, đó là một quá trình gồm hai bước, mà (và tôi đang đến đây) có khả năng cho các cuộc đua kỳ lạ. Nhưng, ngoài trường hợp đó, còn có những cái khác tôi đề cập ở trên. Tôi không biết lý do chính xác nào cho quyết định thiết kế này. Có lẽ đó là quyền truy cập (2), vì đó là một phần cổ xưa của API. Nhiều người khác chỉ đến sau (hoặc cụ thể là Linux) hoặc (tôi đoán) không có mặt trên BSD khi các GID bổ sung được thêm vào. Hoặc, có thể, đó chỉ là về việc bảo tồn hành vi lịch sử; Tôi thấy bạn đã thêm điểm đó như một câu trả lời.
mtk

3

Tôi nghĩ rằng lý do chủ yếu là lịch sử. Các nhóm bổ sung không được thêm vào cho đến 4.2BSD (khoảng năm 1983). Trước đó, bạn chỉ có các uids và gids thực sự và hiệu quả.

Hành vi của setuid / setgid hoàn toàn đối xứng và không có lý do gì để không xảy ra. Bạn sẽ chuyển người dùng với suvà nhóm với sg/ newgrptất cả các tệp thực thi setuid. Thông tin về tư cách thành viên nhóm người dùng chỉ nằm trong cơ sở dữ liệu người dùng, không có trong các thuộc tính của các quy trình.

Và giao diện setuid / setgid không thay đổi khi các bổ sung bổ sung được thêm vào.

Về mặt kỹ thuật bây giờ, nếu bạn có quyền truy cập ghi vào hệ thống tệp (trong đó thực thi và setuid / setgid không bị tắt), bạn vẫn có thể đặt ID người dùng thực hoặc hiệu quả của mình cho bất kỳ gids bổ sung nào của bạn (mà không phải dùng đến sg/ newgrpchỉ btw cho phép thay đổi thành các nhóm được xác định trong cơ sở dữ liệu người dùng, không nhất thiết giống như danh sách các bổ sung của quy trình).

cp /usr/bin/env .
chgrp any-sup-group env
chmod g+s ./env

Và khi thực hiện env, egid của bạn chuyển sang any-sup-group.

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.