マルチユーザシステムにおけるファイルは、一般に、特定のユーザが所有している。ファイルの所有者は、システムのどのユーザが、そのファイルにアクセスしてもよいかを指定することができる。
マルチユーザ環境におけるファイルシステムは、権限(privilege)とパーミッション(permission)モデルに基づいて、ファイルへのアクセスを保護する。ファイルが作成された瞬間から、ファイルのパーミッションによって、誰がアクセスでき操作できるかが決まる。アクセスを十分に制限できないパーミッションのファイルを作成してしまうと、プログラムがパーミッションを変更するよりも前に、攻撃者はそのファイルを読んだり書き換えたりするかもしれない。したがって、不正なファイルアクセスを許さないパーミッションを設定したファイルを作成しなくてはならない。
違反コード
FileOutputStream と FileWriter のコンストラクタでは、ファイルのパーミッションを明示的に指定できない。
以下の違反コード例では、作成されるファイルのパーミッションは実装依存であり、不正なファイルアクセスを許してしまうかもしれない。
Writer out = new FileWriter("file");
適合コード (Java 1.6 以前)
Java 1.6 およびそれ以前のバージョンの Java では、ファイルの作成時に使われるパーミッションの初期設定を指定するメカニズムが存在せず、ネイティブコードや JNI など Java 以外のメカニズムを使って対処する必要があった。
適合コード (Java SE 7, POSIX)
Java SE 7 で新たに導入された I/O 機能 (java.nio) は、ファイルパーミッションの管理を可能にする。また、ファイルを作成するメソッドやコンストラクタの多くは、ファイル作成時のパーミッションを指定する引数を取ることができる。
Files.newByteChannel() メソッドはファイル作成時にパーミッションを設定することができる。メソッド自体はプラットフォームに依存しない設計であるが、実際に設定するパーミッションはプラットフォームに固有の仕組みである。この解決法では、POSIXプラットフォーム向けに十分制限されたパーミッションを定義している。
Path file = new File("file").toPath(); // 既に存在するファイルを上書きせず、例外を投げる Set<OpenOption> options = new HashSet<OpenOption>(); options.add(StandardOpenOption.CREATE_NEW); options.add(StandardOpenOption.APPEND); // 所有者のみが読み書きできるファイルパーミッションを設定する Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-------"); FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms); try (SeekableByteChannel sbc = Files.newByteChannel(file, options, attr)) { // データをファイルに書きだす };
例外
FIO01-EX0:セキュアでありかつ信頼できないユーザが読めないディレクトリの中にファイルを作成する場合、初期設定のパーミッションでファイルを作成してもよい。たとえば、ファイルシステム全体が信頼できる、あるいは信頼できるユーザのみがファイルシステムにアクセスできるような場合がこれに該当する。「セキュアなディレクトリ」の定義については、「FIO00-J. 共有ディレクトリにあるファイルを操作しない」を参照。
FIO01-EX1:機微な情報を含まないファイルは、特にパーミッションを設定せずに作成してもよい。
リスク評価
適切なパーミッションを設定せずにファイルを作成すると、攻撃者がファイルに読み書きするかもしれない。これは、システムの完全性の侵害や、情報漏えいにつながる恐れがある。
ルール | 深刻度 | 可能性 | 修正コスト | 優先度 | レベル |
---|---|---|---|---|---|
FIO01-J | 中 | 中 | 高 | P4 | L3 |
関連ガイドライン
CERT C++ Secure Coding Standard | FIO06-CPP. Create files with appropriate access permissions |
CERT C Secure Coding Standard | FIO06-C. Create files with appropriate access permissions |
ISO/IEC TR 24772:2010 | Missing or Inconsistent Access Control [XZN] |
MITRE CWE | CWE-279. Incorrect execution-assigned permissions |
CWE-276. Incorrect default permissions | |
CWE-732. Incorrect permission assignment for critical resource |
参考文献
[API 2006] | |
[CVE] | |
[Dowd 2006] | Chapter 9, "UNIX 1: Privileges and Files" |
[J2SE 2011] | |
[OpenBSD] | |
[Open Group 2004] | "The open function," and "The umask function" |
[Viega 2003] | Section 2.7, "Restricting Access Permissions for New Files on UNIX" |
翻訳元
これは以下のページを翻訳したものです。
FIO01-J. Create files with appropriate access permissions (revision 47)