Javaで一時ファイルに安全に書き出す方法はありますか?
私が知る限り、一時ファイルを作成する唯一の方法 (createTempFile) は実際には同時に開かないため、ファイルのオープンとファイルの書き込みの間に競合状態が発生します。何か不足していますか?UnixFileSystem.java で createFileExclusively(String) の背後にある C ソース コードを見つけることができませんでしたが、一時ファイルが作成された後に Java コードでファイルが開かれるため (何かをしようとしない限り)、実際には何もできないとは思えません。ファイルロック?)
問題
一時ファイルが作成されてから開くまでの間に、悪意のある攻撃者がその一時ファイルのリンクを解除し、そこに悪意のあるものを配置する可能性があります。たとえば、攻撃者は名前付きパイプを作成して機密データを読み取る可能性があります。または同様に、最終的にファイルを読み取ってコピーした場合、名前付きパイプは書き込まれたものをすべて無視し、読み取られる悪意のあるコンテンツを提供する可能性があります。
名前空間に名前が表示されてから実際にファイルが開かれるまでの競合状態を悪用する、過去 10 年以上の一時ファイル攻撃の例を数多く読んだことを覚えています。
Java が umask を正しく設定しているため、権限の低いユーザーがファイルの読み取り/書き込みを行うことができず、通常は /tmp ディレクトリが適切にアクセス許可を制限しているため、リンク解除攻撃を実行できません。
もちろん、侵害された権限の低いユーザーが所有する一時ファイルのカスタム ディレクトリを渡すと、そのユーザーはあなたに対してリンク解除攻撃を行う可能性があります。地獄、inotify を使用すると、ディレクトリの一覧表示を実行するブルート フォース ループよりも、おそらく競合状態を悪用する方が簡単です。