123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- From 70dbfc68a79faac49bd3423e079cb6902522082a Mon Sep 17 00:00:00 2001
- From: Simon McVittie <smcv@collabora.com>
- Date: Wed, 5 Jun 2019 13:33:38 +0100
- Subject: [PATCH] gvfsdaemon: Check that the connecting client is the same user
- Otherwise, an attacker who learns the abstract socket address from
- netstat(8) or similar could connect to it and issue D-Bus method
- calls.
- Signed-off-by: Simon McVittie <smcv@collabora.com>
- [Retrieved from:
- https://gitlab.gnome.org/GNOME/gvfs/commit/70dbfc68a79faac49bd3423e079cb6902522082a]
- Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
- ---
- daemon/gvfsdaemon.c | 36 +++++++++++++++++++++++++++++++++++-
- 1 file changed, 35 insertions(+), 1 deletion(-)
- diff --git a/daemon/gvfsdaemon.c b/daemon/gvfsdaemon.c
- index 406d4f8e..be148a7b 100644
- --- a/daemon/gvfsdaemon.c
- +++ b/daemon/gvfsdaemon.c
- @@ -79,6 +79,7 @@ struct _GVfsDaemon
-
- gint mount_counter;
-
- + GDBusAuthObserver *auth_observer;
- GDBusConnection *conn;
- GVfsDBusDaemon *daemon_skeleton;
- GVfsDBusMountable *mountable_skeleton;
- @@ -171,6 +172,8 @@ g_vfs_daemon_finalize (GObject *object)
- }
- if (daemon->conn != NULL)
- g_object_unref (daemon->conn);
- + if (daemon->auth_observer != NULL)
- + g_object_unref (daemon->auth_observer);
-
- g_hash_table_destroy (daemon->registered_paths);
- g_hash_table_destroy (daemon->client_connections);
- @@ -236,6 +239,35 @@ name_vanished_handler (GDBusConnection *connection,
- daemon->lost_main_daemon = TRUE;
- }
-
- +/*
- + * Authentication observer signal handler that authorizes connections
- + * from the same uid as this process. This matches the behaviour of a
- + * libdbus DBusServer/DBusConnection when no DBusAllowUnixUserFunction
- + * has been set, but is not the default in GDBus.
- + */
- +static gboolean
- +authorize_authenticated_peer_cb (GDBusAuthObserver *observer,
- + G_GNUC_UNUSED GIOStream *stream,
- + GCredentials *credentials,
- + G_GNUC_UNUSED gpointer user_data)
- +{
- + gboolean authorized = FALSE;
- +
- + if (credentials != NULL)
- + {
- + GCredentials *own_credentials;
- +
- + own_credentials = g_credentials_new ();
- +
- + if (g_credentials_is_same_user (credentials, own_credentials, NULL))
- + authorized = TRUE;
- +
- + g_object_unref (own_credentials);
- + }
- +
- + return authorized;
- +}
- +
- static void
- g_vfs_daemon_init (GVfsDaemon *daemon)
- {
- @@ -265,6 +297,8 @@ g_vfs_daemon_init (GVfsDaemon *daemon)
-
- daemon->conn = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
- g_assert (daemon->conn != NULL);
- + daemon->auth_observer = g_dbus_auth_observer_new ();
- + g_signal_connect (daemon->auth_observer, "authorize-authenticated-peer", G_CALLBACK (authorize_authenticated_peer_cb), NULL);
-
- daemon->daemon_skeleton = gvfs_dbus_daemon_skeleton_new ();
- g_signal_connect (daemon->daemon_skeleton, "handle-get-connection", G_CALLBACK (handle_get_connection), daemon);
- @@ -876,7 +910,7 @@ handle_get_connection (GVfsDBusDaemon *object,
- server = g_dbus_server_new_sync (address1,
- G_DBUS_SERVER_FLAGS_NONE,
- guid,
- - NULL, /* GDBusAuthObserver */
- + daemon->auth_observer,
- NULL, /* GCancellable */
- &error);
- g_free (guid);
- --
- 2.24.1
|