Các vấn đề bảo mật và điều kiện chủng tộc khi sử dụng `find -exec` là gì?


14

Từ findtrang người đàn ông :

-exec command ;
    There are unavoidable security problems
    surrounding use of the -exec action; you should use the
    -execdir option instead.

-execdir command {} +
    Like -exec, but the specified command is run from the
    subdirectory containing the matched file, which is not
    normally the directory in which you started find.  This a much
    more secure method for invoking commands, as it avoids race
    conditions during resolution of the paths to the matched
    files.

Điều đó có nghĩa là gì? Tại sao có điều kiện chạy đua với việc chạy nó từ thư mục bắt đầu? Và những rủi ro bảo mật này như thế nào?


Liên quan: Tại sao lặp đi lặp lại tìm kiếm thực tiễn xấu? nơi mà được bao phủ trong một số câu trả lời.
Stéphane Chazelas

Câu trả lời:


13

Tìm thấy các chi tiết ở đây :

Các -exechành động gây ra một chương trình khác được chạy. Nó chuyển đến chương trình tên của tệp đang được xem xét tại thời điểm đó. Chương trình được gọi thường sẽ thực hiện một số hành động trên tệp đó. Một lần nữa, có một điều kiện chủng tộc có thể được khai thác ở đây. Chúng ta sẽ lấy một ví dụ cụ thể về lệnh

 find /tmp -path /tmp/umsp/passwd -exec /bin/rm

Trong ví dụ đơn giản này, chúng tôi đang xác định chỉ một tệp sẽ bị xóa và yêu cầu /bin/rmxóa nó. Có một vấn đề tồn tại bởi vì có một khoảng cách thời gian giữa điểm mà find quyết định rằng nó cần xử lý -exechành động và điểm mà /bin/rmlệnh thực sự đưa ra lệnh gọi hệ thống unlink () để xóa tệp khỏi hệ thống tệp. Trong khoảng thời gian này, kẻ tấn công có thể đổi tên /tmp/umsp thư mục, thay thế nó bằng một liên kết tượng trưng đến /etc. Không có cách nào /bin/rmđể xác định rằng nó đang hoạt động trên cùng một tệp mà tìm thấy trong tâm trí. Khi đã có liên kết tượng trưng, ​​kẻ tấn công đã thuyết phục tìm thấy gây ra việc xóa /etc/passwdtệp, đây không phải là hiệu ứng được thực hiện bởi lệnh thực sự được gọi.

Không chắc khả năng ai có thể khai thác điều này; nhưng tôi đoán có câu trả lời!


Trong trường hợp trên, execdirtrước tiên, chdir sẽ /tmp/umsptrước khi chạy lệnh và theo lý thuyết, một kẻ tấn công làm lại thư mục sẽ không có tác dụng .. nếu việc phát lại xảy ra sau khi tìm "quyết định" để đánh giá -execnhưng trước khi rmlệnh có thể thực hiện công việc của nó. Nhưng tôi tự hỏi tại sao điều này sẽ tạo ra sự khác biệt: kẻ tấn công chỉ đơn giản là có thể làm lại sau khi người dùng đã quyết định viết findlệnh.
Otheus

1
@RuiFRibeiro Liên kết không phải là đối số được truyền cho lệnh, đó là một thư mục trung gian. /tmp/umsplà một thư mục khi findnhìn thấy nó, nhưng khi rmchạy, kẻ tấn công đã thay đổi nó thành một liên kết tượng trưng đến /etc. /tmp/umsp/passwdlà một tập tin thường xuyên, nhưng không phải là cùng một tập tin.
Gilles 'SO- ngừng trở nên xấu xa'

2

Tôi tin rằng lý do tại sao -execnguy hiểm là vì nếu người dùng không chỉ định tên đầy đủ và đường dẫn đến chương trình sẽ được thực thi, thì nó có khả năng thực thi chương trình sai.

Thí dụ:

find /some/path -exec coolprogram

Trong /some/pathđó, ai đó đã tạo một cái khác coolprogramvà nó tải tất cả dữ liệu của bạn lên một số diễn viên xấu.

Nhưng chờ đã, bạn nói, bạn không phải thực hiện nó như là ./coolprogram? Có, nhưng một số người có PATH=.:/bin:whatever, sẽ thực hiện chương trình trong thư mục hiện tại.

Điều này có thể được đơn giản hóa, nhưng tôi nghĩ rằng nó có thể nguy hiểm trong một số trường hợp. Tôi đã phải khắc phục sự cố một lần khi byte không cpiokết thúc trong thư mục sai. Nó khiến chương trình bị sập vì cpiokhông hoạt động vì nó đang chạy tệp zero-byte trong thư mục.


3
Những rủi ro này không bị cô lập find -exec. Nếu bạn đã đặt .trong đường dẫn của mình thì chỉ cần thực thi coolprogramtrong thư mục hiện tại của bạn đã nguy hiểm, cho dù bạn có sử dụng findđể làm điều đó hay không!
Daniel Tuppeny

1
Đồng ý, nhưng có vẻ như đồng hồ -execdir cho điều kiện mà tôi đã đề cập là:The ‘-execdir’ action refuses to do anything if the current directory is included in the $PATH environment variable. This is necessary because ‘-execdir’ runs programs in the same directory in which it finds files – in general, such a directory might be writable by untrusted users. For similar reasons, ‘-execdir’ does not allow ‘{}’ to appear in the name of the command to be run.
Doug

Tôi đoán đạo đức của câu chuyện là có. trong đường dẫn của bạn cũng là một ý tưởng tồi, đó là lý do tại sao tôi chắc chắn rằng nó không có trong đó.
Doug

Thú vị khi biết về việc không tuân .theo đường dẫn và {}lệnh. Có thể trong tương lai Linux sẽ chỉ cấm .hoàn toàn trong đường dẫn và các công cụ sẽ không cần phải thực hiện kiểm tra an toàn của riêng họ! :)
Daniel Tuppeny

1
Tôi nghĩ rằng 90% mã tôi viết chỉ để nắm bắt 5% những điều sai. :)
Doug
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.