dbus: add upstream patch to fix startup hang with with expat >= 2.2.1
PATCH 1/1 dbus: add upstream patch to fix startup hang with with expat >= 2.2.1
After c0ad6ded018ffbc33f7f5 expat: security bump to version 2.2.1 the system can hang on startup under certain circumstances.
This happens when:
* we use systemd as init system
* the random nonblocking pool takes a while to initialize
* this apparently doesn't happen on qemu, so this would not have been caught by the runtime testing infrastructure
* it also doesn't seem to happen when network booting
For a more detailed description of the bug see here:
https://bugs.freedesktop.org/show_bug.cgi?id=101858
The patch should be in next dbus version 1.10.24
Set DBUS_AUTORECONF = YES because configure.ac is changed.
---
I think this should also go into the stable 2017.02.x and 2017.05.x branches as they received the expat bump but won't be receiving the fix in the next dbus version.
--- ...er-expat-Tell-Expat-not-to-defend-against.patch | 75 ++++++++++++++++++++++ package/dbus/dbus.mk | 3 + 2 files changed, 78 insertions(+) create mode 100644 package/dbus/0001-config-loader-expat-Tell-Expat-not-to-defend-against.patch
package/dbus/0001-config-loader-expat-Tell-Expat-not-to-defend-against.patch new file +75 -0
@@ -0,0 +1,75 @@ +From 1252dc1d1f465b8ab6b36ff7252e395e66a040cf Mon Sep 17 00:00:00 2001 +From: Simon McVittie <[email protected]> +Date: Fri, 21 Jul 2017 10:46:39 +0100 +Subject: [PATCH 1/2] config-loader-expat: Tell Expat not to defend against + hash collisions + +By default, Expat uses cryptographic-quality random numbers as a salt for +its hash algorithm, and since 2.2.1 it gets them from the getrandom +syscall on Linux. That syscall refuses to return any entropy until the +kernel's CSPRNG (random pool) has been initialized. Unfortunately, this +can take as long as 40 seconds on embedded devices with few entropy +sources, which is too long: if the system dbus-daemon blocks for that +length of time, important D-Bus clients like systemd and systemd-logind +time out and fail to connect to it. + +We're parsing small configuration files here, and we trust them +completely, so we don't need to defend against hash collisions: nobody +is going to be crafting them to cause pathological performance. + +Bug: https://bugs.freedesktop.org/show_bug.cgi?id=101858 +Signed-off-by: Simon McVittie <[email protected]> +Tested-by: Christopher Hewitt <[email protected]> +Reviewed-by: Philip Withnall <[email protected]> +--- + bus/config-loader-expat.c | 14 ++++++++++++++ + configure.ac | 8 ++++++++ + 2 files changed, 22 insertions(+) + +diff --git a/bus/config-loader-expat.c b/bus/config-loader-expat.c +index b571fda3..27cbe2d0 100644 +--- a/bus/config-loader-expat.c ++++ b/bus/config-loader-expat.c +@@ -203,6 +203,20 @@ bus_config_load (const DBusString *file, + goto failed; + } + ++ /* We do not need protection against hash collisions (CVE-2012-0876) ++ * because we are only parsing trusted XML; and if we let Expat block ++ * waiting for the CSPRNG to be initialized, as it does by default to ++ * defeat CVE-2012-0876, it can cause timeouts during early boot on ++ * entropy-starved embedded devices. ++ * ++ * TODO: When Expat gets a more explicit API for this than ++ * XML_SetHashSalt, check for that too, and use it preferentially. ++ * https://github.com/libexpat/libexpat/issues/91 */ ++#if defined(HAVE_XML_SETHASHSALT) ++ /* Any nonzero number will do. https://xkcd.com/221/ */ ++ XML_SetHashSalt (expat, 4); ++#endif ++ + if (!_dbus_string_get_dirname (file, &dirname)) + { + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); +diff --git a/configure.ac b/configure.ac +index 52da11fb..c4022ed7 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -938,6 +938,14 @@ XML_CFLAGS= + AC_SUBST([XML_CFLAGS]) + AC_SUBST([XML_LIBS]) + ++save_cflags="$CFLAGS" ++save_libs="$LIBS" ++CFLAGS="$CFLAGS $XML_CFLAGS" ++LIBS="$LIBS $XML_LIBS" ++AC_CHECK_FUNCS([XML_SetHashSalt]) ++CFLAGS="$save_cflags" ++LIBS="$save_libs" ++ + # Thread lib detection + AC_ARG_VAR([THREAD_LIBS]) + save_libs="$LIBS" +-- +2.11.0 +
package/dbus/dbus.mk +3 -0
@@ -6,6 +6,9 @@ DBUS_VERSION = 1.10.22 DBUS_SITE = https://dbus.freedesktop.org/releases/dbus + +# 0001-config-loader-expat-Tell-Expat-not-to-defend-against.patch +DBUS_AUTORECONF = YES DBUS_LICENSE = AFL-2.1 or GPL-2.0+ (library, tools), GPL-2.0+ (tools) DBUS_LICENSE_FILES = COPYING DBUS_INSTALL_STAGING = YES
Signature · 1 line
2.11.0
PATCH 1/1 dbus: add upstream patch to fix startup hang with with expat >= 2.2.1
Hi Marcus,
Quoted 15 lines · Marcus Hoffmann
After
c0ad6ded018ffbc33f7f5expat: security bump to version 2.2.1 the system can hang on startup under certain circumstances.This happens when:
* we use systemd as init system
* the random nonblocking pool takes a while to initialize
* this apparently doesn't happen on qemu, so this would not have been caught by the runtime testing infrastructure
* it also doesn't seem to happen when network bootingFor a more detailed description of the bug see here:
https://bugs.freedesktop.org/show_bug.cgi?id=101858The patch should be in next dbus version 1.10.24
Quoted 7 lines
Set
DBUS_AUTORECONF= YES because configure.ac is changed.Signed-off-by Marcus Hoffmann <[email protected]>---
I think this should also go into the stable 2017.02.x and 2017.05.x branches as they received the expat bump but won't be receiving the fix in the next dbus version.
Yes indeed! Better put Peter in Cc to make sure he sees this.
[snip]
Quoted 1 line
+Subject: [PATCH 1/2] config-loader-expat: Tell Expat not to defend against
Generate patches with 'git format-patch -N' so the 1/2 isn't there.
Quoted 9 lines
+ hash collisions
package/dbus/0001-config-loader-expat-Tell-Expat-not-to-defend-against.patch new file +8
-0+ +By default, Expat uses cryptographic-quality random numbers as a salt for +its hash algorithm, and since 2.2.1 it gets them from the getrandom +syscall on Linux. That syscall refuses to return any entropy until the +kernel's CSPRNG (random pool) has been initialized. Unfortunately, this +can take as long as 40 seconds on embedded devices with few entropy +sources, which is too long: if the system dbus-daemon blocks for that +length of time, important D-Bus clients like systemd and systemd-logind
package/dbus/0001-config-loader-expat-Tell-Expat-not-to-defend-against.patch line 23
Quoted 10 lines
package/dbus/0001-config-loader-expat-Tell-Expat-not-to-defend-against.patch new file +10
-0+time out and fail to connect to it. + +We're parsing small configuration files here, and we trust them +completely, so we don't need to defend against hash collisions: nobody +is going to be crafting them to cause pathological performance. + +Bug: https://bugs.freedesktop.org/show_bug.cgi?id=101858 +Signed-off-by: Simon McVittie <[email protected]> +Tested-by: Christopher Hewitt <[email protected]> +Reviewed-by: Philip Withnall <[email protected]>
Add your own Signed-off-by (because you're in the delivery path of this patch),
and also the upstream commit ID. It happens to be the same one as the From line, but often people change the commit locally (e.g. to add Signed-off-by) so it's clearer and unambiguous if specified explicitly. Something like:
Upstream commit 1252dc1d1f465b8ab6b36ff7252e395e66a040cf
Signed-off-by: Marcus ...
(Note that the latter rule isn't followed by many people, but I like to improve
things :-).
I've applied to master with those minor changes.
Regards,
Arnout
[snip]
Signature · 6 lines
Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF
PATCH 1/1 dbus: add upstream patch to fix startup hang with with expat >= 2.2.1
In reply to Marcus HoffmannQuoted 17 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Marcus" == Marcus Hoffmann <[email protected]> writes:
After
c0ad6ded018ffbc33f7f5expat: security bump to version 2.2.1 the system can hang on startup under certain circumstances.This happens when:
* we use systemd as init system
* the random nonblocking pool takes a while to initialize
* this apparently doesn't happen on qemu, so this would not have been caught by the runtime testing infrastructure
* it also doesn't seem to happen when network bootingFor a more detailed description of the bug see here:
https://bugs.freedesktop.org/show_bug.cgi?id=101858The patch should be in next dbus version 1.10.24
Quoted 7 lines
Set
DBUS_AUTORECONF= YES because configure.ac is changed.Signed-off-by Marcus Hoffmann <[email protected]>---
I think this should also go into the stable 2017.02.x and 2017.05.x branches as they received the expat bump but won't be receiving the fix in the next dbus version.
Committed to 2017.02.x, thanks.
Signature · 1 line
Bye, Peter Korsgaard