6

Javaで一時ファイルに安全に書き出す方法はありますか?

私が知る限り、一時ファイルを作成する唯一の方法 (createTempFile) は実際には同時に開かないため、ファイルのオープンとファイルの書き込みの間に競合状態が発生します。何か不足していますか?UnixFileSystem.java で createFileExclusively(String) の背後にある C ソース コードを見つけることができませんでしたが、一時ファイルが作成された後に Java コードでファイルが開かれるため (何かをしようとしない限り)、実際には何もできないとは思えません。ファイルロック?)

問題

一時ファイルが作成されてから開くまでの間に、悪意のある攻撃者がその一時ファイルのリンクを解除し、そこに悪意のあるものを配置する可能性があります。たとえば、攻撃者は名前付きパイプを作成して機密データを読み取る可能性があります。または同様に、最終的にファイルを読み取ってコピーした場合、名前付きパイプは書き込まれたものをすべて無視し、読み取られる悪意のあるコンテンツを提供する可能性があります。

名前空間に名前が表示されてから実際にファイルが開かれるまでの競合状態を悪用する、過去 10 年以上の一時ファイル攻撃の例を数多く読んだことを覚えています。

Java が umask を正しく設定しているため、権限の低いユーザーがファイルの読み取り/書き込みを行うことができず、通常は /tmp ディレクトリが適切にアクセス許可を制限しているため、リンク解除攻撃を実行できません。

もちろん、侵害された権限の低いユーザーが所有する一時ファイルのカスタム ディレクトリを渡すと、そのユーザーはあなたに対してリンク解除攻撃を行う可能性があります。地獄、inotify を使用すると、ディレクトリの一覧表示を実行するブルート フォース ループよりも、おそらく競合状態を悪用する方が簡単です。

4

4 に答える 4

1

http://kurt.seifried.org/2012/03/14/creating-temporary-files-securely/

ジャワ

java.io.File.createTempFile() を使用します – http://www.veracode.com/blog/2009/01/how-boring-flaws-become-interesting/の興味深い情報

ディレクトリについては、 How to create a temporary directory/folder in Java? に役立つ投稿があります。

Java 7

ファイルには java.io.File.createTempFile() を使用します

ディレクトリには createTempDirectory() を使用します

http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html

于 2012-09-24T18:45:23.047 に答える
0

多くのシステムでは、ファイルに名前がないからといって、アクセスできないわけではないことに注意してください。たとえば、Linux では、開いているファイル記述子は で使用できます/proc/<pid>/fd/<fdno>。そのため、誰かが開いているファイルへの参照を知っている場合でも、一時ファイルの使用が安全であることを確認する必要があります。

防止しようとしている攻撃のクラスを正確に指定すると、より有用な回答が得られる場合があります。

于 2012-04-18T02:10:53.773 に答える
0

他の通常のユーザー ID に対して保護しますか? はい、正常に機能しているマルチユーザー システムであれば問題ありません。

あなた自身のユーザーIDまたはスーパーユーザーに対して保護しますか? いいえ。

于 2012-06-19T22:34:02.853 に答える