summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorGeorge McCollister <george.mccollister@gmail.com>2019-02-25 10:37:09 -0600
committerRichard Purdie <richard.purdie@linuxfoundation.org>2019-03-24 16:49:54 +0000
commitc3890467ff6f79b87eb9dc3ed3a24b9318f257a3 (patch)
treef1819dc36a6ba91a692909fad4768b07b4a1a7da /meta
parentb3ed759360c8f5c4e4bf9eb939dd6617448d6bd7 (diff)
downloadpoky-c3890467ff6f79b87eb9dc3ed3a24b9318f257a3.tar.gz
systemd: Security fix CVE-2018-16864
Affects < v240 Based on thud commit 403e74b07b6f3c4a2444e68c74a8434fb17aee49 The patch in the thud commit doesn't compile against 237. Use the version of this patch, CVE-2018-16864.patch from systemd_237-3ubuntu10.13.debian. (From OE-Core rev: ddbe969d0c9052a3ae17ef8f1cec8da847c722d3) Signed-off-by: George McCollister <george.mccollister@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/recipes-core/systemd/systemd/0024-journald-do-not-store-the-iovec-entry-for-process-co.patch193
-rw-r--r--meta/recipes-core/systemd/systemd_237.bb1
2 files changed, 194 insertions, 0 deletions
diff --git a/meta/recipes-core/systemd/systemd/0024-journald-do-not-store-the-iovec-entry-for-process-co.patch b/meta/recipes-core/systemd/systemd/0024-journald-do-not-store-the-iovec-entry-for-process-co.patch
new file mode 100644
index 0000000000..c0b0667d85
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0024-journald-do-not-store-the-iovec-entry-for-process-co.patch
@@ -0,0 +1,193 @@
1From c29b44cb90e2cc521533e6169cf847553ebefd81 Mon Sep 17 00:00:00 2001
2From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
3Date: Wed, 5 Dec 2018 18:38:39 +0100
4Subject: [PATCH] journald: do not store the iovec entry for process
5 commandline on stack
6
7This fixes a crash where we would read the commandline, whose length is under
8control of the sending program, and then crash when trying to create a stack
9allocation for it.
10
11CVE-2018-16864
12https://bugzilla.redhat.com/show_bug.cgi?id=1653855
13
14The message actually doesn't get written to disk, because
15journal_file_append_entry() returns -E2BIG.
16
17Patch for 237 from:
18systemd_237-3ubuntu10.13.debian CVE-2018-16864.patch
19
20CVE: CVE-2018-16864
21Upstream-Status: Backport
22
23---
24 src/basic/io-util.c | 10 ++++++++++
25 src/basic/io-util.h | 2 ++
26 src/coredump/coredump.c | 31 +++++++++++--------------------
27 src/journal/journald-server.c | 25 +++++++++++++++----------
28 4 files changed, 38 insertions(+), 30 deletions(-)
29
30--- a/src/basic/io-util.c
31+++ b/src/basic/io-util.c
32@@ -26,6 +26,7 @@
33 #include <unistd.h>
34
35 #include "io-util.h"
36+#include "string-util.h"
37 #include "time-util.h"
38
39 int flush_fd(int fd) {
40@@ -270,3 +271,12 @@
41
42 return q - (const uint8_t*) p;
43 }
44+
45+char* set_iovec_string_field(struct iovec *iovec, size_t *n_iovec, const char *field, const char *value) {
46+ char *x;
47+
48+ x = strappend(field, value);
49+ if (x)
50+ iovec[(*n_iovec)++] = IOVEC_MAKE_STRING(x);
51+ return x;
52+}
53--- a/src/basic/io-util.h
54+++ b/src/basic/io-util.h
55@@ -91,3 +91,5 @@
56 #define IOVEC_MAKE(base, len) (struct iovec) IOVEC_INIT(base, len)
57 #define IOVEC_INIT_STRING(string) IOVEC_INIT((char*) string, strlen(string))
58 #define IOVEC_MAKE_STRING(string) (struct iovec) IOVEC_INIT_STRING(string)
59+
60+char* set_iovec_string_field(struct iovec *iovec, size_t *n_iovec, const char *field, const char *value);
61--- a/src/coredump/coredump.c
62+++ b/src/coredump/coredump.c
63@@ -1067,19 +1067,10 @@
64 return 0;
65 }
66
67-static char* set_iovec_field(struct iovec iovec[27], size_t *n_iovec, const char *field, const char *value) {
68- char *x;
69-
70- x = strappend(field, value);
71- if (x)
72- iovec[(*n_iovec)++] = IOVEC_MAKE_STRING(x);
73- return x;
74-}
75-
76 static char* set_iovec_field_free(struct iovec iovec[27], size_t *n_iovec, const char *field, char *value) {
77 char *x;
78
79- x = set_iovec_field(iovec, n_iovec, field, value);
80+ x = set_iovec_string_field(iovec, n_iovec, field, value);
81 free(value);
82 return x;
83 }
84@@ -1129,33 +1120,33 @@
85 disable_coredumps();
86 }
87
88- set_iovec_field(iovec, n_iovec, "COREDUMP_UNIT=", context[CONTEXT_UNIT]);
89+ set_iovec_string_field(iovec, n_iovec, "COREDUMP_UNIT=", context[CONTEXT_UNIT]);
90 }
91
92 if (cg_pid_get_user_unit(pid, &t) >= 0)
93 set_iovec_field_free(iovec, n_iovec, "COREDUMP_USER_UNIT=", t);
94
95 /* The next few are mandatory */
96- if (!set_iovec_field(iovec, n_iovec, "COREDUMP_PID=", context[CONTEXT_PID]))
97+ if (!set_iovec_string_field(iovec, n_iovec, "COREDUMP_PID=", context[CONTEXT_PID]))
98 return log_oom();
99
100- if (!set_iovec_field(iovec, n_iovec, "COREDUMP_UID=", context[CONTEXT_UID]))
101+ if (!set_iovec_string_field(iovec, n_iovec, "COREDUMP_UID=", context[CONTEXT_UID]))
102 return log_oom();
103
104- if (!set_iovec_field(iovec, n_iovec, "COREDUMP_GID=", context[CONTEXT_GID]))
105+ if (!set_iovec_string_field(iovec, n_iovec, "COREDUMP_GID=", context[CONTEXT_GID]))
106 return log_oom();
107
108- if (!set_iovec_field(iovec, n_iovec, "COREDUMP_SIGNAL=", context[CONTEXT_SIGNAL]))
109+ if (!set_iovec_string_field(iovec, n_iovec, "COREDUMP_SIGNAL=", context[CONTEXT_SIGNAL]))
110 return log_oom();
111
112- if (!set_iovec_field(iovec, n_iovec, "COREDUMP_RLIMIT=", context[CONTEXT_RLIMIT]))
113+ if (!set_iovec_string_field(iovec, n_iovec, "COREDUMP_RLIMIT=", context[CONTEXT_RLIMIT]))
114 return log_oom();
115
116- if (!set_iovec_field(iovec, n_iovec, "COREDUMP_COMM=", context[CONTEXT_COMM]))
117+ if (!set_iovec_string_field(iovec, n_iovec, "COREDUMP_COMM=", context[CONTEXT_COMM]))
118 return log_oom();
119
120 if (context[CONTEXT_EXE] &&
121- !set_iovec_field(iovec, n_iovec, "COREDUMP_EXE=", context[CONTEXT_EXE]))
122+ !set_iovec_string_field(iovec, n_iovec, "COREDUMP_EXE=", context[CONTEXT_EXE]))
123 return log_oom();
124
125 if (sd_pid_get_session(pid, &t) >= 0)
126@@ -1223,7 +1214,7 @@
127 iovec[(*n_iovec)++] = IOVEC_MAKE_STRING(t);
128
129 if (safe_atoi(context[CONTEXT_SIGNAL], &signo) >= 0 && SIGNAL_VALID(signo))
130- set_iovec_field(iovec, n_iovec, "COREDUMP_SIGNAL_NAME=SIG", signal_to_string(signo));
131+ set_iovec_string_field(iovec, n_iovec, "COREDUMP_SIGNAL_NAME=SIG", signal_to_string(signo));
132
133 return 0; /* we successfully acquired all metadata */
134 }
135--- a/src/journal/journald-server.c
136+++ b/src/journal/journald-server.c
137@@ -769,6 +769,7 @@
138 pid_t object_pid) {
139
140 char source_time[sizeof("_SOURCE_REALTIME_TIMESTAMP=") + DECIMAL_STR_MAX(usec_t)];
141+ _cleanup_free_ char *cmdline1 = NULL, *cmdline2 = NULL;
142 uid_t journal_uid;
143 ClientContext *o;
144
145@@ -785,20 +786,23 @@
146 IOVEC_ADD_NUMERIC_FIELD(iovec, n, c->uid, uid_t, uid_is_valid, UID_FMT, "_UID");
147 IOVEC_ADD_NUMERIC_FIELD(iovec, n, c->gid, gid_t, gid_is_valid, GID_FMT, "_GID");
148
149- IOVEC_ADD_STRING_FIELD(iovec, n, c->comm, "_COMM");
150- IOVEC_ADD_STRING_FIELD(iovec, n, c->exe, "_EXE");
151- IOVEC_ADD_STRING_FIELD(iovec, n, c->cmdline, "_CMDLINE");
152- IOVEC_ADD_STRING_FIELD(iovec, n, c->capeff, "_CAP_EFFECTIVE");
153+ IOVEC_ADD_STRING_FIELD(iovec, n, c->comm, "_COMM"); /* At most TASK_COMM_LENGTH (16 bytes) */
154+ IOVEC_ADD_STRING_FIELD(iovec, n, c->exe, "_EXE"); /* A path, so at most PATH_MAX (4096 bytes) */
155
156- IOVEC_ADD_SIZED_FIELD(iovec, n, c->label, c->label_size, "_SELINUX_CONTEXT");
157+ if (c->cmdline)
158+ /* At most _SC_ARG_MAX (2MB usually), which is too much to put on stack.
159+ * Let's use a heap allocation for this one. */
160+ cmdline1 = set_iovec_string_field(iovec, &n, "_CMDLINE=", c->cmdline);
161
162+ IOVEC_ADD_STRING_FIELD(iovec, n, c->capeff, "_CAP_EFFECTIVE"); /* Read from /proc/.../status */
163+ IOVEC_ADD_SIZED_FIELD(iovec, n, c->label, c->label_size, "_SELINUX_CONTEXT");
164 IOVEC_ADD_NUMERIC_FIELD(iovec, n, c->auditid, uint32_t, audit_session_is_valid, "%" PRIu32, "_AUDIT_SESSION");
165 IOVEC_ADD_NUMERIC_FIELD(iovec, n, c->loginuid, uid_t, uid_is_valid, UID_FMT, "_AUDIT_LOGINUID");
166
167- IOVEC_ADD_STRING_FIELD(iovec, n, c->cgroup, "_SYSTEMD_CGROUP");
168+ IOVEC_ADD_STRING_FIELD(iovec, n, c->cgroup, "_SYSTEMD_CGROUP"); /* A path */
169 IOVEC_ADD_STRING_FIELD(iovec, n, c->session, "_SYSTEMD_SESSION");
170 IOVEC_ADD_NUMERIC_FIELD(iovec, n, c->owner_uid, uid_t, uid_is_valid, UID_FMT, "_SYSTEMD_OWNER_UID");
171- IOVEC_ADD_STRING_FIELD(iovec, n, c->unit, "_SYSTEMD_UNIT");
172+ IOVEC_ADD_STRING_FIELD(iovec, n, c->unit, "_SYSTEMD_UNIT"); /* Unit names are bounded by UNIT_NAME_MAX */
173 IOVEC_ADD_STRING_FIELD(iovec, n, c->user_unit, "_SYSTEMD_USER_UNIT");
174 IOVEC_ADD_STRING_FIELD(iovec, n, c->slice, "_SYSTEMD_SLICE");
175 IOVEC_ADD_STRING_FIELD(iovec, n, c->user_slice, "_SYSTEMD_USER_SLICE");
176@@ -819,13 +823,14 @@
177 IOVEC_ADD_NUMERIC_FIELD(iovec, n, o->uid, uid_t, uid_is_valid, UID_FMT, "OBJECT_UID");
178 IOVEC_ADD_NUMERIC_FIELD(iovec, n, o->gid, gid_t, gid_is_valid, GID_FMT, "OBJECT_GID");
179
180+ /* See above for size limits, only ->cmdline may be large, so use a heap allocation for it. */
181 IOVEC_ADD_STRING_FIELD(iovec, n, o->comm, "OBJECT_COMM");
182 IOVEC_ADD_STRING_FIELD(iovec, n, o->exe, "OBJECT_EXE");
183- IOVEC_ADD_STRING_FIELD(iovec, n, o->cmdline, "OBJECT_CMDLINE");
184- IOVEC_ADD_STRING_FIELD(iovec, n, o->capeff, "OBJECT_CAP_EFFECTIVE");
185+ if (o->cmdline)
186+ cmdline2 = set_iovec_string_field(iovec, &n, "OBJECT_CMDLINE=", o->cmdline);
187
188+ IOVEC_ADD_STRING_FIELD(iovec, n, o->capeff, "OBJECT_CAP_EFFECTIVE");
189 IOVEC_ADD_SIZED_FIELD(iovec, n, o->label, o->label_size, "OBJECT_SELINUX_CONTEXT");
190-
191 IOVEC_ADD_NUMERIC_FIELD(iovec, n, o->auditid, uint32_t, audit_session_is_valid, "%" PRIu32, "OBJECT_AUDIT_SESSION");
192 IOVEC_ADD_NUMERIC_FIELD(iovec, n, o->loginuid, uid_t, uid_is_valid, UID_FMT, "OBJECT_AUDIT_LOGINUID");
193
diff --git a/meta/recipes-core/systemd/systemd_237.bb b/meta/recipes-core/systemd/systemd_237.bb
index 0296174b09..61d25e5135 100644
--- a/meta/recipes-core/systemd/systemd_237.bb
+++ b/meta/recipes-core/systemd/systemd_237.bb
@@ -57,6 +57,7 @@ SRC_URI += "file://touchscreen.rules \
57 file://0001-core-when-deserializing-state-always-use-read_line-L.patch \ 57 file://0001-core-when-deserializing-state-always-use-read_line-L.patch \
58 file://0001-chown-recursive-let-s-rework-the-recursive-logic-to-.patch \ 58 file://0001-chown-recursive-let-s-rework-the-recursive-logic-to-.patch \
59 file://0001-dhcp6-make-sure-we-have-enough-space-for-the-DHCP6-o.patch \ 59 file://0001-dhcp6-make-sure-we-have-enough-space-for-the-DHCP6-o.patch \
60 file://0024-journald-do-not-store-the-iovec-entry-for-process-co.patch \
60 " 61 "
61SRC_URI_append_qemuall = " file://0001-core-device.c-Change-the-default-device-timeout-to-2.patch" 62SRC_URI_append_qemuall = " file://0001-core-device.c-Change-the-default-device-timeout-to-2.patch"
62 63