Tại sao một tệp có 400 quyền được nhìn thấy có thể ghi được bằng root nhưng chỉ được đọc bởi người dùng?


10

Nếu tôi tạo một tệp với tư cách là người dùng không có đặc quyền và thay đổi chế độ quyền thành 400, thì người dùng đó sẽ xem là chỉ đọc, chính xác:

$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro

Tất cả đều tốt.

Nhưng sau đó root đi cùng:

# [ -w somefile ] && echo rw || echo ro
rw

Cái quái gì thế Chắc chắn, root có thể ghi vào các tệp chỉ đọc, nhưng nó không nên tạo thói quen cho nó: Thực tiễn tốt nhất sẽ có xu hướng ra lệnh rằng tôi sẽ có thể kiểm tra bit cho phép ghi, và nếu không, thì nó đã được đặt cách đó cho một lý do.

Tôi đoán tôi muốn hiểu cả lý do tại sao điều này xảy ra và làm cách nào tôi có thể nhận được mã trả về sai khi kiểm tra một tệp không có bit ghi được đặt?


btw Tôi đang sử dụng cả RHEL6 ( 4.1.2(1)-release) và RHEL7 ( 4.2.46(2)-release).
Giàu

16
"Thực hành tốt nhất sẽ có xu hướng ra lệnh rằng tôi sẽ có thể kiểm tra bit cho phép ghi, và nếu không, thì nó được đặt theo cách đó vì một lý do." - Trên thực tế, thực tiễn tốt nhất là "không chạy công cụ như root." Nếu bạn đang chạy với quyền root, bạn đã quyết định bỏ qua kiểm tra quyền. Tự thực hiện lại các kiểm tra quyền đó trong không gian người dùng là một công thức cho thảm họa .
Kevin

@Kevin Tốt cho bạn nếu bạn có thể chạy những thứ không được ưu tiên. Điều này là để thao tác /etc/dhcp/dhcpd.conf, được sở hữu bởi root. Tôi đang sử dụng nhà cung cấp cung cấp dhcpd. Thảm họa toàn diện hả? Các tập tin được kiểm tra vào RCS, tôi tự động sử dụng rcsdiff, cicobởi vì chúng tôi có nhà khai thác mà cần phải ... hoạt động. Kiểm tra bit cho phép ( -w, như chi tiết bởi test(1)) sẽ là dòng thất bại đầu tiên, hoạt động trên cơ sở để ci -ulại một tệp chỉ đọc. Tôi đang từ bỏ điều đó và đi thẳng đến rcsdiff -qvà kiểm tra $?. Bất khả xâm phạm dhcpd? Nó sẽ được sở hữu bởi dhcpd.
Giàu

1
Đó là một thảm họa tiềm ẩn bởi vì bây giờ bạn có hai triển khai kiểm tra quyền khác nhau: một trong kernel và một trong không gian người dùng. Tồi tệ hơn, những triển khai đó thậm chí không có ý định tạo ra kết quả giống hệt nhau, vì vậy bạn không thể chỉ kiểm tra chúng với nhau. Vì vậy, bây giờ bạn có hai đường dẫn để truy cập phải được khóa và bảo mật độc lập với nhau.
Kevin

@Kevin Chắc chắn, họ không tạo ra kết quả giống hệt nhau và không có ý định (mặc dù có rất ít chi tiết trong các trang), nhưng tôi rõ ràng muốn kiểm tra bit cho phép viết ; và các trang dành cho bashtestkhiến tôi tin rằng đó là những gì [ -wdành cho.
Giàu

Câu trả lời:


26

test -waka [ -wkhông kiểm tra chế độ tập tin. Nó kiểm tra nếu nó có thể ghi. Đối với root, nó là.

$ help test | grep '\-w'
  -w FILE        True if the file is writable by you.

Cách tôi sẽ kiểm tra là so sánh bitwise với đầu ra của stat(1)(" %a Quyền truy cập trong bát phân").

(( 0$(stat -c %a somefile) & 0200 )) && echo rw || echo ro

Lưu ý lớp con $(...)cần có 0tiền tố để đầu ra của statđược hiểu là bát phân theo (( ... )).


Cảm ơn đã súc tích. Sử dụng tốt (( ... & ... )). Một lỗi đánh máy đã được sửa :-)
Giàu

Làm cho 3 ... Không ifbắt buộc, đầu ra quyền bát phân là %akhông %d, và (( ... ))cần một tiền tố 0để diễn giải đầu ra statlà bát phân.
Giàu

@Patrick của tôi man statnói "% d số thiết bị ở dạng thập phân", nhưng cái chúng ta muốn là "quyền truy cập", phải không? Quan điểm của bạn về việc cần tiền tố 0 được thực hiện tốt, nhưng tôi đoán chúng ta chỉ cần đặt nó ở đó :).
sourcejedi

