What is implied by @CallerSensitive
annotation above methods?
For example,the annotation is present in getClassLoader method of Class
@CallerSensitive
public ClassLoader getClassLoader() {
//
}
What is implied by @CallerSensitive
annotation above methods?
For example,the annotation is present in getClassLoader method of Class
@CallerSensitive
public ClassLoader getClassLoader() {
//
}
From
jdk.internal.reflect.CallerSensitive
The equivalent would be
java.lang.StackWalker.getCallerClass
since Java SE 9.This is effectively the security model of Java versions 1.0 and 1.1, which implemented a sort of pauper's linker checking. It's a coherent approach except for anything related to reflection but is exteremely fragile. The more restrictive Java 2 security model, on the other hand, is magic and doesn't show its workings.
@CallerSensitive
methods alter behaviour depending upon the class that called them. This is always surprising, but then so is the Java 2 stack-inspection security model. To make matters worse, these method calls are particularly useful for classes that are working on behalf of their caller, so the context is wrong anyway.The Secure Coding Guidelines for Java SE covers this area.
The introduction of modules in Java SE 9 has meant that some of the details have changed.
Additionally if the
@CallerSensitive
method is called withMethod.invoke
some of the stack frames are ignored bygetCallerClass
. Internally the JDK uses a "trampoline"ClassLoader
to act as a benign dummy caller.java.lang.invoke.MethodHandle
copies problems ofMethod.invoke
. TheAccessController.doPrivileged
methods are also problematic with the consequences of the specification being surprising.JEP 176: Mechanical Checking of Caller-Sensitive Methods deals with the particular
@CallerSensitive
jdk-internal annotation. The method lists in the Guidelines were generated by a FindBugs plug-in but then manually updated.According to the JEP I linked to in the comments (also here),
If you look at the implementation of
Class#forName(String)
, you notice that it is using
Reflection.getCallerClass()
. If we look at that methodThe problem, it seems, before this JEP, was that if the caller sensitive method was called through reflection instead of directly, there had to be a complex process to identify what the actual calling class was. This was problematic if the method was invoked through reflection. A simpler process was proposed (and introduced) with
@CallerSensitive
.Basically, the
@CallerSensitive
annotation is used by the JVM