...
This noncompliant code example returns an instance of the immediate caller's class loader to any invoker. A malicious invoker can consequently, obtain the associated class loader using standard APIs such as java.lang.Class.getClassLoader()
. Once this is achieved, it is trivial to use Class.forname()
to load the malicious class from attacker space or exploit a trusted method that calls Class.newInstance()
on an arbitrarily supplied object. Class.newInstance()
does not throw any security exception when the class loader is either the same or the delegation ancestor of its immediate caller. (SEC02-J. Do not expose standard APIs that may bypass Security Manager checks to untrusted code)
Code Block | ||
---|---|---|
| ||
privatepublic Class doLogic() { ClassLoader myLoader = new myClassLoader(); Class myClass = myLoader.loadClass("MyClass"); return myClass; // Returns Class instance to untrusted code } |
...
Always make sure that any internal Class
, ClassLoader
and Thread
instances are not returned to untrusted code. Furthermore, it is preferable to reduce the accessibility of methods that perform sensitive operations and define wrapper methods that are accessible from untrusted code.
Code Block | ||
---|---|---|
| ||
private void doLogic() {
ClassLoader myLoader = new myClassLoader();
Class myClass = myLoader.loadClass("MyClass");
// Do what is is required here itself; do not return myClass
}
public void doLogicWrapper() {
// Perform any checks or validate input
doLogic();
}
|
Exceptions
EX1: It is permissible to use APIs that do not use the immediate caller's class loader instance. For example, the three-argument java.lang.Class.forName()
method requires an explicit argument that specifies the class loader instance to use.
...