Sim IJskes - QCG wrote:
On 10/05/2010 01:07 PM, Peter Firmstone wrote:
Yes I think Sim is talking about making trust decisions and Michal and I
are talking about the handshake, we need both, I don't think we're
having an issue of agreement, just understanding.

No, i'm talking about both.

Before you can unmarshall, you need code. This code is loaded by a classloader. The ONLY place where we can check code, is this classloader.

For every trust decision i've made, the classloader should check if what is loaded is consistent with the trust decision i've made.

Aha you want to sign the jar and prevent class loading of unsigned CodeSources.


I want this trust system to be exclusive. Only when trust is granted am i willing to perform code i have been given.

Trust in our discussion's so far is based on the Subject of the Services, ie Principals, I've had trouble with this too, Fred Oliver helped me out. The difficulty with signing the jar file and using it for the trust decision is, the CodeSource may be used by many, whom you may have different trust relationships with.

The DOS issue we're dealing with is outside the Java security system, no trust has yet been established or granted.

But yes, it would be possible to limit ClassLoading based on who has signed the code.


I want this trust system to be dynamic. I want to be able to change my mind.

Once you've loaded the class files, that's it, the ClassLoader will only become garbage collected when no strong references to objects and class files remain. You've only got one shot at that decision.

Currently the Java Security Model is also a one choice trust decision, once you've granted trust, references to security sensitive objects escape, the policy is no longer consulted, security sensitive object references can leak into untrusted code, if we're not careful with our programming. This is how you get a security exploit. Li Gongproposed Security policy decision's being part of object implementation, rather than something external to the object. To do this you create a suitable guard in an objects constructor, this guard is checked on every sensitive method invocation.

I'm working on trust revocation. I have a basic InternetSecurityManager, two Security Delegates (FileInputStream and FileOutputStream) and DelegatePermission's that represent another Permission but can be revoked because Security Delegates use Li Gong's Object Method Guard pattern. The InternetSecurityManager caches the results of permission checks for each AccessControlContext, for rapid repeated checks.


I want this trust system to be automated only in removing trust. I dont want to have a machine surprise me by downloading a trojan.

I want this system to be certification friendly. So not only based on Principal alone.

If you have a look in my PermissionGrant implementation classes, I've made it programatically possible to require that a ProtectionDomain have Principal[]'s and it's CodeSource be signed by Certificate[]'s before the grant is allowed.

So for ultimate security there might be a public clearing house for review of code, compiled and signed by reputable developers after auditing.

A client might require Certificate[]'s as well as particular Principal[]'s, this would provide a maximum security environment.

While that's good and highly recommended, it might be too much to impose it on everyone.

I noticed that Maven provisioning and CodeSource caching has been brought up again, these are ideas I support, we could use some volunteers here, at the moment I'm on my own, I've had the StreamServiceRegistrar interface up for a while (now in pepe under org.apache.river.api.lookup) but haven't had any feedback.

At this stage I don't think we can envision eliminating dynamic code downloads in favour of Maven Provisioning, since this is still in gestation, We need a URL schema we can use for Maven provisioning so we can obtain the maven URI from the proxy MarshalledInstance, and check we have the correct archive with the provided checksum, or deliberately specify another version.

Then we need an additional get() method that supplies our preferred CodeSource to the MarshalledInstance for unmarshalling the proxy.

It's important to remember a Service may change it's proxy implementation at any time, a client should never become dependent on a particular implementation.

We certainly have made progress with understanding dependency relationships between Service API, the service implementation, proxy and client. If we make the ClassLoader inheritance hierarchy the same, then all the ClassLoader issues go away.

For two Services with different Subjects and identical CodeSource, we need two distinct separate ClassLoader instances,specifically for each Subject, so static class variables can't be shared between them and the trust decision for one Subject, doesn't apply to the other.

An applet get's it own ThreadGroup, ClassLoader and SecurityManager which captures System.exit() and only terminates the applet rather than the entire JVM. The applet is still unmarshalled even if unsigned, but it is restricted to it's own thread group.

My intent was to restrict the proxy to a single Thread with a priority of about 4, with it's own UncaughtExeceptionHandler. The proxy is restricted to this thread during unmarshalling. Once the proxy has been unmarshalled and trust has been verified based on authenticating the Subject, the proxy can be safely executed on the client thread. While the proxy is in quarantine, before trust is established, the client can only call it via a reflection proxy that places all method calls on a queue to be executed by the Quarantined Thread. Because the proxy is not executing on the client thread, the client can't be taken down. The proxy can only destroy itself.

If we do this, the attacker will have to instead attempt to fool the authentication mechanism and then do something nasty.

If we use public key certificates for Subject's identity, then any breaches of trust can be reported as bad feedback against these services and the unstrustworthy service will find itself isolated.

To me, fixing the DOS attack is simpler for Application developers and doesn't exclude adding the additional security benefits you're proposing and we're not increasing the initial learning curve required of application developers.

Regards,

Peter.

Eh, would this constitute a requirements definition? :-)

Gr. Sim



Reply via email to