On Wed, Jun 3, 2015, at 03:40 PM, Miloslav Trmač wrote:
> 
> Isn’t this a privilege escalation actually?
> 
> Mallory creates creates auth_admin* sessions for all possible cookie values, 
> and waits for Alice to (or social-engineers Alice to) create a new auth_admin 
> session for an unrelated purpose and to authenticate as the admin. Then, 
> depending on the hash order in get_authentication_session_for_cooke, Alice’s 
> authentication may in fact apply to one of Mallory’s sessions. Sure, one 
> effect would be that Alice’s polkit authentication session is not 
> authenticated and her authorization request fails, but the more important 
> effect is that Mallory’s authorization request succeds as properly 
> authenticated by $admin.

Yes, I think you're right.

So...I submitted https://bugs.freedesktop.org/show_bug.cgi?id=90832 while 
working on this, but I accidentally pushed it =/  Want to post-commit review?  
Or should I just revert it?

I'm still thinking about stronger approaches.  I think the strongest thing we 
could do would be to enforce the binding of cookie -> agent.  Given that there 
can be at most one agent per uid, and we always expect that the reply comes 
from that same uid, we could bind cookie <-> uid <-> agent.  However, because 
of the setuid binary, we don't know the invoking uid.  

# Idea 1: Pass and verify uid 
 - Add a new API AuthenticationAgentResponse2 which also takes a uint32 uid.
 - Change polkit-agent-helper-1 to read the real uid, and try calling the new 
API, falling back if it doesn't exist (for the case where a package is upgraded 
but the service wasn't restarted)
 - Change get_authentication_session_for_cookie() to match session->subject 
with that uid

# Idea 2: Make cookies secure
 - Raw cookie is g_strdup_printf ("cookie-%s-%u", random_cookie, uid)
 - Daemon has a secret key generated on startup
 - Compute an HMAC[1] over the raw cookie, using the secret key
 - Verify HMAC in AuthenticationAgentResponse

  I did something like this for the original Cockpit auth where the cookie is 
literally a
  web browser cookie which is a cache of Cockpit verifying username+password,
  along with a timestamp so it can be expired.

[1] http://en.wikipedia.org/wiki/Hash-based_message_authentication_code


_______________________________________________
polkit-devel mailing list
polkit-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/polkit-devel

Reply via email to