On 18/05/2021 12:25 am, Ron Pressler wrote:
On 17 May 2021, at 13:47, Peter Firmstone <peter.firmst...@zeus.net.au> wrote:
It is a foundational feature, it has a significant impact on those who adopted
it.
True. But the problem is that it also has a significant impact on those who
didn’t.
Yes, you are talking about those who maintain and develop OpenJDK, but
this is only a small proportion of the overall Java developer
ecosystem. But I understand that this isn't insignificant either,
just like the features removal isn't insignificant to those affected by it.
Out of curiosity, was anyone here impacted by the oil pipeline shutting
down? Impacts can be direct and indirect.
This is an existing system, your arguments are not relevant as the cost of
rewriting millions of lines of code is prohibitively expensive.
I don’t think we’re talking about rewriting millions of lines of code, and the
cost of keeping
Security Manager is far greater, anyway. We want to shift the high cost of
maintaining the
SM, or something like it, from those who *don’t* want it to those who do, and I
think that’s more
than fair.
No, it's not practical, but there's no viable upgrade path, so our only
option is indefinite maintenance of Java 17.
My point is that there will be no restriction on the services themselves in the
JVM consuming and using the services. Currently service proxy's are only
allowed to contact their originating server and negotiate a few required
permissions for their operation. In future versions of Java without a
SecurityManager, they will have no restrictions at all.
I don’t understand this statement. Which JDK-implemented “service proxies” are
you referring to that
today implement such a restriction in the JDK?
In a distributed system that uses POJO's and Remote Method Invocation, a
proxy is used to invoke methods on an object in a remote JVM or any
other language for that matter, operating in another node or process.
The proxy implementation is not known, nor necessarily are it's
communication methods until runtime. It is loaded dynamically.
The proxy is trusted code (each implementation has different bytecode),
but we wish to run it with principles of least privilege, rather than an
anything goes approach.
https://github.com/pfirmstone/JGDMS/wiki/OSGi-and-JGDMS
Yes, it is the case for software that was designed to use the SecurityManager.
We need to be honest about the impact, yes I understand SecurityManager will
be removed, however telling developers their EXISTING software is no less
secure is inaccurate.
It is accurate, because if existing software picks a new runtime, then it will
have to be modified
in order to run at all, if only to acknowledge it is depending on a deprecated,
and later, degraded
feature. This JEP is proposing a responsible mechanism precisely to prevent
situations like applications
that do depend on SM for security suddenly become less secure without their
knowledge.
If the application needs access control, but the Java platform doesn't
provide it, and you must remove it for the application to run, then yes,
the software will be less secure as a result. This shouldn't be
difficult to understand.
So you could say, that the application has become less secure, with
their knowledge, because it has a task to perform and it will be made so
that it will continue to perform that task, even at the expense of less
security, because security has become the obstacle to operation, which
is the primary purpose, so security becomes a secondary concern. No one
will switch it off if it's insecure, at least not until after they're
hacked, then they'll look for bolt on security solutions and they may
get approval to rewrite the system at that stage.
Are you a security expert? Is this your opinion as a security expert?
I am absolutely not a security expert, which is why I talk to security experts
who tell me
they do not recommend the Security Manager as a central security measure.
No, but it is a useful security layer to control access.
Security should be seen as a layered approach, rather than one solution
fits everything. Each layer has it's role to play.
The use of SecurityManager as a central security measure is not the intent.
https://www.upguard.com/blog/principle-of-least-privilege
Yes the Java Permission model is flawed, one cannot disallow an insecure
network connection, while allowing a secure TLS authenticated
connection, however we've created other ways of doing that, but it does
rely on the Permission model to limit privilege.
Your proposal is quite plain and simple, I don't see how it can be
misunderstood, you propose to remove the ability to make stack based domain,
access control decisions.
Not the ability, but the built-in implementation.
It is not possible to implement fine grained access control in Java, or
as a library, this feature is low level JVM code.
Developers who wish to develop new applications that require access
control should do so using another platform, those who have existing
software deployments, need to stay on Java 17 for example, indefinitely
until EOL.
New developments that require access control might consider the
Microsoft CLR for example, however I'm no expert, there may be better
alternatives.
https://www.c-sharpcorner.com/UploadFile/84c85b/net-code-access-security-cas/
These sandboxes you talk of, I have not seen any practical workable solutions,
I'm assuming your talking about Intel architecture based Virtual Machines that
host an OS, they don't provide dynamic access decisions for Java? Yes I
acknowledge they can do static, but not dynamic performant access decisions.
Depends what you mean by “dynamic.” They do not attempt to provide different
access to JDK capabilities
to different code-paths within the same Java process, which is why they are
preferable.
Dynamic means at runtime, not compile time or installation time.
We did look at using a separate process to sandbox untrusted code, but
it just didn't seem like a good idea to allow untrusted code to run at
all, at least not dynamically, one should run static analysis on it
first, but if it's a black box, you can only inspect bytecode, not
source and it can be obfuscated.
This is why authentication is still important, but even that can be
circumvented by a good attacker and shouldn't be relied upon as the only
defense.
We should just say, that there is no future migration path for existing Java
applications that require fine grained access control.
But that is untrue. First, let’s clarify that by “fine-grained access control”
you don’t mean the
ability of an application to allow or disallow application-level operations on
as fine a level as they’d
like based on, say, user credentials, but on the JDK blocking *JDK-level*
operations based on the code
paths that invoke them. Second, while the JEP does not offer a built-in
replacement for such a mechanism,
because few people want it and we believe it is not a good path for security
for Java these days,
if you absolutely want such a mechanism, you can inject instrumentation to
replace the built-in one
using the Java Agent mechanism, so there is a migration path even for this use
case.
That taking this particular migration path rather than opting for other
security measures is not trivial
only demonstrates why the Security Manager needs to be removed, as the people
paying for that work now
are those who *don’t* want it.
To restrict operations to the principle of least privilege.
https://us-cert.cisa.gov/bsi/articles/knowledge/principles/least-privilege
https://www.upguard.com/blog/principle-of-least-privilege
It would have been better if we could have assigned principles of least
privilege to Java library's too.
The code is not known at compile time, it is dynamic, such that it is
only known at runtime, this means that to use the Java Agent mechanism,
one must intercept every network and file system access, then try to
determine where the call originates, to see whether it can be allowed or
disallowed.
There is no feature in Java past release 17 that would interest me
enough to perform this amount of work on an existing application, nor
would it even be a viable option if I wanted to. So I can't pay for it
even if I want to, as it is unaffordium.
Besides we know what runs now is very performant, high scaling and
concurrent. It also runs with the principles of least privilege, so
if someone makes a coding mistake, it will be more difficult for an
attacker to take advantage of.
I think for starters we should discourage those who require fine grained access
control from using newer versions of Java that don't implement it. Then it
would be nice for those who would like to help maintain an existing version of
Java that does support fine grained access control to do so as a part of the
OpenJDK project.
I don't understand why this is so objectionable?
Because your very specific and FAR from universal definition of “fine-grained
access control” does
all the work in this statement. It is not objectionable to say that Java will
not provide a built-in
mechanism that filters certain JDK operations based on the code-paths in which
they are accessed.
As you say, it's a small segment of the development base that needs this
feature, we should advise them to use a platform that supports it,
rather than try to get Java to do such things by bolting it on as an
afterthought. Security added later doesn't work, it needs to be
considered at the design stage.
https://www.c-sharpcorner.com/UploadFile/84c85b/net-code-access-security-cas/
It really doesn't matter what 99.99% of other people are doing for the 0.01%
that use it. You conveniently plucked these figures out of thin air, a word of
advice, it lessens the credibility of your arguments.
It is not my intention to convince you personally that the proposal is
justified. If you’d like to see the
proposal amended or withdrawn, it is *your* duty to convince those who made it
that it should be. If you
think that their assessment of the current value the SM brings to Java users is
incorrect, then it is
up to *you* to support that. I’m carrying on this discussion in the hope that
it might uncover some specific
point that we’ve missed — precisely because we take it very seriously and don’t
wish to brush off anything or
anyone -- not in order to get you to concede anything. For example, you
mentioned something about service proxies,
and it would be great if you could explain precisely what you mean.
Sometimes two opposing opinions can be equally reasonable, perhaps based on
different values, and yet only one
can be made. It is never our intention to get universal consensus for every
decision concerning such a large
ecosystem, or we’d never get anything done.
— Ron
I'm looking at how to support existing deployments that utilise existing
Java access control features.
Your world sounds more of a static compile time, everything is known up
front environment, mine is dynamic and flexible and unknown until after
a process has been running for some time. The bytecode we wish to manage
access control of, may be written years after an existing deployment has
been running, we don't need to shutdown that deployment, or forklift
upgrade it, we simply add the new components, or nodes and they are
discovered dynamically at runtime and become an integral part of the
system automatically.
However I suspect that you haven't got JEP 411 over the line yet and you
are worried that open discussion of the issues it causes may stop it,
because it impacts something you are trying to implement. I apologize
if this discussion inconveniences you, but it's still relevant and we
should be looking at maintaining a version of Java that supports access
control for a very long time, not 8 years. As part of this JEP or make
removal of the SecurityManager and associated components dependent on
another JEP that proposes maintaining a version of Java 17 for the
foreseeable future. This would be community supported version by those
who require it, maybe we can backport some things in later versions.
Simply because access control cannot be implemented as a library feature
or bolted onto the JVM as an agent instrumenting unknown bytecodes.
The only other alternatives is either a complete rewrite in another
language, or forking Java, but neither seem viable.
I wouldn't recommend a new development that requires access control to
consider using the Java platform at this time. As you say, it is only a
small number of developments, but they should look elsewhere.
I'm unable at this time to advise where people should look as I'm still
in the investigation stage myself. If someone does know of other
platforms that do access control well, please inform me.
--
Regards,
Peter Firmstone