_dbus_read_socket_with_unix_fds: do not accept extra fds in cmsg padding
authorSimon McVittie <simon.mcvittie@collabora.co.uk>
Tue, 9 Sep 2014 11:44:22 +0000 (12:44 +0100)
committerSimon McVittie <simon.mcvittie@collabora.co.uk>
Mon, 15 Sep 2014 11:31:14 +0000 (12:31 +0100)
commitee11ec12566afda5dee8a3a834274421a20661de
tree1b20a13556d94eb9083cdec1d69d08bb7d1b2b36
parentf70c0e98c5cc6eaae4727d14c389e2504e79e694
_dbus_read_socket_with_unix_fds: do not accept extra fds in cmsg padding

This addresses CVE-2014-3635.

If (*n_fds * sizeof (int) % sizeof (size_t)) is nonzero,
then CMSG_SPACE (*n_fds * sizeof (int)) > CMSG_LEN (*n_fds * sizeof (int)
because the SPACE includes padding to a size_t boundary, whereas the LEN
does not. We have to allocate the SPACE. Previously, we told the kernel
that the buffer size we wanted was the SPACE, not the LEN, which meant
it was free to fill the padding with additional fds: on a 64-bit
platform with 32-bit int, that's one extra fd, if *n_fds happens
to be odd.

This meant that a malicious sender could send exactly 1 fd too many,
which would make us fail an assertion if enabled, or overrun a buffer
by 1 fd otherwise.

Bug: https://bugs.freedesktop.org/show_bug.cgi?id=83622
Reviewed-by: Alban Crequy <alban.crequy@collabora.co.uk>
dbus/dbus-sysdeps-unix.c