アプレットで java.beans.Introspector.setBeanInfoSearchPath() を呼び出すと java.security.AccessControlException がスローされる


症状

アプレットを Sun JRE を使用したブラウザで実行している場合、AccessControlExceptionIntrospector.setBeanInfoSearchPath() の実行中にスローされます。

java.security.AccessControlException:access denied (java.util.PropertyPermission * read,write)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPropertiesAccess(Unknown Source)
    at java.beans.Introspector.setBeanInfoSearchPath(Unknown Source)
    at ....

同じアプレットが Microsoft VM では実行できます。

原因

Introspector.setBeanInfoSearchPath() メソッドの呼び出しでは、BeanInfo クラスの検索に使用されるパッケージ名の一覧を変更できます。複数のアプレットが VM で実行中の場合、他のアプレットに BeanInfo の検索をリダイレクトするために、想定外のパッケージで、信頼されていないアプレットがこのメソッドを呼び出す可能性があります。これがセキュリティホールです。

セキュリティに関する事柄を扱うため、JRE では java.util.PropertyPermission に対するセキュリティチェックをこのメソッドに追加しました。アプレットが署名されておらず、このメソッドに呼び出された場合、AccessControlException がスローされます。

解決方法

回避策は次のいずれかです。

  1. JDK の jarsigner ツールを使用してアプレットに署名する。これでアプレットは信頼されるアプレットとして実行され、Introspector.setBeanInfoSearchPath() メソッドを呼び出すためのアクセス権を得る
  2. Introspector.setBeanInfoSearchPath() を呼び出さないようにアプレットのコードを改変する。たとえば BeanInfo 検索パスに依存する代わりに、完全修飾パッケージ名を使用して BeanInfo を検索する

詳細情報

       「jarsigner - JAR 署名および検証ツール」を参照してください。