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 -execdir
hà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 $PATH
chứ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 PATH
biế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 -execdir
từ đượ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 $PATH
như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 $PATH
vì 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 cd
muố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/shared
với Alice.
- Alice muốn số liệu thống kê (dòng, từ, byte) trên các
.c
tệ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 find
với -execdir
chạy wc
trê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 wc
kịch bản, Eve wc
chạy - với tất cả các đặc quyền của Alice!
(Thật xảo quyệt, Eve đã làm cho wc
kị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 để find
ngăn chặn điều này.
find
ngăn vấn đề bảo mật này xảy ra bằng cách từ chối thực hiện -execdir
hành động khi $PATH
chứ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, - foo
xuất hiện $PATH
và bạn chạy find
theo -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 find
sẽ không cho phép bạn sử dụng -execdir
trong tình huống này.
Nhưng có những con đường tương đối, đặc biệt .
, trong bạn $PATH
vố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 cd
là ~eve/shared/blah
chạy và chạy wc *.c
. Nếu blah
chứa wc
kịch bản của Eve , do_evil
chạy như Alice.