2
stat -c 0%a...
sourcejedi

@sourcejedi ack, bạn nói đúng. Vì một số lý do, tôi đã nghĩ% d là quyền truy cập ở dạng thập phân. Đã khôi phục chỉnh sửa. cảm ơn :-)
Patrick

30

Tôi nghĩ rằng bạn đã hiểu lầm những gì -wlàm. Nó không kiểm tra xem tệp có "Quyền ghi" hay không, nó kiểm tra xem tệp có thể ghi được bởi người dùng gọi hay không .

Cụ thể hơn, nó gọi access(2)hoặc tương tự.

ví dụ: nếu tập lệnh có if [ -w /etc/shadow ]thì nếu bạn chạy stracetrên tập lệnh, bạn có thể thấy một dòng tương tự như

faccessat(AT_FDCWD, "/etc/shadow", W_OK)

rootcó thể ghi vào tệp nên nó trả về 0.

ví dụ như một người dùng bình thường:

faccessat(AT_FDCWD, "/etc/shadow", W_OK) = -1 EACCES (Permission denied)

Là gốc

faccessat(AT_FDCWD, "/etc/shadow", W_OK) = 0

Điều này, mặc dù thực tế /etc/shadowcó sự cho phép 000trên máy của tôi.

---------- 1 root root 4599 Jan 29 20:08 /etc/shadow

Bây giờ những gì bạn muốn làm trở nên thú vị và không đơn giản như vậy.

Nếu bạn muốn kiểm tra các quyền đơn giản thì hãy kiểm tra lsđầu ra, hoặc gọi stathoặc tương tự. Nhưng nhận ra rằng ACL có thể vượt quá các quyền này. Chỉ vì một tệp được cho phép 400 không ngăn nó có thể ghi được ...


Không, "hiểu lầm" sẽ đọc sai các trang hướng dẫn cho -w: test(1)rõ ràng: "TẬP_TIN tồn tại và quyền được ghi ", không phải " tập tin có thể được viết bởi người dùng hiện tại ". Không có gì về quyền ghi đè , cũng như ACL. bash(1)là lồng lộn: "Đúng nếu tập tin tồn tại và có thể ghi ." ksh(1)làm cho một gợi ý tinh tế về phía tai quái: "tập tin -w // Đúng vậy, nếu tập tin tồn tại và có thể ghi bởi quá trình hiện tại ." zsh(1)trì hoãn test(1), zshmisc(1)được hiểu là ksh(1), và zshexpn(1)chi tiết một số hình ảnh dựa trên quyền thú vị. csh(1)là ngắn gọn vui nhộn: "Viết truy cập".

btw: Tôi đã chấp nhận câu trả lời của Patrick, 1. vì bạn đã không trả lời thỏa đáng cho câu hỏi dẫn đầu: làm thế nào tôi có thể nhận được mã trả về sai khi kiểm tra một tệp không có bit ghi được đặt? và 2. bởi vì sự dẫn dắt lén lút trong giả định tôi đã hiểu nhầm các trang.
Giàu

3
@Rich Cách tôi đọc cái này, tôi nghĩ rằng những bình luận của bạn cũng xuất hiện một chút lén lút. Tôi không nói rằng bất cứ điều gì bạn viết là sai, chỉ là nó có thể sẽ tốt hơn nếu được thể hiện theo cách lịch sự hơn.
David Z

3
"Tôi nghĩ rằng bạn đã hiểu lầm ..." không phải là ngớ ngẩn. Phản hồi của bạn, tuy nhiên, 100% lén lút.
thịt nướng

@Rich Ngoài ra, trong khi các trang web có thể không rõ ràng, Stephen đã tuyên bố rằng bạn có thể đã "hiểu nhầm những gì -w làm ", và không phải những gì các trang web nói, nơi mà trước đây là trường hợp, vì vậy câu hỏi
Sebi

1

Người dùng root có thể làm như cô ấy hài lòng, quyền truy cập tệp "bình thường" không có giới hạn. Nó sẽ không trực tiếp thực thi một tệp đơn giản mà không có bất kỳ quyền eXecute nào, chỉ vì một chút bảo hiểm chống lại thực hành mục tiêu chân.

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.