Bạn có thể chạy chương trình sai. Ai đó có thể làm cho bạn chạy chương trình của họ.
Các -execdirhành động chạy lệnh của bạn từ thư mục có chứa các file (s) được tìm thấy. Khi $PATHchứa các đường dẫn tương đối, chẳng hạn như .hoặc bất cứ thứ gì không bắt đầu/ , -execdirđều không an toàn vì một thư mục tìm thấy tệp (hoặc thư mục khác được giải quyết liên quan đến nó) cũng có thể chứa tệp thực thi cùng tên với tên bạn đang thử chạy. Điều đó có khả năng thực thi không đáng tin cậy sau đó sẽ được chạy.
Điều này có thể được người dùng khác cố tình khai thác để khiến bạn chạy chương trình của họ, điều này có thể gây tổn hại hoặc vi phạm bảo mật dữ liệu, thay vì chương trình bạn đang cố chạy. Hoặc, ít thường xuyên hơn, nó có thể chỉ đơn giản là dẫn đến chương trình sai do vô tình được chạy, thậm chí không có ai cố gắng làm cho vấn đề xảy ra.
Nếu mọi thứ trong PATHbiến môi trường của bạn là một đường dẫn tuyệt đối, lỗi này sẽ không xảy ra, ngay cả khi thư mục bạn đang tìm kiếm và nhập -execdirtừ được chứa trong đó PATH. (Tôi đã kiểm tra xem cái này có hoạt động không.) Nếu bạn tin rằng bạn không có bất kỳ thư mục tương đối nào $PATHnhưng vẫn gặp lỗi này, vui lòng cập nhật câu hỏi của bạn với các chi tiết bao gồm đầu ra của echo "$PATH".
Một ví dụ cụ thể.
Như một ví dụ về những gì có thể đi sai, giả sử:
- Alice có
.trong cô ấy $PATHvì cô ấy muốn có thể chạy các chương trình trong bất kỳ thư mục nào mà cô ấy cdmuốn, mà không bận tâm đến việc đặt trước tên của họ ./.
- Đêm giao thừa của Alice đã chia sẻ
/home/eve/sharedvới Alice.
- Alice muốn số liệu thống kê (dòng, từ, byte) trên các
.ctệp mà Eve đã chia sẻ với cô.
Vì vậy, Alice chạy:
find ~eve/shared -name \*.c -execdir wc {} \;
Thật không may cho Alice, Eve đã tạo ra kịch bản của riêng mình, đặt tên cho nó wc, đặt nó có thể thực thi được ( chmod +x) và đặt nó một cách trắng trợn vào một trong các thư mục bên dưới /home/eve/shared. Kịch bản của Eve trông như thế này:
#!/bin/sh
/usr/bin/wc "$@"
do_evil # Eve replaces this command with whatver evil she wishes to do
Vì vậy, khi Alice sử dụng findvới -execdirchạy wctrên các tập tin Eve đã chia sẻ, và nó được các tập tin trong thư mục tương tự như tùy chỉnh Eve của wckịch bản, Eve wcchạy - với tất cả các đặc quyền của Alice!
(Thật xảo quyệt, Eve đã làm cho wckịch bản của cô ấy hoạt động như một trình bao bọc cho hệ thống wc, vì vậy Alice thậm chí sẽ không biết có gì đó không ổn, tức là do_evilđã chạy. Tuy nhiên, các biến thể đơn giản hơn - và cũng phức tạp hơn là có thể. )
Làm thế nào để findngăn chặn điều này.
findngăn vấn đề bảo mật này xảy ra bằng cách từ chối thực hiện -execdirhành động khi $PATHchứa một thư mục tương đối.
find cung cấp hai thông điệp chẩn đoán tùy thuộc vào tình huống cụ thể.
Nếu .là trong $PATH, thì (như bạn đã thấy) nó nói:
find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove "." or leading or trailing colons)
Nó có thể có một thông điệp đặc biệt cho .trường hợp vì nó đặc biệt phổ biến.
Nếu một đường dẫn tương đối khác với .--say, - fooxuất hiện $PATHvà bạn chạy findtheo -execdir, nó nói:
find: The relative path `foo' is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove that entry from $PATH
Tốt hơn hết là không nên có đường dẫn tương đối $PATH.
Nguy cơ có .hoặc các đường dẫn tương đối khác $PATHđặc biệt tăng cao khi sử dụng tiện ích tự động thay đổi thư mục, đó là lý do tại sao findsẽ không cho phép bạn sử dụng -execdirtrong tình huống này.
Nhưng có những con đường tương đối, đặc biệt ., trong bạn $PATHvốn dĩ rất mạo hiểm và thực sự tốt nhất nên tránh. Hãy xem xét tình huống hư cấu trong ví dụ trên. Giả sử thay vì chạy find, Alice chỉ đơn giản cdlà ~eve/shared/blahchạy và chạy wc *.c. Nếu blahchứa wckịch bản của Eve , do_evilchạy như Alice.