diff options
author | Colin Walters <walters@redhat.com> | 2015-06-17 13:07:02 -0400 |
---|---|---|
committer | Colin Walters <walters@verbum.org> | 2015-06-17 13:18:17 -0400 |
commit | 493aa5dc1d278ab9097110c1262f5229bbaf1766 (patch) | |
tree | cfb67093a0c2dd23eec6fa5c5954ecd717809b49 /data | |
parent | ea544ffc18405237ccd95d28d7f45afef49aca17 (diff) | |
download | polkit-493aa5dc1d278ab9097110c1262f5229bbaf1766.tar.gz |
CVE-2015-4625: Bind use of cookies to specific uids
http://lists.freedesktop.org/archives/polkit-devel/2015-June/000425.html
The "cookie" value that Polkit hands out is global to all polkit
users. And when `AuthenticationAgentResponse` is invoked, we
previously only received the cookie and *target* identity, and
attempted to find an agent from that.
The problem is that the current cookie is just an integer
counter, and if it overflowed, it would be possible for
an successful authorization in one session to trigger a response
in another session.
The overflow and ability to guess the cookie were fixed by the
previous patch.
This patch is conceptually further hardening on top of that. Polkit
currently treats uids as equivalent from a security domain
perspective; there is no support for
SELinux/AppArmor/etc. differentiation.
We can retrieve the uid from `getuid()` in the setuid helper, which
allows us to ensure the uid invoking `AuthenticationAgentResponse2`
matches that of the agent.
Then the authority only looks at authentication sessions matching the
cookie that were created by a matching uid, thus removing the ability
for different uids to interfere with each other entirely.
Several fixes to this patch were contributed by:
Miloslav Trmač <mitr@redhat.com>
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=90837
CVE: CVE-2015-4625
Reported-by: Tavis Ormandy <taviso@google.com>
Reviewed-by: Miloslav Trmač <mitr@redhat.com>
Signed-off-by: Colin Walters <walters@redhat.com>
Diffstat (limited to 'data')
-rw-r--r-- | data/org.freedesktop.PolicyKit1.AuthenticationAgent.xml | 14 | ||||
-rw-r--r-- | data/org.freedesktop.PolicyKit1.Authority.xml | 24 |
2 files changed, 36 insertions, 2 deletions
diff --git a/data/org.freedesktop.PolicyKit1.AuthenticationAgent.xml b/data/org.freedesktop.PolicyKit1.AuthenticationAgent.xml index 3b519c2..5beef7d 100644 --- a/data/org.freedesktop.PolicyKit1.AuthenticationAgent.xml +++ b/data/org.freedesktop.PolicyKit1.AuthenticationAgent.xml @@ -8,7 +8,19 @@ <annotation name="org.gtk.EggDBus.DocString" value="<para>This D-Bus interface is used for communication between the system-wide PolicyKit daemon and one or more authentication agents each running in a user session.</para><para>An authentication agent must implement this interface and register (passing the object path of the object implementing the interface) using the org.freedesktop.PolicyKit1.Authority.RegisterAuthenticationAgent() and org.freedesktop.PolicyKit1.Authority.UnregisterAuthenticationAgent() methods on the #org.freedesktop.PolicyKit1.Authority interface of the PolicyKit daemon.</para>"/> <method name="BeginAuthentication"> - <annotation name="org.gtk.EggDBus.DocString" value="<para>Called by the PolicyKit daemon when the authentication agent needs the user to authenticate as one of the identities in @identities for the action with the identifier @action_id.</para><para>Upon succesful authentication, the authentication agent must invoke the org.freedesktop.PolicyKit1.Authority.AuthenticationAgentResponse() method on the #org.freedesktop.PolicyKit1.Authority interface of the PolicyKit daemon before returning.</para><para>If the user dismisses the authentication dialog, the authentication agent should return an error.</para>"/> + <annotation name="org.gtk.EggDBus.DocString" value="<para>Called + by the PolicyKit daemon when the authentication agent needs the + user to authenticate as one of the identities in @identities for + the action with the identifier @action_id.</para><para>This + authentication is normally achieved via the + polkit_agent_session_response() API, which invokes a private + setuid helper process to verify the authentication. When + successful, it calls the + org.freedesktop.PolicyKit1.Authority.AuthenticationAgentResponse2() + method on the #org.freedesktop.PolicyKit1.Authority interface of + the PolicyKit daemon before returning. If the user dismisses the + authentication dialog, the authentication agent should call + polkit_agent_session_cancel().</para>"/> <arg name="action_id" direction="in" type="s"> <annotation name="org.gtk.EggDBus.DocString" value="The identifier for the action that the user is authentication for."/> diff --git a/data/org.freedesktop.PolicyKit1.Authority.xml b/data/org.freedesktop.PolicyKit1.Authority.xml index fbfb9cd..f9021ee 100644 --- a/data/org.freedesktop.PolicyKit1.Authority.xml +++ b/data/org.freedesktop.PolicyKit1.Authority.xml @@ -313,7 +313,29 @@ </method> <method name="AuthenticationAgentResponse"> - <annotation name="org.gtk.EggDBus.DocString" value="Method for authentication agents to invoke on successful authentication. This method will fail unless a sufficiently privileged caller invokes it."/> + <annotation name="org.gtk.EggDBus.DocString" value="Method for authentication agents to invoke on successful +authentication, intended only for use by a privileged helper process +internal to polkit."/> + + <arg name="cookie" direction="in" type="s"> + <annotation name="org.gtk.EggDBus.DocString" value="The cookie identifying the authentication request that was passed to the authentication agent."/> + </arg> + + <arg name="identity" direction="in" type="(sa{sv})"> + <annotation name="org.gtk.EggDBus.Type" value="Identity"/> + <annotation name="org.gtk.EggDBus.DocString" value="A #Identity struct describing what identity was authenticated."/> + </arg> + </method> + + <method name="AuthenticationAgentResponse2"> + <annotation name="org.gtk.EggDBus.DocString" value="Method for authentication agents to invoke on successful +authentication, intended only for use by a privileged helper process +internal to polkit. Note this method was added in 0.114, and should be preferred over AuthenticationAgentResponse +as it fixes a security issue."/> + + <arg name="uid" direction="in" type="u"> + <annotation name="org.gtk.EggDBus.DocString" value="The real uid of the agent. Normally set by the setuid helper program."/> + </arg> <arg name="cookie" direction="in" type="s"> <annotation name="org.gtk.EggDBus.DocString" value="The cookie identifying the authentication request that was passed to the authentication agent."/> |