summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrii Bordunov via Openembedded-core <openembedded-core@lists.openembedded.org>2019-08-13 23:25:56 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2019-10-08 22:52:28 +0100
commitfe27c50545eef60837733feab5ed5a2f6b83e518 (patch)
treeca090bee7a8db8e7ee00dd07f7e1877106e2e36a
parent1b628384281a809ea8a23904fb628fdafa52e0d2 (diff)
downloadpoky-fe27c50545eef60837733feab5ed5a2f6b83e518.tar.gz
dbus: fix CVE-2019-12749
(From OE-Core rev: 144363decc922ed03a584eb9b29cf9808a469d08) Signed-off-by: Kevin Weng <t-keweng@microsoft.com> Signed-off-by: Armin Kuster <akuster808@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/recipes-core/dbus/dbus/CVE-2019-12749.patch127
-rw-r--r--meta/recipes-core/dbus/dbus_1.12.10.bb1
2 files changed, 128 insertions, 0 deletions
diff --git a/meta/recipes-core/dbus/dbus/CVE-2019-12749.patch b/meta/recipes-core/dbus/dbus/CVE-2019-12749.patch
new file mode 100644
index 0000000000..393c70ca21
--- /dev/null
+++ b/meta/recipes-core/dbus/dbus/CVE-2019-12749.patch
@@ -0,0 +1,127 @@
1From f0120c5d97a4cc1b659e86d38f2b1f646ca20ea3 Mon Sep 17 00:00:00 2001
2From: Simon McVittie <smcv@collabora.com>
3Date: Thu, 30 May 2019 12:53:03 +0100
4Subject: [PATCH] auth: Reject DBUS_COOKIE_SHA1 for users other than the server
5 owner
6
7The DBUS_COOKIE_SHA1 authentication mechanism aims to prove ownership
8of a shared home directory by having the server write a secret "cookie"
9into a .dbus-keyrings subdirectory of the desired identity's home
10directory with 0700 permissions, and having the client prove that it can
11read the cookie. This never actually worked for non-malicious clients in
12the case where server uid != client uid (unless the server and client
13both have privileges, such as Linux CAP_DAC_OVERRIDE or traditional
14Unix uid 0) because an unprivileged server would fail to write out the
15cookie, and an unprivileged client would be unable to read the resulting
16file owned by the server.
17
18Additionally, since dbus 1.7.10 we have checked that ~/.dbus-keyrings
19is owned by the uid of the server (a side-effect of a check added to
20harden our use of XDG_RUNTIME_DIR), further ruling out successful use
21by a non-malicious client with a uid differing from the server's.
22
23Joe Vennix of Apple Information Security discovered that the
24implementation of DBUS_COOKIE_SHA1 was susceptible to a symbolic link
25attack: a malicious client with write access to its own home directory
26could manipulate a ~/.dbus-keyrings symlink to cause the DBusServer to
27read and write in unintended locations. In the worst case this could
28result in the DBusServer reusing a cookie that is known to the
29malicious client, and treating that cookie as evidence that a subsequent
30client connection came from an attacker-chosen uid, allowing
31authentication bypass.
32
33This is mitigated by the fact that by default, the well-known system
34dbus-daemon (since 2003) and the well-known session dbus-daemon (in
35stable releases since dbus 1.10.0 in 2015) only accept the EXTERNAL
36authentication mechanism, and as a result will reject DBUS_COOKIE_SHA1
37at an early stage, before manipulating cookies. As a result, this
38vulnerability only applies to:
39
40* system or session dbus-daemons with non-standard configuration
41* third-party dbus-daemon invocations such as at-spi2-core (although
42 in practice at-spi2-core also only accepts EXTERNAL by default)
43* third-party uses of DBusServer such as the one in Upstart
44
45Avoiding symlink attacks in a portable way is difficult, because APIs
46like openat() and Linux /proc/self/fd are not universally available.
47However, because DBUS_COOKIE_SHA1 already doesn't work in practice for
48a non-matching uid, we can solve this vulnerability in an easier way
49without regressions, by rejecting it early (before looking at
50~/.dbus-keyrings) whenever the requested identity doesn't match the
51identity of the process hosting the DBusServer.
52
53Signed-off-by: Simon McVittie <smcv@collabora.com>
54Closes: https://gitlab.freedesktop.org/dbus/dbus/issues/269
55Closes: CVE-2019-12749
56
57Upstream-Status: Backport
58[https://gitlab.freedesktop.org/dbus/dbus/commit
59/47b1a4c41004bf494b87370987b222c934b19016]
60
61CVE: CVE-2019-12749
62
63Signed-off-by: Kevin Weng <t-keweng@microsoft.com>
64---
65 dbus/dbus-auth.c | 32 ++++++++++++++++++++++++++++++++
66 1 file changed, 32 insertions(+)
67
68diff --git a/dbus/dbus-auth.c b/dbus/dbus-auth.c
69index 37d8d4c9..7390a9d5 100644
70--- a/dbus/dbus-auth.c
71+++ b/dbus/dbus-auth.c
72@@ -529,6 +529,7 @@ sha1_handle_first_client_response (DBusAuth *auth,
73 DBusString tmp2;
74 dbus_bool_t retval = FALSE;
75 DBusError error = DBUS_ERROR_INIT;
76+ DBusCredentials *myself = NULL;
77
78 _dbus_string_set_length (&auth->challenge, 0);
79
80@@ -565,6 +566,34 @@ sha1_handle_first_client_response (DBusAuth *auth,
81 return FALSE;
82 }
83
84+ myself = _dbus_credentials_new_from_current_process ();
85+
86+ if (myself == NULL)
87+ goto out;
88+
89+ if (!_dbus_credentials_same_user (myself, auth->desired_identity))
90+ {
91+ /*
92+ * DBUS_COOKIE_SHA1 is not suitable for authenticating that the
93+ * client is anyone other than the user owning the process
94+ * containing the DBusServer: we probably aren't allowed to write
95+ * to other users' home directories. Even if we can (for example
96+ * uid 0 on traditional Unix or CAP_DAC_OVERRIDE on Linux), we
97+ * must not, because the other user controls their home directory,
98+ * and could carry out symlink attacks to make us read from or
99+ * write to unintended locations. It's difficult to avoid symlink
100+ * attacks in a portable way, so we just don't try. This isn't a
101+ * regression, because DBUS_COOKIE_SHA1 never worked for other
102+ * users anyway.
103+ */
104+ _dbus_verbose ("%s: client tried to authenticate as \"%s\", "
105+ "but that doesn't match this process",
106+ DBUS_AUTH_NAME (auth),
107+ _dbus_string_get_const_data (data));
108+ retval = send_rejected (auth);
109+ goto out;
110+ }
111+
112 /* we cache the keyring for speed, so here we drop it if it's the
113 * wrong one. FIXME caching the keyring here is useless since we use
114 * a different DBusAuth for every connection.
115@@ -679,6 +708,9 @@ sha1_handle_first_client_response (DBusAuth *auth,
116 _dbus_string_zero (&tmp2);
117 _dbus_string_free (&tmp2);
118
119+ if (myself != NULL)
120+ _dbus_credentials_unref (myself);
121+
122 return retval;
123 }
124
125--
1262.22.0
127
diff --git a/meta/recipes-core/dbus/dbus_1.12.10.bb b/meta/recipes-core/dbus/dbus_1.12.10.bb
index d71f7f7042..d7ad1d8be4 100644
--- a/meta/recipes-core/dbus/dbus_1.12.10.bb
+++ b/meta/recipes-core/dbus/dbus_1.12.10.bb
@@ -16,6 +16,7 @@ SRC_URI = "http://dbus.freedesktop.org/releases/dbus/dbus-${PV}.tar.gz \
16 file://tmpdir.patch \ 16 file://tmpdir.patch \
17 file://dbus-1.init \ 17 file://dbus-1.init \
18 file://clear-guid_from_server-if-send_negotiate_unix_f.patch \ 18 file://clear-guid_from_server-if-send_negotiate_unix_f.patch \
19 file://CVE-2019-12749.patch \
19" 20"
20 21
21SRC_URI[md5sum] = "c3e12b4206e2a7da39d7cc42567790ef" 22SRC_URI[md5sum] = "c3e12b4206e2a7da39d7cc42567790ef"