Siêu người dùng có thể ghi vào các tệp chỉ đọc?


11

Tôi đã vấp phải hành vi cho phép đáng ngạc nhiên (đối với tôi) trên FreeBSD. Giả sử tôi đang hoạt động với tư cách là người dùng không root . Tôi tạo một tệp, đặt quyền của nó ở chế độ chỉ đọc và sau đó thử ghi vào đó:

$ touch f
$ chmod 400 f
$ ls -l f
-r--------  1 user  wheel  f
$ echo a >> t
t: Permission denied.

Càng xa càng tốt. Bây giờ tôi làm tương tự như root và nó ghi vào tệp:

# ls -l f2
-r--------  1 root  wheel  f2
# echo a >> f2
# echo $?
0

Đây có phải là một lỗi hoặc hành vi dự định? Tôi có thể an toàn cho rằng điều này sẽ hoạt động như vậy trên bất kỳ Unix & Linux nào không?


Bất kỳ người dùng với CAP_DAC_OVERRIDEcó thể làm điều này. Trên hầu hết các hệ thống Linux, điều này có nghĩa là root có thể làm điều này vì vậy nó có chủ ý. Không thể nói cho phần FreeBSD nhưng tôi tưởng tượng họ có một thiết lập tương tự.
Bratchley

1
Lý do root cần LUÔN LUÔN để có thể ghi vào tệp là vì trên các quyền của tệp unix truyền thống (ext4, zfs, v.v.) là một phần của tệp. Vì vậy, nếu root không thể ghi vào tệp thì NOBODY có thể làm cho tệp chỉ đọc được ghi lại vì chmodkhông thể ghi vào tệp.
slebetman

1
@slebetman Bạn không cần phải có quyền truy cập ghi vào tệp để cập nhật quyền. Chỉ cần thử touch somefile; chmod 0000 somefile; chmod 0644 somefilenhư một người dùng bình thường.
dùng253751

@immibis: Mà bạn sở hữu. Root cần có khả năng thay đổi quyền trên các tệp mà nó không sở hữu
slebetman 17/8/2016

@slebetman Vâng ... nhưng bạn đã nói về việc thay đổi quyền trên các tệp bạn không thể ghi vào, không phải về việc thay đổi quyền trên tệp bạn không sở hữu.
dùng253751

Câu trả lời:


13

Đó là bình thường rootđể có thể ghi đè quyền theo cách này.

Một ví dụ khác là rootcó thể đọc một tệp không có quyền truy cập đọc:

$ echo hello > tst
$ chmod 0 tst
$ ls -l tst
---------- 1 sweh sweh 6 Aug 16 15:46 tst
$ cat tst
cat: tst: Permission denied
$ sudo cat tst
hello

Một số hệ thống có khái niệm về các tập tin bất biến . ví dụ: trên FreeBSD:

# ls -l tst
-rw-r--r--  1 sweh  sweh  6 Aug 16 15:50 tst
# chflags simmutable tst
# echo there >> tst
tst: Operation not permitted.

Bây giờ thậm chí rootkhông thể ghi vào tập tin. Nhưng, tất nhiên, rootcó thể xóa cờ:

# chflags nosimmutable tst
# echo there >> tst
# cat tst
hello
there

Với FreeBSD, bạn có thể tiến thêm một bước và đặt cờ kernel để ngăn không rootxóa cờ:

# chflags simmutable tst
# sysctl kern.securelevel=1
kern.securelevel: -1 -> 1
# chflags nosimmutable tst
chflags: tst: Operation not permitted

Bây giờ không ai, thậm chí không rootthể thay đổi tập tin này.

(Hệ thống cần khởi động lại để giảm độ an toàn).


Làm thế nào là yêu cầu khởi động lại một biện pháp bảo mật hiệu quả? Ngoài ra, nếu root là root và có thể làm bất cứ điều gì, tại sao thậm chí còn cố gắng ngăn chặn root thực hiện những gì root muốn?
con mèo

1
Trên một hệ thống an toàn, root không giống như Chúa. FreeBSD securelevel là một nỗ lực nhỏ để làm cho root ít giống như Chúa. Securelevel có thể được đặt thành mặc định là 1 trong cấu hình hệ thống để nó vẫn hoạt động ngay cả sau khi khởi động lại. Vì vậy, sau đó nó cần truy cập bàn điều khiển và chế độ người dùng duy nhất và điều đó rất rõ ràng. Có toàn bộ bài luận về bảo mật Unix quá nhiều cho trường bình luận SE, nhưng chúng tôi đang cố gắng chuyển từ mô hình 'root có tất cả quyền truy cập' sang một thứ gì đó nhiều sắc thái hơn. Chúng tôi cố gắng thực thi khi có thể (ví dụ: bảo mật) và phát hiện nơi không (bằng chứng khởi động lại, dấu vết kiểm toán).
Stephen Harris

4
FWIW, trong Linux chattr +i tstthiết lập thuộc tính bất biến .
Ruslan

3

Vâng, điều này là rất bình thường. root không có giới hạn về đọc / ghi (với rất ít ngoại lệ), bởi vì anh ta là root.

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.