Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

According to the principle of least privilege, every program and every user of the system should operate using the least set of privileges necessary to complete their particular task [Saltzer 1974, Saltzer 1975]. The Build Security In website [DHS 2006] provides additional definitions of this principle. Executing with minimal privileges mitigates against exploitation in case a vulnerability is discovered in the code. These principles can be applied in various ways to Java language programming. Occasionally a system will have components, most of which require only a base set of privileges, but a few require more privileges than the base set; these are said to run with elevated privileges.

...

Content by Label
showLabelsfalse
maxResults99
sorttitle
showSpacefalse
label+least-privilege,-void
showSpacefalse
sorttitle
space@self

Code that needs to be signed can coexist with unsigned classes in the same JAR file. It is recommended that all privileged code be packaged together. (See rule ENV01-J. Place all security-sensitive code in a single JAR and sign and seal it for more information.) Furthermore, it is possible to grant privileges to code on the basis of the code base and/or its signer using a security policy.

...

Regarding the implementation and use of custom security managers, as opposed to default ones, the Java Security Architecture Specification [SecuritySpec 2008] states

We encourage the use of AccessController in application code, while customization of a security manager (via subclassing) should be the last resort and should be done with extreme care. Moreover, a customized security manager, such as one that always checks the time of the day before invoking standard security checks, could and should utilize the algorithm provided by AccessController whenever appropriate.

...

According to the Java API [java:API 2006] the ClassLoader.checkPackageAccess() method documentation:

...

In 2004, Schoenefeld [java:Schoenefeld 2004] discovered a vulnerability in Opera v7.54 in that the default security policy granted the runtime permission "accessClassInPackage.sun.*" to unprivileged applets so that they could access internal Sun packages. This allowed attackers to obtain sensitive local information and crash the client web browser.

...

When any method from the following table is invoked on a Class, ClassLoader or Thread object, a comparison is run between the method's immediate caller's class loader and that of the object on which the method is invoked. (SCG 2007)

APIs capable of bypassing SecurityManager's checks

Class.newInstance()

Class.getClassLoader()

Class.getClasses()

Class.getField(s)

Class.getMethod(s)

Class.getConstructor(s)

Class.getDeclaredClasses()

Class.getDeclaredField(s)

Class.getDeclaredMethod(s)

Class.getDeclaredConstructor(s)

ClassLoader.getParent()

ClassLoader.getSystemClassLoader()

Thread.getContextClassLoader()

As an example of what constitutes the immediate caller and the object, consider the method java.lang.Class.newInstance(). Here, the immediate caller is the class that contains this method call whereas the object on which the newInstance() method is being invoked is referred to as the Class object (classObjectName.newInstance()). According to the Java Language Specification [JLS 2005], the method getClass() returns the Class object that represents the class of the object.

...