System.exit(...) without SecurityManager - implications for Apache Ant project
Alan Bateman
Alan.Bateman at oracle.com
Mon Aug 23 09:42:02 UTC 2021
On 23/08/2021 07:46, Jaikiran Pai wrote:
> :
>
> So if any of the upcoming Java 18 EA builds introduce the "disallow"
> by default, then if Ant has to test against those EA builds (not just
> for SecurityManager but any other changes), then Ant project will have
> to start setting the "java.security.manager" system property to
> "allow". That's not going to be straightforward, since it would be
> dealing with this in potentially multiple launch scripts or maybe even
> dynamic launch commands issued through the code (I haven't checked
> where/how many). I don't yet know if this property value can be
> changed at runtime/dynamically. If that is allowed, it may make things
> a bit easier since that would allow us to set that property value at
> the same place where we set the custom security manager in the Ant
> code, but I would still like to avoid it if possible.
>
> So given all this, can the new API(s) design/implementation for
> preventing System.exit(...) calls without a SecurityManager be
> prioritized and perhaps be scheduled for release in Java 18 itself,
> which is where the "disallow" will come in as default?
>
> To summarize - Ant would need a way to intercept/prevent JVM exits via
> System.exit(...) or Runtime.getRuntime().exit(...) calls *and* a way
> to get hold of the exit code that was used to trigger such calls (Ant
> had to wrap the SecurityException into a custom exception type just to
> keep track of that exit code value).
Once the JDK is changed to disallow setting a SM dynamically then it
will require the command line option to keep existing code that calls
System.setSM working. This change should have little-to-no impact on
libraries as it would be rare for a library to set a SM. It will have
impact on applications and tools that do set it dynamically as they will
need the CLI option to allow a SM be set.
The System.exit use-case is well studied. It has come up several times
over the years in the context of tools that want to prevent accidental
calls to System.exit by plugins/other programs that are run "in
process". Your description of the fork mode where it runs the task "in
process" seems to match this. I assume one option is to just catch UOE
or not attempt to set a SM on >= 18, it just means that tools that do
call System.exit will cause ant to shutdown with maybe a shutdown hook
used to log a message.
It's too early to point to a specific API/proposal at this time. There
were early exploratory sketches a few years ago but they didn't go very
far. The main thing is that we don't want to introduce APIs for
intercepting specific operations in isolation, e.g. we don't want one
API to intercept System.exit and a completely different API for
intercepting attempts to make socket connections for example. So TBD,
and I'm sure there will be a lot of discussion on the mailing lists.
-Alan
More information about the security-dev
mailing list