2011-09-16 10 views
3

署名付きアプレットがあります。いくつかのプラグインアーキテクチャを実装するために、特定のクラスを持つJARファイルをディスクにダウンロードして格納します。署名付きアプレットは、セキュリティ問題のあるURLClassLoaderを使用して署名付きjarファイルをロードします。

次に、これらのクラスをURLCLassLoaderでロードします。だから、私はロードされたクラスからいくつかのメソッドを呼び出そうとしています。私はセキュリティ上の問題があります。

URLClassLoadedの場合はSecurityManagerで「サイントークン」が確認できないようです。誰もこの問題を解決する方法を知っていますか?

ありがとうございます!

読み込み中です。

URLClassLoader loader = new URLClassLoader(new URL[] {libraryArchive.toURI().toURL()}, Compress.class.getClassLoader()); 

呼び出し。

... 
org.palettelabs.comm.desktopcapture.pim.Library lib = libraryClass.newInstance(); 
       final Compress compressingLibrary = (Compress) lib; 
       File file = AccessController.doPrivileged(new PrivilegedExceptionAction<File>() { 

        @Override 
        public File run() { 
         try { 
          File file = compressingLibrary.compress(filesList); 
          return file; 
         } catch (Exception e) { 
          Logger.error("applet: compress: invocation external library error", e); 
          return null; 
         } 
        } 

       }); 

例外。

2011-09-16 16:00:08,550 [SwingWorker-pool-1-thread-4] ERROR - applet: compress: invocation external library error 
java.security.AccessControlException: access denied (java.io.FilePermission /tmp/dca-palettelabs-storage/test/compress/linux32ffmpeg.jar-extractedFiles/org/palettelabs/ 
comm/desktopcapture/libs/compress/linux32 read) 
     at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374) 
     at java.security.AccessController.checkPermission(AccessController.java:546) 
     at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
     at java.lang.SecurityManager.checkRead(SecurityManager.java:871) 
     at java.io.File.exists(File.java:731) 
     at java.io.File.mkdirs(File.java:1181) 
     at org.palettelabs.comm.desktopcapture.pim.Library.extract(Library.java:31) 
     at org.palettelabs.comm.desktopcapture.libs.compress.linux32.Linux32.compress(Linux32.java:17) 
     at org.palettelabs.comm.desktopcapture.ui.UploadingWorker$1.run(UploadingWorker.java:77) 
     at org.palettelabs.comm.desktopcapture.ui.UploadingWorker$1.run(UploadingWorker.java:1) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at org.palettelabs.comm.desktopcapture.ui.UploadingWorker.compress(UploadingWorker.java:72) 
     at org.palettelabs.comm.desktopcapture.ui.UploadingWorker.doInBackground(UploadingWorker.java:57) 
     at org.palettelabs.comm.desktopcapture.ui.UploadingWorker.doInBackground(UploadingWorker.java:1) 
     at javax.swing.SwingWorker$1.call(SwingWorker.java:277) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
     at javax.swing.SwingWorker.run(SwingWorker.java:316) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:662) 
+0

フィードバックありがとうございます。アプレットは、eclipseの下でアプレットランチャーから実行すると、セキュリティマネージャなしで正常に動作します。 –

+0

ありがとう!しかし、どのように実装することができますか?ブラウザは、JVMを呼び出してアプレットを実行する特別なプラグインを使用します。どのように私はデフォルトのSecurityManagerを変更することができますか? –

+0

ありがとう!正常に動作します。 'SecurityManager'クラスを拡張し、クラスの検証のための適切なルールを宣言しました。私の質問の回答として回答を投稿してください。最高の解決策にしたいと思います。 –

答えて

1

正しいコードベース(パッケージなど)からそのコードを実行できるカスタムセキュリティマネージャをインストールします。

これを行うには、System.setSecurityManager(myManager)を呼び出します。 (あなたが把握した通りに)myManagerSecurityManagerの拡張です。

セキュリティマネージャを設定するには、信頼できるアプレットが必要です。

+0

アプレットの** SecurityManagerを**に設定しますか? –

+0

@Tom私はあなたの質問を理解していません。 –

+0

セキュリティマネージャをアプレットに設定すると、同じプロセス内のすべてのアプレットに影響します。あなたはそれをしたくありません。 (また、2つの異なるアプレットがそのことをしたくない場合) –

1

java.security.SecureClassLoaderの適切なサブクラスを使用して、ロードされたクラスに適切なProtectionDomainを割り当てます。もちろん、これらのクラスが何らかの仕組み(例えば、そのような目的のために信頼する証明書で署名されたもの)によって信頼されることを確認してください。

関連する問題