SecurityManager "limité" à des threads pour système de plugins
Bonsoir à tous,
Je cherche depuis plus d'un mois -sans succès- à me servir du SecurityManager de Java pour "sandboxer" des plugins (threadés) lancé depuis une application principale sur laquelle je ne veux pas de SecurityManager (seulement sur les plugins)
Actuellement voilà mon schéma:
PluginSecurityManager.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
public class PluginSecurityManager extends SecurityManager {
private boolean restricted;
@Override
public void checkPermission(Permission perm) {
check(perm);
}
@Override
public void checkPermission(Permission perm, Object context) {
check(perm);
}
private void check(Permission perm) {
if (!restricted)
return;
throw new SecurityException("Permission denied");
}
public void enableSandbox() {
restricted = true;
}
public void disableSandbox() {
restricted = false;
}
} |
Plugin.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public abstract class Plugin implements Runnable {
public void run() {
SecurityManager old = System.getSecurityManager();
PluginSecurityManager psm = new PluginSecurityManager();
System.setSecurityManager(psm);
psm.enableSandbox();
pluginMain();
psm.disableSandbox();
System.setSecurityManager(old);
}
} |
SubPlugin.java
Code:
1 2 3 4 5 6 7
|
public abstract class SubPlugin extends Plugin {
public int startPlugin() {
super.run();
return 0;
}
} |
PotentiallyHarmfulPlugin.java
Code:
1 2 3 4 5 6 7
|
public class PotentiallyHarmfulPlugin extends SubPlugin {
public void pluginMain()
{
// Do something nasty here !
}
} |
(L'héritage Plugin/SubPlugin vient des contraintes de mon projet et n'est à priori pas lié au problème)
Le souci avec ce schéma là qui me parait le plus "proche" techniquement de ce que je veux faire (j'ai testé plein de maniéres différentes, sans plus de succés), c'est que le SecurityManager n'est pas "restreint" au thread, et interdit donc par la suite tout appel de fonction dans le programme principale. Ce qui se constate par le fait également que quand je lance plusieurs plugins, après le premier, pour les autres le SecurityManager indique ne pas avoir d'accès aux permissions suivantes:
Citation:
("java.lang.RuntimePermission" "createSecurityManager")
("java.lang.RuntimePermission" "setSecurityManager")
("java.lang.RuntimePermission" "getProtectionDomain")
ce qui parait "logique" dans le sens ou je veux pas qu'on puisse changer de SecurityManager depuis un plugin (même si de toute façon actuellement, *rien* n'est autorisé depuis les plugins, voir code ci-dessus), mais me montre bien qu'il essaye de réactiver un SecurityManager alors que l'autre n'est pas desactivé. (donc en gros, ça marche pô.)
Suis-je loin de ce que je voudrais faire, est il possible de restreindre l'activation du SecurityManager à des threads spécifiques ?
En vous remerciant par avance,