Javaのセキュリティ権限の確認

レガシーJavaの権限ポリシーで、不要なクラスローダーとリフレクションの権限を制限してください。

説明

Security Managerを使うレガシーJava環境で、信頼できないコードにRuntimePermission("createClassLoader")やReflectPermission("suppressAccessChecks")を与えると、意図した制限が弱まるおそれがあります。権限オブジェクトを作成したり、ローカルのPermissionsへ追加したりするだけでは、全体の権限が付与されるわけではありません。実際のポリシーへどう適用されるか確認してください。

JDK 24からSecurity Managerは恒久的に無効化されています。現在のJDKで、この権限リストをアプリケーションの隔離手段として利用しないでください。

想定される影響

  • 実際のポリシーが過剰な権限を与えると、信頼できないコードがクラスローダーを作成したり、リフレクションのアクセス検査を省略したりできる可能性があります。
  • 影響は、実行コード、他の権限、モジュールのアクセス制限によって異なります。

対処方法

  1. レガシーポリシーから不要なcreateClassLoaderとsuppressAccessChecksの権限を削除してください。
  2. 必要な権限は、確認済みのコードに最小限の範囲で付与してください。
  3. 信頼できないコードは別プロセスで実行し、OSの権限と隔離制御で制限してください。

例

権限コレクションを構成するだけの例です。ポリシーへ接続する処理はなく、JDK 24以降でSecurity Managerを有効にする方法でもありません。

変更前

java
import java.lang.RuntimePermission;
import java.lang.reflect.ReflectPermission;
import java.security.PermissionCollection;
import java.security.Permissions;

public class InsecurePermission {
    public static void main(String[] args) {
        PermissionCollection permissions = new Permissions();

        // 広い権限を追加
        permissions.add(new RuntimePermission("createClassLoader"));
        permissions.add(new ReflectPermission("suppressAccessChecks"));
    }
}

変更後

java
import java.security.PermissionCollection;
import java.security.Permissions;

public class SecurePermission {
    public static void main(String[] args) {
        PermissionCollection permissions = new Permissions();

        // 不要な権限を追加しない
    }
}

説明:

  • 変更前: クラスローダーの作成とリフレクションのアクセス検査省略を許す権限を追加します。
  • 変更後: その権限を追加しません。実際の制限は、コレクションを使用するレガシーポリシーによって異なります。

参考資料