[PKG-OpenRC-Debian] Bug#832940: closing fd 0, 1, 2 can break daemons

Jon Boden jon at ubuntubsd.org
Fri Jul 29 20:01:38 UTC 2016


Package: openrc
Version: 0.21-1
Severity: important

Hi

openrc's behaviour of closing fd 0,1,2 can potentially break daemons. An example of this was found with dbus 1.10.6-1ubuntu3 on ubuntuBSD (however the openrc version this report is based on, is imported pristine from Debian).

Below are excerpts from ktrace/kdump output of dbus-daemon (when being called by openrc).

First a socket is created and assigned fd 0 because it's the first free fd:

  1057 dbus-daemon CALL  socket(PF_LOCAL,SOCK_CLOEXEC|SOCK_STREAM,0)
  1057 dbus-daemon RET   socket 0
  1057 dbus-daemon CALL  stat(0x635520,0x7fffffffe480)
  1057 dbus-daemon NAMI  "/var/run/dbus/system_bus_socket"
  1057 dbus-daemon RET   stat -1 errno 2 No such file or directory
  1057 dbus-daemon CALL  bind(0,0x7fffffffe520,0x21)
  1057 dbus-daemon STRU  struct sockaddr { AF_LOCAL, /var/run/dbus/system_bus_socket }
  1057 dbus-daemon NAMI  "/var/run/dbus/system_bus_socket"
  1057 dbus-daemon RET   bind 0
  1057 dbus-daemon CALL  listen(0,0x1e)
  1057 dbus-daemon RET   listen 0
  1057 dbus-daemon CALL  fcntl(0,F_GETFL,0)
  1057 dbus-daemon RET   fcntl 2
  1057 dbus-daemon CALL  fcntl(0,F_SETFL,0x6<O_RDWR|O_NONBLOCK>)
  1057 dbus-daemon RET   fcntl 0
  1057 dbus-daemon CALL  chmod(0x635520,0x1ff<S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IWGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH>)
  1057 dbus-daemon NAMI  "/var/run/dbus/system_bus_socket"
  1057 dbus-daemon RET   chmod 0

then another routine in dbus closes fds 0,1,2, replacing them with /dev/null descriptors. Obviously it intends to disable stdio however unknowingly it is actually closing the socket:

  1058 dbus-daemon CALL  open(0x427733,0x2<O_RDWR>,<unused>0)
  1058 dbus-daemon NAMI  "/dev/null"
  1058 dbus-daemon RET   open 3
  1058 dbus-daemon CALL  dup2(0x3,0)
  1058 dbus-daemon RET   dup2 0
  1058 dbus-daemon CALL  dup2(0x3,0x1)
  1058 dbus-daemon RET   dup2 1
  1058 dbus-daemon CALL  issetugid
  1058 dbus-daemon RET   issetugid 0
  1058 dbus-daemon CALL  dup2(0x3,0x2)
  1058 dbus-daemon RET   dup2 2
  1058 dbus-daemon CALL  close(0x3)
  1058 dbus-daemon RET   close 0

then operations on the socket fail, leaving the system with a broken dbus:

  1058 dbus-daemon CALL  accept4(0,0x7fffffffe5b0,0x7fffffffe5ac,0x10000000)
  1058 dbus-daemon RET   accept4 -1 errno 38 Socket operation on non-socket
  1058 dbus-daemon CALL  fcntl(0xffffffff,F_GETFD,0)
  1058 dbus-daemon RET   fcntl -1 errno 9 Bad file descriptor

If you want to disable stdio I think it would be much better to replace them with /dev/null descriptors. Too many apps assume fds 0,1,2 are reserved for stdio. Leaving them free for any other use is dangerous IMHO.

-- 
Jon Boden

ubuntuBSD -- The power of FreeBSD kernel with familiarity of Ubuntu OS!

http://www.ubuntubsd.org/ -- https://twitter.com/ubuntuBSD



More information about the OpenRC-devel mailing list