I've got one ClassLoader for trusted application code and a seperate ClassLoader for user-submitted (untrusted) code.
I want the user-submitted code to be restricted by the Security Manager. How do I check the caller origin from within the SecurityManager? See the psuedocode:
System.setSecurityManager(new SecurityManager() {
public void checkPermission(Permission permission) {
if (/*caller class is not loaded by the trusted classloader*/) {
throw new SecurityException("You do not have permissions.");
}
}
});
What I've tried already:
StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).getCallerClass().getClassLoader()
checks for permissions first so it gives a stack overflow exception.Thread.currentThread().getStackTrace()[2].getClassLoaderName()
is insecure because it only gives the classloader name and not class object, if the untrusted loader's canonical name is the same as the trusted loader then that's a security issue.