過剰に許可されたファイル権限

過剰に許可されたファイル権限

説明

ファイルやディレクトリの権限を広く許可すると、他のユーザーが重要なファイルを読み書きできるおそれがあります。java.nio.file.Files.setPosixFilePermissions()に不適切な権限を渡した場合も、機密データが公開される可能性があります。

想定される影響

  • 情報漏えい: 読み取り権限によって、パスワード、APIキー、ユーザー情報が漏えいするおそれがあります。
  • ファイルの改ざん: rw-rw-rw-などの広い書き込み権限で内容を変更できます。削除できるかは親ディレクトリの権限などにも依存します。
  • 権限昇格: 重要な実行ファイルを変更し、別の主体の権限で悪意のあるコードを動かされる可能性があります。

対処方法

  1. 最小権限を適用してください。機密情報を含む通常ファイルは、必要に応じて所有者だけが読み書きできるrw-------にしてください。ディレクトリの探索には実行権限が必要なので、同じ文字列を一律に適用しないでください。
  2. 所有者だけのアクセスが適切なファイルには、java.nio.file.attribute.PosixFilePermissions.fromString("rw-------")を使ってください。
  3. 設定、ログ、一時ファイルを不正なアクセスから保護してください。

例

POSIX権限に対応するファイルシステム上で、既存の通常ファイルの権限を変更する例です。アプリケーションが管理するパスを使い、他のユーザーがファイルや親ディレクトリを変更したり、シンボリックリンクで置き換えたりできないようにしてください。

変更前

java
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.IOException;
import java.util.Set;

public class InsecureFilePermission {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("/tmp/sensitive-data.txt");

        // すべてのユーザーに読み書きを許可
        Set<PosixFilePermission> permissions = PosixFilePermissions.fromString("rw-rw-rw-");
        Files.setPosixFilePermissions(path, permissions);
    }
}

変更後

java
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.IOException;
import java.util.Set;

public class SecureFilePermission {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("/tmp/sensitive-data.txt");

        // 所有者だけに読み書きを許可(rw-------)
        Set<PosixFilePermission> permissions = PosixFilePermissions.fromString("rw-------");
        Files.setPosixFilePermissions(path, permissions);
    }
}

説明:

  • 変更前: rw-rw-rw-を設定し、すべてのユーザーにファイルの読み書きを許可します。
  • 変更後: rw-------を設定し、通常の読み書き権限を所有者に限定します。

参考資料