特別なライブラリに頼らずに Java でプラグイン システムを構築しようとしています。
今のところ、プラグインを読み込んで処理できます。ただし、ファイルの削除などへのアクセスを無効にする特別なセキュリティ マネージャーを定義する必要があります。
私のシステムのコアは、プラグインが実行できないいくつかのアクションを実行する必要があるため、この Security Manager はプラグインのみを保持する必要があります。その結果、System クラスを使用して Security Manager を設定できません。または、システムのコアにも影響します。
プラグインをロードした後、デフォルトの Security Manager を「リセット」しようとしましたが、それを行うことができませんでした。できたとしても、プラグインは、独自のものではなく、システムの現在のセキュリティ マネージャーを実行することになります。
クラスを特定のセキュリティ マネージャにカプセル化する方法があるかどうかを知りたいです。
頭の上では、スタックトレースを見て、プラグインクラスが呼び出し元として見つかった場合、実行してはいけないアクションを禁止することを考えていましたが、これはパフォーマンス的に少し効果がないことが判明するのではないかと心配しています.
アイデアを支援するために、できる限りすぐにセキュリティ マネージャーにコードを投稿します。
私のセキュリティマネージャーのコードは次のとおりです。
package org.zeh.filemanager.core.controllers.util;
import java.io.FileDescriptor;
/**
* @author José Ricardo Carvalho Prado de Almeida
*/
public class PluginSecurityManager extends SecurityManager {
@Override
public void checkRead(FileDescriptor filedescriptor) {
super.checkRead(filedescriptor);
}
@Override
public void checkRead(String filename) {
super.checkRead(filename);
}
@Override
public void checkRead(String filename,
Object executionContext) {
//
super.checkRead(filename,
executionContext);
}
@Override
public void checkWrite(FileDescriptor filedescriptor) {
throw new SecurityException("Plugin is trying to write files.");
}
@Override
public void checkWrite(String filename) {
throw new SecurityException("Plugin is trying to write files.");
}
@Override
public void checkDelete(String file) {
super.checkDelete(file);
throw new SecurityException("Plugin is trying to delete files.");
}
@Override
public void checkExec(String cmd) {
super.checkExec(cmd);
throw new SecurityException("Plugin is trying to create subprocesses.");
}
@Override
public void checkExit(int status) {
super.checkExit(status);
throw new SecurityException("Plugin is trying to finalize the JVM.");
}
@Override
public void checkCreateClassLoader() {
super.checkCreateClassLoader();
throw new SecurityException("Plugin is trying to create ClassLoaders.");
}
}
I have found a question (How to implement Java plugin security safely?), that is very similar to mine but the answers do not really fit in my context, where external libraries are not desired.
I forgot to mention that I do have a custom Class Loader that is working perfectly as of now.
I've designed the program so each kind of plugin would have a special Class Loader and such loader would have it's own Security Manager, to restrict different plugins based on functionality.
The only reason this design does not work is because of those Security Managers. If I ignore the use of Security Managers, the system does everything it is supposed to, although it is not secure.
Does anyone have a probable solution for this problem? Thank you.