Tại sao một người dùng bình thường `chown` một tập tin?


75

Tại sao chownlệnh chỉ có gốc? Tại sao người dùng không phải root không sử dụng chown để cho đi các tệp mà họ sở hữu?


Không thể hiểu lệnh chown câu hỏi của bạn cũng có thể được sử dụng bởi người dùng không phải root
harish.venkat

Có lẽ tôi đặt nó sai. Vâng, câu hỏi chính xác của proffesor của tôi là: "Tại sao việc chuyển quyền từ người dùng bình thường không được phép trong các hệ thống UNIX?" ...
phleg

19
Tôi nghĩ rằng câu hỏi thực sự là: tại sao người dùng không phải root không thể sử dụng chownđể cho đi các tệp mà họ sở hữu. (Tôi đã thấy các hệ thống trong đó, tùy thuộc vào cấu hình hệ thống tệp, bạn có thể.)
Keith Thompson

Câu trả lời:


96

Hầu hết các hệ thống unix đều ngăn người dùng khỏi việc đưa ra các tập tin của Sony, nghĩa là, người dùng chỉ có thể chạy chownnếu họ có các đặc quyền của người dùng và nhóm mục tiêu. Vì việc sử dụng chownyêu cầu sở hữu tệp hoặc là root (người dùng không bao giờ có thể thích hợp với tệp của người dùng khác), chỉ có root mới có thể chạy chownđể thay đổi chủ sở hữu tệp thành người dùng khác.

Lý do cho sự hạn chế này là việc tặng một tệp cho người dùng khác có thể cho phép những điều xấu xảy ra trong trường hợp không phổ biến, nhưng vẫn là tình huống quan trọng. Ví dụ:

  • Nếu một hệ thống có bật hạn ngạch đĩa, Alice có thể tạo một tệp có thể ghi trên thế giới trong một thư mục chỉ có thể truy cập bởi cô ấy (để không ai khác có thể truy cập tệp có thể ghi trên thế giới đó), sau đó chạy chownđể tạo tệp đó do Bill người dùng khác sở hữu. Sau đó, tệp sẽ được tính theo hạn ngạch đĩa của Bill mặc dù chỉ Alice mới có thể sử dụng tệp.
  • Nếu Alice đưa tập tin cho Bill, Bill sẽ không tạo ra tập tin đó. Đây có thể là một vấn đề nếu tệp chứa dữ liệu bất hợp pháp hoặc làm tổn hại dữ liệu.
  • Một số chương trình yêu cầu tệp đầu vào của họ thuộc về một người dùng cụ thể để xác thực yêu cầu (ví dụ: tệp chứa một số hướng dẫn mà chương trình sẽ thực hiện thay mặt cho người dùng đó). Đây thường không phải là một thiết kế an toàn, bởi vì ngay cả khi Bill tạo một tệp chứa các hướng dẫn chính xác về mặt cú pháp, anh ta có thể không có ý định thực hiện chúng tại thời điểm cụ thể này. Tuy nhiên, cho phép Alice tạo một tệp có nội dung tùy ý và lấy nó làm đầu vào từ Bill chỉ có thể làm mọi thứ tồi tệ hơn.

3
Ở một công việc trước đây, tôi đã xây dựng một hệ thống phần mềm phụ thuộc vào việc không thể cho đi các tệp. Nó đã sử dụng quyền sở hữu tệp để xác minh rằng một yêu cầu đã được gửi bởi một người dùng cụ thể. Nó đã kiểm tra, trong quá trình cài đặt, liệu có cho phép các tập tin được cho phép hay không, và nếu vậy nó từ chối tiếp tục.
Keith Thompson

2
Một vấn đề quan trọng khác là người dùng có thể sao chép /bin/bash, thiết lập nó và sau chownđó gửi cho bất cứ ai họ muốn. Bây giờ họ có quyền truy cập vỏ như người đó.
Patrick

18
@Patrick chownluôn xóa các bit setuid và setgid.
Gilles

1
.... / quyền sở hữu) bạn có thể lấy root trên hệ thống đó. Oh đã bỏ lỡ bình luận của Patrick, chính xác.
hanetzer

Ok, nhưng nếu tôi sở hữu dir ( drwxr-xr-x ring0 ring0 .) trong đó root có tệp thông thường ( -rw-r--r-- root root file), tại sao tôi không thể làm chown ring0 filevì dù sao nó cũng được phép làm, như ring0, cp file x ; rm file ; mv x file(và một số tùy chọn touch sometime file...)?
Đổ chuông

15

Trên Linux, bạn cần có khả năng CAP_CHOWN để phát triển. root được cấp như vậy. Tham khảo: http://vouters.dyndns.org/tima/Linux-OpenVMS-C-Im Hiệning_chown.html để được giải thích. Nếu bạn có ý định cung cấp khả năng CAP_CHOWN, hãy xây dựng mã của bạn bằng libcap-ng hoặc libcap như được trình bày bởi: http://vouters.dyndns.org/tima/Linux-PAM-C-Pluggable_Authentication_Modules_programming_example.html nơi bạn phải đơn giản thay thế với CAP_CHOWN.


1
+1 cho bạn không phải là root. Bởi vì bạn không phải root nữa.
ctrl-alt-delor 19/2/2015

1
Đôi khi, bạn thậm chí không cần CAP_CHOWN: unix.stackexchange.com/questions/399975/ Từ Từ việc tôi đọc nguồn kernel, mỗi lần thực hiện hệ thống tệp được giao nhiệm vụ kiểm tra quyền truy cập. Và dường như với NFS, các quyền được kiểm tra ở phía máy chủ. Và nếu máy chủ ... lạ ... thì có thể.
Mike S

0

Bạn có thể khởi chạy lệnh nhưng nó sẽ không hoạt động nếu bạn không root. Thật dễ dàng: hãy tưởng tượng một người dùng có thể thay đổi phần mềm thành người dùng root. Nó có thể thêm bit setuid và, voilà, anh chàng là root! Vì vậy, việc sử dụng có thể thêm bit bằng chmod, nhưng không có cơ hội thay đổi chủ sở hữu của tệp.


12
Bạn không thể thêm bit setuid vào một tệp mà bạn không sở hữu và các triển khai cho phép cho đi các tệp xóa bit setuid.
Gilles

Tôi nghĩ rằng câu trả lời của Dom là thế này: Hãy tưởng tượng nếu bạn có thể. Rồi sẽ có rắc rối. Quan điểm của bạn, mà bạn không thể, là chính xác. Nhưng OP đang hỏi "tại sao?" Xóa bit setuid là một tính năng bảo mật khác một lần nữa đặt ra câu hỏi "tại sao?" Sau đó tôi sẽ đề cập đến câu trả lời của Dom: NẾU người dùng có thể tán thành và NẾU người dùng có thể thiết lập, thì kết hợp đó sẽ là thảm họa. Tôi nghĩ anh ấy đã làm tốt, ngay cả khi anh ấy thiếu một chút.
Mike S
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.