On Mon, 19 Apr 2021 09:11:34 GMT, Peter Levart <plev...@openjdk.org> wrote:

> I think it would be easy to limit the use of this Instrumentation method to 
> the agent code as agent classes are loaded by the bootstrap classloader. 
> Simply make the method implementation caller-sensitive and check the caller 
> is from bootstrap class loader. This way Instrumentation instance escaped to 
> application code would not give that code any ability to define arbitrary 
> classes.

The agent JAR file is added to application class path and is loaded using the 
system class loader. So almost always the defining loader will be the 
application class loader.

In general it's a hard problem to try to balance the integrity and security of 
the platform with the needs of agents that do arbitrary injection and 
instrumentation. Specifying an agent on the command line with -javaagent is the 
opt-in to trust that agent and a defineClass that allows arbitrary injection is 
plausible for that deployment. As Rafael's mentioned in one of the messages, 
there is enough power in the existing Instrumentation API to do that in a round 
about way already.

We don't have anything equivalent for agents that are loaded by tools into a 
target VM. I added the attach mechanism and the dynamic agent loading back in 
JDK 6 and regret not putting more restrictions around this. As it stands, it is 
open to mis-use in that an application or library can use the attach mechanism 
(directly or via the attach API in a child VM) to load an agent and leak the 
Instrumentation object. This is the genie that somehow needs to be put back in 
its bottle. One approach that I mentioned here to create is a less powerful 
Instrumentation object for untrusted agents. Trusted agents would continue to 
the full-power Instrumentation object.  A less powerful Instrumentation object 
would not be able to redefine java.base or other core modules and would not be 
able to retransform classes in those modules. The option on the table during 
JDK 9 was to disable dynamic loading of agents by default but that was kicked 
down the road. I don't particularly like that option and I th
 ink we can do better.

-------------

PR: https://git.openjdk.java.net/jdk/pull/3546

Reply via email to