RFR: JDK-8210274: Source Launcher should work with a security manager
Jonathan Gibbons
jonathan.gibbons at oracle.com
Mon Sep 10 20:37:09 UTC 2018
Please review a patch to have the Source Launcher be able to work when a
security manager is enabled.
There are 4 parts to the work: an update to the default policy file, an
update to the source launcher itself, updates to tests, and a custom
security manager to help with testing.
1. src/java.base/share/lib/security/default.policy
Add reasonably fine-grain permissions to give javac the permissions it
needs to run when a security manager is enabled. These permissions were
determined by running all javac tests under with a special security
manager installed: more on that later. There is one anomalous property
which was detected, which is a property to control some internal javac
behavior. Arguably, it should eventually be renamed with at least a
"javac.*" prefix.
2. src/jdk.compiler/share/classes/com/sun/tools/javac/launcher/Main.java
Update the source launcher to use doPrivileged in a couple of places:
most notably around the main invocation of javac. Generally, it
continues to be the policy that command-line tools like javac, javadoc
do not use fine-grained doPrivileged blocks throughout the tool, and
this update does not change that. It is worth noting that when javac is
invoked from the Source Launcher, it does not support callbacks like
annotation processors, task listeners, and other plugin code, so that
eliminates any issues relating to using callbacks from code in a
doPrivileged block.
3. test/langtools/tools/lib/security/PermissiveTestSecurityManager.java
This is a custom new security manager for manual testing purposes in
conjunction with jtreg, so that we can run a large subset of tests under
the influence of a security manager. . It is a design characteristic of
jtreg that almost all tests have their own distinct codebase, and so it
is impractical to use a modified policy file to grant all necessary
permissions to all necessary tests, so this security manager installs a
custom Policy object that grants permissions to test code while
deferring to the system policy for everything else (and for javac in
particular.) Using this security manager, it is possible to run all
the javac tests to detect with high probability all the permissions that
it requires. Using a custom security manager to install a custom Policy
object allows the feature to be easily enabled on the jtreg command line.
There is one workaround in this security manager: a bug was uncovered
such that the jdk.zipfs module needs permission to access the user.dir
system property. ( https://bugs.openjdk.java.net/browse/JDK-8210469 )
A temporary workaround is used to get a clean test run.
Note: this code is not directly used in any normal/automated test runs
for javac; nevertheless, it is deemed worthwhile to save the code for
use in similar situations in the future.
4. Minor updates to tests.
Some new test cases are added to Source Launcher tests.
Although most tests are not directly affected by the use of a security
manager, there are some exceptions. Some tests manipulate the security
manager and/or expect the security manager to be unset. These tests are
modified to "pass by default" if the runtime conditions are not suitable
(i.e. a security manager has been installed.)
Although it is not a requirement to be able to run annotation processing
tests when a security manager is enabled (because that condition cannot
arise with the Source Launcher), most annotation processing tests do run
successfully. There were 3 exceptions, where the test required more
permissions than granted to javac in code being called from javac. These
permissions were to access test.* system properties and the setIO
runtime permission. Rather than grant unnecessary properties to javac,
it was enough to use doPrivileged in a couple of places in the javac
"toolbox" test library, and to refactor those tests to better use toolbox.
In conjunction with these changes,ignoring any tests on the ProblemList,
all javac tests pass, with and without a security manager being present.
JBS: https://bugs.openjdk.java.net/browse/JDK-8210274
Webrev: http://cr.openjdk.java.net/~jjg/8210274/webrev.00/
-- Jon
More information about the security-dev
mailing list