Further Defenses for the Security Manager

Michael Maass mmaass at andrew.cmu.edu
Wed Oct 29 13:35:54 UTC 2014


Hello All,

I've spent the last 6 months working with some colleagues on a project 
that aimed to stop an exploitation avenue that has been popular with 
recent Java exploits: disabling the security manager. We think that what 
ended up with may be worthy of a JEP and/or a prototype implementation 
in the JVM; we're looking for feedback from the experts, you folks.

We initially set out to determine how benign applications interact with 
the security manager and to determine how those interactions differ from 
malicious ones. The idea was that an investigation aimed at making these 
determinations could show us ways to constrain operations on the manager 
that are backwards compatible with benign applications while blocking 
exploits.

After investigating the open source Java landscape we learned to 
distinguish between (1) "self-protecting" and "defenseless" security 
managers and (2) the operations that may be performed in the presence of 
each. A defenseless manager enforces a policy that uses at least one 
permission in a set of permissions we identified that allow anyone to 
change the manager itself or the policy it enforces (a self-protecting 
manager is the opposite of a defenseless manager). Given this 
definition, we found that enforcing the following rules stopped known 
exploits without impeding (aside from overhead) the execution of benign 
applications:

1. If a self-protecting manager is set, a class may not load or cause 
the loading of a class more privileged than itself unless the loaded 
class is in a protected package (listed in the package.access property 
in java.security.Security).

2. If a self-protecting manager is set, an application may not change 
the security manager or the enforced policy in any way.

We built a JVMTI agent to enforce these rules (available here: 
https://github.com/SecurityManagerCodeBase/JavaSandboxFortifier). 
Unfortunately, to use the JVMTI events that allow us to enforce rule 2, 
the JIT must be off, which drastically slows down the execution of 
applets in the presence of our agent. Rule 1 adds about 1-2% overhead. 
We believe overhead would drop enough for adoption if the JVM were to 
natively enforce these rules instead of using an agent, but we do not 
have the resources or the expertise to try this ourselves.

Any thoughts on whether or not this type of change is worth pursing in 
the form of a JEP and/or prototype in the JVM? If so, is anyone willing 
and able to help?

Thanks,

Michael Maass, PhD Candidate
Software Engineering
Institute for Software Research
School of Computer Science
Carnegie Mellon University


More information about the security-dev mailing list