Có cách nào trong Java để ghi ra một tệp tạm thời một cách an toàn không? Theo như tôi có thể nói, cách duy nhất để tạo một tệp tạm thời (createTempFile) không thực sự mở nó cùng một lúc, do đó, có một điều kiện chủng tộc giữa tệp mở & ghi tệp. Tui bỏ lỡ điều gì vậy? Tôi không thể tìm thấy mã nguồn C đằng sau createFileExclusively (String) trong UnixFileSystem.java, nhưng tôi nghi ngờ nó có thể thực sự làm bất cứ điều gì kể từ khi mở tệp xảy ra trong mã Java sau khi tệp tạm thời được tạo (trừ khi nó cố gắng làm điều gì đó với khóa tệp?).java tương đương với mkstemp
Vấn đề
giữa khi các tập tin tạm thời được tạo & bạn mở nó, một kẻ tấn công độc hại có thể bỏ liên kết mà tập tin tạm thời & đặt thứ độc hại đó. Ví dụ, kẻ tấn công có thể tạo một đường ống có tên để đọc dữ liệu nhạy cảm. Hoặc tương tự nếu bạn cuối cùng sao chép tệp bằng cách đọc tệp, thì tên được đặt tên chỉ có thể bỏ qua mọi thứ được viết & cung cấp nội dung độc hại để đọc.
Tôi nhớ đọc rất nhiều ví dụ về các cuộc tấn công tệp tạm thời trong 10 năm qua khai thác điều kiện cuộc đua giữa khi tên xuất hiện trong không gian tên và khi tệp thực sự được mở. Hy vọng rằng một yếu tố giảm thiểu là Java đặt umask một cách chính xác vì vậy một người dùng ít đặc quyền không thể đọc/ghi vào tập tin và thường là thư mục/tmp hạn chế quyền truy cập để bạn không thể thực hiện một cuộc tấn công unlink.
Tất nhiên nếu bạn chuyển thư mục tùy chỉnh cho tệp tạm thời thuộc sở hữu của người dùng ít đặc quyền bị xâm nhập, người dùng có thể thực hiện một cuộc tấn công hủy liên kết với bạn. Địa ngục, với inotify, nó thậm chí có thể dễ dàng hơn để khai thác các điều kiện chủng tộc hơn chỉ là một vòng lặp brute force mà hiện một danh sách thư mục.
Bạn có thể giải thích điều kiện chủng tộc nào tồn tại không? –
Mọi cập nhật về điều này (như trong cách giải quyết hoặc thủ thuật Java7)? –
@Mr_and_Mrs_D Tôi vừa thêm câu trả lời thực tế. – OrangeDog