Vim có thể phá vỡ quyền truy cập tập tin?


8

Tôi đã sử dụng Vim vào một ngày khác như thường lệ, khi tôi nhận thấy một điều kỳ lạ. Đây là những gì tôi đã làm:

~$ touch testfile
~$ ls -l | grep testfile
-rw-r--r-- 1 username groupname 0 Jul 23 10:00 testfile
~$ vim testfile

Sau đó, tôi đã thực hiện một thay đổi, và lưu và thoát với :wq. Khá bình thường. Sau đó, tuy nhiên:

~$ sudo chown root:root testfile
~$ sudo chmod 644 testfile
~$ sudo -k
~$ ls -l | grep testfile
-rw-r--r-- root root 0 Jul 23 10:02 testfile
~$ vim testfile

Vì vậy, root nên có quyền truy cập r / w và mọi người khác chỉ nên đọc. Chỉnh sửa tập tin, cố gắng lưu - bạn không thể. Tuyệt vời, làm việc như dự định. Tuy nhiên, nếu bạn lưu với :w!, vim bằng cách nào đó thay đổi quyền sở hữu tệp trở lại tên người dùng: nhóm người dùng và tệp được lưu. Ngay cả khi bạn làm điều này:

~$ sudo chmod 444 testfile
~$ sudo -k
~$ ls -l | grep testfile
-r--r--r-- 1 root root 0 Jul 23 10:06 testfile
~$ vim testfile

Bạn vẫn có thể ghi đè lên :w!! Chuyện gì đang xảy ra vậy? Làm thế nào vim có thể phá vỡ luật sở hữu tập tin và cho phép như thế này? Tôi đã xem trang trợ giúp trong vim bằng cách nói :help :wvà tìm thấy điều này:

:w[rite]! [++opt]    Like ":write", but forcefully write when 'readonly' is set or there is another reason why writing was refused.
                     Note: This may change the permission and ownership of the file and break (symbolic) links. Add the 'W' flage to 'cpoptions' to avoid this.

Tôi đã không thể ghi vào một tập tin trong vim trước đây khi tôi không nên, vì vậy tôi đoán trung tâm thực sự của câu hỏi của tôi là, làm thế nào tôi có thể tạo một tập tin không thể di chuyển bằng vim và tại sao nó không dựa trên tập tin quyền hệ thống, như tôi mong đợi, và vim đang sử dụng cơ chế nào để chỉnh sửa tệp mà các trình soạn thảo khác (gedit, nano) không thể sử dụng?

EDIT: Máy tính tôi đã thử này sử dụng kernel Linux 3.15.5-2-ARCH. Số phiên bản của Vim là 7.4.373-1 và là phiên bản được cài đặt bởi pacman- Tôi đã không biên dịch nó từ đầu với bất kỳ tùy chọn đặc biệt nào.


Tôi dường như không thể tái tạo vấn đề, trừ khi thực hiện một số thủ thuật như được mô tả ở đây
Davyzhu

Tôi vừa thử lại bằng cách sử dụng các lệnh trong câu hỏi, và nó đã xảy ra theo cách tương tự. Tôi sẽ chỉnh sửa câu hỏi để thêm chi tiết về máy tính của mình mặc dù có vẻ như điều này có thể phụ thuộc vào nền tảng.
vào

Linh cảm đầu tiên của tôi là bạn được phép thay đổi quyền sở hữu các tệp trong thư mục mà bạn có quyền ghi. Nhưng có vẻ như không phải vậy . CAP_CHOWNlà cần thiết để gọi chown(2). Nhân tiện, tôi có thể sao chép trên Debian, với vim 7.4.
Bob

Câu trả lời:


10

Tôi có thể thấy rằng đường dẫn hiện tại của bạn là ~, thư mục nhà của người dùng của bạn. Bạn nên có quyền ghi vào thư mục đó.

Hãy nghĩ về nó theo một cách khác - nếu bạn đã đọc và ghi quyền vào thư mục, điều gì ngăn bạn sao chép tệp, xóa tệp cũ và đổi tên tệp mới với các quyền khác nhau?

Đây chính xác là những gì vim làm!


Nếu bạn chạy vim theo strace, ví dụ:

open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = -1 EACCES (Permission denied)
lstat("testfile", {st_mode=S_IFREG|0644, st_size=10, ...}) = 0
getuid()                                = 1000
unlink("testfile")                      = 0
open("testfile", O_WRONLY|O_CREAT|O_TRUNC, 0644) = 3
write(3, "ffjidfjds\n", 10)             = 10
fsync(3)                                = 0
close(3)                                = 0
chmod("testfile", 0644)                 = 0

Dựa trên nhật ký này, tôi có thể đoán theo quy trình sau:

Một số kiểm tra cấp phép trước đó (và các chownnỗ lực, v.v.) được bỏ qua cho ngắn gọn.

  1. open Cố gắng mở tệp để viết (thất bại: quyền bị từ chối)
  2. lstat Kiểm tra chủ sở hữu của tập tin
  3. getuuid Kiểm tra ID người dùng hiện tại, để xem họ có khớp với chủ sở hữu tệp không
  4. unlink Xóa tệp (điều này được cho phép vì quyền ghi trên thư mục)
  5. open Tạo một tệp mới có cùng tên
  6. write Nội dung tập tin (đọc trước đó, tôi đã gõ một số từ vô nghĩa)
  7. fsync Xóa tệp vào đĩa (không thực sự quan trọng)
  8. close
  9. chmod Thay đổi quyền của tệp mới để trông giống như quyền cũ - bây giờ tình cờ có chủ sở hữu mới.

Được rồi cảm ơn. Tôi rất vui vì tôi đã tìm ra điều này. Vì vậy, nếu tôi không có quyền ghi trên thư mục, tôi sẽ không thể sử dụng :w!, điều này có ý nghĩa.
zrneely

Ngoài ra, thông tin strace thực sự tiện dụng - bây giờ tôi có một công cụ khác cho các cuộc điều tra của riêng tôi trong tương lai.
vào

1
@zrneely Một mẹo cho strace: sử dụng -otùy chọn để ghi đầu ra vào một tệp; mặt khác, nó đụng độ với vimđầu ra của. Đối với quyền ghi, tôi không nhìn thấy nó kiểm tra thư mục cho phép với statnhưng nó không cố gắng để tạo ra một tập tin (tên 4913, dường như ngẫu nhiên) trong thư mục hiện và sau đó xóa nó.
Bob

Có vẻ như 4913thực sự chỉ là tên đầu tiên mà nó thử, và mục đích của nó kiểm tra xem nó có đủ quyền để làm như vậy không. Xem: bugzilla.redhat.com/show_orms.cgi?id=427711#c6Groups.google.com/forum/#!topic/vim_dev/sppdpElxY44
Bob
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.