[digging up this old email from the archives since we referenced it
recently]
On Thu, 7 Jun 2012, Simon Wilkinson wrote:
Rather than reply point by point, I thought it might be helpful to clarify the
security model that this draft is aiming for, and then we can address the best
way of modifying the language in the draft to better communicate this.
In a single user cache manager, we don't really care about the existence of the
cache manager. Any data which is requested by a user is for the use of that
user only. Similarly, any data returned by extended callback breaks is also
only for that user's attention.
In a multi user cache manager, on the other hand, data requests are on behalf
of both the user (who will consume that data immediately), and the cache
manager (which will store the returned data, and possibly supply it to other
users). In this case, both are party to the initial request, and both have an
interest in the validity of both the initial data set, and any data contained
in later callback breaks. This is where the AFSCombineTokens operation comes in
to play. It allows both the user, and the cache manager to authenticate both
the request, and the response. Because the call is secured using a combination
of the user and CM keys, the user can't forge fileserver responses in order to
feed bogus data to the cache manager.
For the purposes of this discussion, we are only interested in the security of
extended callbacks. An attacker who can forge conventional callback breaks can
only cause performance degradation to a client. An attacker who can forge
extended callback breaks can insert arbitrary data into a clients cache. When
talking about security, we are actually interested in two distinct properties.
Firstly, it must be impossible for an attacker to forge callback breaks, and so
corrupt the contents of the cache. Secondly, it must be impossible for an
attacker to read callback breaks that are destined for another client. Extended
callbacks may contain sensitive file, or directory information that shouldn't
be disclosed to eavesdroppers.
At the moment, clients are identified by means of either a UUID or a host/port pair.
There's no cryptographically strong binding between the UUID and per-client-key. In a
world in which all clients were centrally registered, we could create this binding by
means of an identity (for example, each client has an
afs-client/<hostname>@REALM Kerberos principal). However, we want to be able to
support anonymous clients, so there's no need for central client registration. In
this world, the only way in which a UUID and key can be associated together is
through an assertion. In order to support truly anonymous schemes (where there isn't
even a unique ID provided with each key), we're also not relying on individual cache
manager identities.
SetCallbackKey provides the mechanism for performing that assertion. However,
because we have no trust in what has been asserted, we need to protect against
two different scenarios. Firstly, an attacker that gets there before the
current client, shouldn't be able to assert a key that then prevents a client
from using extended callbacks. Secondly, an attacker who arrives after the
current client shouldn't be able to assert a new key, and in doing so, gain the
ability to read all of the client's outstanding callback breaks.
The language contained in the draft was an attempt to balance these security
requirements against implementation complexity.
However, thinking about things further, I think there is an exploitable race
between a client making a request, and an attacker performing a forged
SetCallbackKey with the client's UUID. In order to prevent this race, we need
to only permit anonymous identities with a unique (or hard to collide)
identifier.
[The above background material included for completeness/preserving
history]
In this model, each time we receive a SetCallbackKey, we would record
the rxgk client identity which authenticated the RPC, and the key used.
We could maintain a LRU style list of these, up to some (implementation
defined) limit. When an identity is about to be removed for this list,
any callbacks held by that identity have to be transitioned to "normal"
callbacks.
My rough-sketch solution involved recording the CM uuid as well as the
client identity (and key, of course) used to authenticate the
SetCallBackKey RPC.
Only RPCs which are authenticated with identities on this list would be
eligible for extended callbacks. RPCs with different client identities,
or which are issued over non-rxgk security classes, would not receive
extended callbacks. Where we have callbacks for the same object
requested by multiple different client identities, the key of the most
recent identity used would be used to encrypt the callback.
Hmm, I may be confused about what "client identities" means here. All
tokens are the result of the AFSCombineTokens operation, but we must
consider at least ones with CM+user identity and just user identity. The
current text of the document (which has probably shaped my thinking)
requires only that one of the identities used for a callback-generating
RPC must match with the (single) identity used to perform SetCallBackKey.
In this context, I'm not sure I understand what the last quoted sentence
means.
Making all of this work complicates things significantly at the client,
which must now maintain an rxgk token signing service, so that it can
issue a proper token to the server for each key that it has in play,
such that it can then pull the key out of that token.
But this makes it sound like maybe "client identities" means that we are
requiring the full combined identity to match.
I will note for completeness (not sure if this is redundant given my
imcomplete understanding of the above) that just using a single client
identity (i.e., from a non-keyed CM) by itself to choose which callback
key to use is insufficient, as a single client principal may be using
multiple machines at once and generating callbacks. So, the uuid or
host/port pair must remain.
In any case, none of this has an obvious "AFSCombineTokens must change in
this way" leaping out at me.
-Ben
_______________________________________________
AFS3-standardization mailing list
[email protected]
http://lists.openafs.org/mailman/listinfo/afs3-standardization