[jboss-as7-dev] More Security Stuff: Privileged Actions

Anil Saldhana Anil.Saldhana at redhat.com
Fri Mar 1 12:41:51 EST 2013


Some pointers on the doPriv stuff:
* The dopriv blocks are just ugly. I wish function pointers (closures 
???) existed in Java
such that we could have a single block of code that we could pass into a 
dopriv block in the
presence of a Java Security Manager. Now in the case of non-JSM, the 
code block has to exist
outside.

* In the core AS code, for every sensitive block of operation, we need 
to have a doPriv block. But
before that call, there needs to be a check that the caller has a 
particular permission. The doPriv block will inherit
the permissions we assign to JBossAS code.

* Applications do not need to bother about doPriv blocks as they can be 
provisioned in the security manager policy.

On 03/01/2013 10:45 AM, David M. Lloyd wrote:
> Some of you may have noticed my recent patch [1] to the AS which factors
> out a couple hundred privileged blocks into 20 or so common classes.  I
> plan to do more such factoring, but I want to talk a little bit about
> what privileged actions are all about first.  This isn't just an
> introductory text - I also want to get the more experienced folks
> thinking about privilege in a new way.  For the subject matter review,
> read my previous email "On security contexts and propagation".
>
> There are essentially three different contexts we need to consider here:
>
> 1) Privileged context - the method is definitely only ever invoked from
> other known-to-be-privileged context
> 2) Maybe privileged context - the method in question might be called
> from user code, or it might be called from privileged code
> 3) Unprivileged context - the method in question is intended to be
> invoked from user deployment code and there is a high degree of
> certainty that the caller is unprivileged
>
> Those of us who are already security-aware often have the automatic
> reaction of putting absolutely everything that requires privileges into
> doPrivileged constructs.  But, this is a practice we should definitely
> reexamine.  Calling through doPrivileged is not free, and the GC
> pressure resulting from all the temporary objects have a real cost as
> well.  In addition, the anonymous classes which often accompany these
> actions cause class loading time to increase and permanent generation to
> be consumed for actions which are often duplicated in many places.
>
> If you're writing a method that is known to run in a privileged context
> already, you do not in fact need any doPrivileged at all.  This should
> include methods in DUPs, extensions, management operations, thread
> pools, and (most) interceptors.
>
> Most framework API methods fall under the categories of #2 or #3.
> Methods of this type should be subjected to the following question:
> Does this method allow the caller to perform one or more actions which
> they would not otherwise be authorized for?
>
> If the answer is "yes", then you usually need two things: a privileged
> block to execute the action (of course), and a permission check to make
> sure the caller has permission to take the given action.
>
> It may seem like the second is redundant: what is the purpose of taking
> away one permission check and adding another?  It is often the case that
> an operation is very specific in purpose, but requires several
> permissions in order to run.  It also may be the case that granting the
> unprivileged caller the full set of required permissions will give them
> an undesirable level of access; in these cases it is wise to grant the
> caller a narrow permission with a single purpose, which is checked for
> in the privileged context.
>
> As a final consideration, there are often cases where the privileged
> action is encapsulated by an already existing object.  In some cases,
> you can simply have your object directly implement PrivilegedAction or
> PrivilegedExceptionAction, thus allowing doPrivileged to call directly
> into your object without having to instantiate an anonymous class.  See
> [2] for an example of this - by having InterceptorContext implement
> PrivilegedExceptionAction we're able to reuse an already-existing object.
>
> Going forward I would like to see better documentation - especially on
> API methods - about what the security requirements and effects are for a
> given method.  More on this in the future.
Right.  This needs to be enforced by the PR mergers.
>
> [1] https://github.com/jbossas/jboss-as/commit/8ca603eb9d
> [2] https://github.com/dmlloyd/jboss-invocation/commit/b654b48cbb79
>



More information about the jboss-as7-dev mailing list