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
Plugin.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; } }
SubPlugin.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } }
PotentiallyHarmfulPlugin.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public abstract class SubPlugin extends Plugin { public int startPlugin() { super.run(); return 0; } }
(L'héritage Plugin/SubPlugin vient des contraintes de mon projet et n'est à priori pas lié au problème)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public class PotentiallyHarmfulPlugin extends SubPlugin { public void pluginMain() { // Do something nasty here ! } }
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:
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ô.)("java.lang.RuntimePermission" "createSecurityManager")
("java.lang.RuntimePermission" "setSecurityManager")
("java.lang.RuntimePermission" "getProtectionDomain")
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,
Partager