jeudi 9 avril 2015

Java set SecurityManager with Reflection

I'm working on a plug-in for something and I'm trying to spawn a few threads, but I keep running into the problem of not being able to spawn them because of the SecurityManager. The software the plug-in runs under implements its own SecurityManager that does only two things: stop thread spawning and prevent the changing of the security manager.


It does not, however, prevent reflection, so I decided to try to reflect the System class to modify the manager that way.


Upon decompiling the System class, I found:



/* The security manager for the system.
*/
private static volatile SecurityManager security = null;


So, I tried to reflect it to a default security manager.



Class<System> systemClass = System.class;
Field securityManager = systemClass.getDeclaredField("security");
securityManager.setAccessible(true);
securityManager.set(securityManager, new SecurityManager());


However, this causes a NoSuchFieldExpception when I try to get the security field, even though it is clearly there. Why is this? Is there another way I can set the SecurityManager?


Note: The getDeclaredFields method returns an array not containing the security field.






Aucun commentaire:

Enregistrer un commentaire