このクラスは、実行時のアクセス権に関連します。RuntimePermission は、ターゲット名とも呼ばれる名前を格納しますが、アクションリストは格納しません。名前の付いたアクセス権 (名前付きアクセス権) は持っても持たなくてもかまいません。
ターゲット名は、実行時アクセス権の名前です (以降の説明を参照)。命名規則は、階層的プロパティ命名規則に従います。また、名前の末尾に「.*」または「*」がある場合は、ワイルドカードマッチングを表します。たとえば、「loadLibrary.*」や 「*」は有効なターゲット名ですが、「*loadLibrary」や「a*b」は無効です。
次の表に、使用可能な RuntimePermission ターゲット名を一覧にまとめ、それぞれについて、許可するアクセス権と、コードに許可することによって生じるリスクを示します。
アクセス権のターゲット名 |
アクセス権許可の内容 |
アクセス権の許可によるリスク |
createClassLoader |
クラスローダの作成 |
このアクセス権を許可することはきわめて危険である。独自のクラスローダのインスタンスを生成できる悪意のあるアプリケーションであれば、悪意のあるクラスをシステムにロードできるようになる。この場合、新しくロードされた悪意のあるクラスを、クラスローダを使って任意の保護ドメインに配置できる。つまり、保護ドメインへのアクセス権を、悪意のあるクラスに対して自動的に許可することになる |
getClassLoader |
クラスローダ (クラスを呼び出すためのクラスローダなど) の取得 |
特定のクラスのクラスローダへのアクセス権を、攻撃者に与えるおそれがある。クラスのクラスローダへのアクセスができれば、攻撃者はそのクラスローダでアクセスできるほかのクラスもロードできるので、危険である。クラスのクラスローダへのアクセスができなければ、通常、攻撃者はこれらのクラスにアクセスできない |
setContextClassLoader |
スレッドが使うコンテキストクラスローダの設定 |
コンテキストクラスローダは、システムクラスローダには存在しない可能性のあるリソースを探す必要があるときに、システムコードおよび拡張機能が使用する。setContextClassLoader アクセス権の許可によって、コードは、システムスレッドを含む特定のスレッドに使用するコンテキストクラスローダを変更できるようになる |
setSecurityManager |
セキュリティマネージャの設定 (既存の設定を置き換える可能性あり) |
セキュリティマネージャは、アプリケーションでセキュリティポリシーを実装できるようにするクラスである。setSecurityManager アクセス権の許可によって、コードは、より制限の少ないほかのセキュリティマネージャをインストールすることによって、使用されるセキュリティマネージャを変更できる。その結果、元のセキュリティマネージャなら実行されたはずのセキュリティチェックを省略できる |
createSecurityManager |
新しいセキュリティマネージャの作成 |
他のクラスまたは実行スタックの情報を公開する可能性がある、保護された、機密性の高いメソッドへのアクセスをコードに与える |
exitVM |
Java Virtual Machine の停止 |
Virtual Machine を自動的に停止させることで、攻撃者はサービス妨害攻撃を展開することができる |
setFactory |
ServerSocket または Socket が使うソケットファクトリ、あるいは URL が使うストリームハンドラファクトリの設定 |
ソケット、サーバーソケット、ストリームハンドラ、あるいは RMI ソケットファクトリが使う実際の実装をコードで設定できるようにする。攻撃者は、データストリームを混乱させる不完全な実装を設定できる |
setIO |
System.out、System.in、および System.err の設定 |
標準のシステムストリームの値を変更できるようにする。攻撃者は System.in を変更してユーザの入力を監視および盗聴したり、System.err を「null」の OutputSteam に設定して、System.err に送られたエラーメッセージがまったく表示されないようにすることができる |
modifyThread |
Thread の stop 、suspend 、resume 、setPriority 、および setName などのメソッドの呼び出しを介してのスレッドの変更 |
攻撃者は、システム内の任意のスレッドを開始または停止できる |
stopThread |
Thread の stop メソッドの呼び出しを介してのスレッドの停止 |
コードは、すでにスレッドへのアクセス権を与えられている場合は、システム内の任意のスレッドを停止できる。コードを使って既存のスレッドを強制終了することでシステムを破壊できるため、これは脅威になる |
modifyThreadGroup |
ThreadGroup の destroy 、resume 、setDaemon 、setMaxPriority 、stop 、および suspend などのメソッドの呼び出しを介してのスレッドグループの変更 |
攻撃者は、スレッドグループを作成してその実行優先順位を設定できる |
getProtectionDomain |
クラスの ProtectionDomain の取得 |
特定のコードソースのポリシー情報を、コードで取得できる。ポリシー情報を取得されてもシステムのセキュリティは損なわれないが、これにより、攻撃者はローカルファイル名などの付加情報を取得でき、攻撃の的は絞りやすくなる |
readFileDescriptor |
ファイル記述子の読み取り |
ファイル記述子 read に関連付けられた特定のファイルを、コードを使って読み取ることができる。ファイルが機密データを格納している場合、これは危険である |
writeFileDescriptor |
ファイル記述子への書き込み |
この記述子に関連付けられた特定のファイルに、コードを使って書き込みができる。悪意のあるコードでウィルスを感染させたり、ディスク全体を埋めることができるので危険である |
loadLibrary.{ライブラリ名} |
特定のライブラリへの動的リンク |
Java のセキュリティアーキテクチャが、ネイティブコードのレベルで悪意のある動作を防止するようには設計されていないため、ネイティブコードライブラリをロードするアクセス権をアプレットに与えるのは危険である |
accessClassInPackage.{パッケージ名} |
クラスローダがセキュリティマネージャの checkPackageAcesss メソッドを呼び出したときに、クラスローダの loadClass メソッドを介して、指定されたパッケージへアクセスを許可する |
パッケージ内の、通常ならアクセスできないクラスにコードでアクセスできる。悪意のあるコードによって、システムのセキュリティを損なうためにこれらのクラスが利用される可能性がある |
defineClassInPackage.{パッケージ名} |
クラスローダがセキュリティマネージャの checkPackageDefinition メソッドを呼び出したときに、クラスローダの defineClass メソッドを介して、指定されたパッケージ内のクラスを定義する |
特定のパッケージ内のクラスを定義するためのアクセス権をコードに対して許可する。このアクセス権を持つ悪意のあるコードに対して、java.security や java.lang などの信頼できるパッケージ内に、悪意のあるクラスを定義することを許可するので危険である |
accessDeclaredMembers |
クラスの宣言されたメンバへのアクセス |
public、protected、default (パッケージ) への各アクセスに利用するクラス、および private フィールドまたは private メソッド (あるいは両方) を照会するためのアクセス権をコードに許可する。コードは、private と protected の各フィールド名および各メソッド名にアクセスできるが、public および protected の各フィールドデータにはアクセスできず、任意の private メソッドの呼び出しもできない。しかし、悪意のあるコードはこの情報を使って、攻撃の的を絞ることができる。さらに、コードはクラスの任意の public メソッドまたは public フィールド(あるいは両方)を呼び出すことができる。これは、このコードが、通常はこれらのメソッドの呼び出しやフィールドにアクセスできない場合は、これらのメソッドおよびフィールドを使っても、コードはオブジェクトをクラスまたはインタフェースにキャストできないため、危険である。
|
queuePrintJob |
印刷ジョブ要求の初期化 |
機密情報を印刷してしまうか、用紙の無駄になる |