Once again thank you to everyone who replied!

I think I figured it out. I like the cookie approach. I've extended on it a
little:

1) Since value of read-only Identity property will be passed to the
SECURITY object to determine the callers role and perhaps a callback
reference if necessary, Identity property must be protected so it's not
accessible by other PLUGINS. If some malicious PLUGIN read it's own
identity and informs other PLUGINS of it .. it would not be able to obtain
any privileges it does not have, just delegate it's privileges to others.

2) In order for SECURITY object to be able to set the identity of the new
instance of a PLUGIN, a SetIdentity method will be implemented. Now the
tricky part ... since PLUGINS are designed to interact. We want to prevent
them from being able to modify other PLUGIN's identities. It's imperative
that we prevent malicious PLUGINS from setting a bogus identity on a victim
PLUGIN which would result in a loss of privileges for the victim.

So somehow we must ensure that only SECURITY object is capable of
performing SetIdentity calls. The only solution I have for that so far goes
something like this:

1) Both SetIdentity method and Identity property are defined and
implemented in the base class inherited by all PLUGINS.

2) Identity structure contains two tokens, one used to identify PLUGIN when
calling SECURITY (PluginIdentity), and another to verify identity of the
SECURITY object when calling SetIdentity on the PLUGIN (SecurityIdentity).

3) Constructor of the BaseClass assigns a default constant Identity to the
PLUGIN. That constant Identity is defined in both the BaseClass and
SECURITY class.

4) SetIdentity method requires two Identity structures to be passed:
CurrentIdentity and NewIdentity. Only when CurrentIdentity  argument
matches PLUGIN's current Identity, the operation is allowed.

5) Immediately after PLUGIN instance creation, SECURITY object performs
SetIdentity call on the PLUGIN passing the known constant Identity as
CurrentIdentity, and a brand new Identity for the PLUGIN which contains a
new SecurityIdentity token. SECURITY object keeps track of Identities it
issues to each plugin in case it needs to modify PLUGIN's identity in the
future.

I think this model would allow for SECURITY object only to change PLUGINS
identity token (as many times as necessary).

We also could simply opt out for SetIdentity method to use a Boolean flag
that would prevent that method from being invoked more than once, so that
nobody can modify PLUGIN's identity after initial invocation by SECURITY
object. That would remove the need for second (SecurityIdentity) token.

Thanx! Please feel free to comment.


On Thu, 21 Aug 2003 16:28:32 -0400, J. Merrill <[EMAIL PROTECTED]> wrote:

>SECURITY is a singleton, right?  (Or do you have one per PLUGIN type?  Not
sure it matters.)
>
>I think the answer lies in giving each plugin a "cookie" that it has to
use in order to make calls; if the cookie values can't be faked, I think
you're safe.  Details:
>
>SECURITY is (or should be) responsible for creating the PLUGIN instances.
Each PLUGIN class has an Identity property (a read-only string, but the
read-only is not important to the security [as it's bogus]).  When SECURITY
creates a PLUGIN, it assigns an essentially arbitrary (unpredictable) value
to the Identity property.  The methods of SECURITY that PLUGINs can call
each require a valid Identity value to be passed in.
>
>Information about the PLUGINs is recorded in a SECURITY-owned HashTable
with the Identity values as the key.  The corresponding objects stored in
the HashTable include a field that holds a reference to the PLUGIN that has
the matching Identity.
>
>If a call to SECURITY is made that has a not-present Identity value,
someone is trying to break security (or has buggy code).  If more than N
bad calls are made, any PLUGIN of that type is shut down when it next makes
a call.  (Each PLUGIN-callable SECURITY method must have a result value
that indicates "you are no longer a valid instance; good night.")
>
>If you use a cryptographically strong mechanism to generate the Identity
values, you're pretty safe.  One semi-flaw is that a PLUGIN that's trying
to break in (by passing a bunch of fake Identity values, one of which it
hopes will identify another active PLUGIN) could cause a Denial Of Service
if you implement the "shut down all PLUGINs of that type" protection
mechanism above.  But if the source code for the PLUGIN is in your hands, a
human being could figure out what's going on -- it's not just anyone that
can ask for a new PLUGIN type to be created, right?  That is, you would
know who wanted to build a PLUGIN that was being naughty and could take
appropriate non-computer-related action.
>
>Good luck.
>

===================================
This list is hosted by DevelopMentorŪ  http://www.develop.com
NEW! ASP.NET courses you may be interested in:

2 Days of ASP.NET, 29 Sept 2003, in Redmond
http://www.develop.com/courses/2daspdotnet

Guerrilla ASP.NET, 13 Oct 2003, in Boston
http://www.develop.com/courses/gaspdotnet

View archives and manage your subscription(s) at http://discuss.develop.com

Reply via email to