Thread (19 messages) 19 messages, 6 authors, 2020-09-17

Re: [PATCH v5 1/3] open: add close_range()

From: Kyle Evans <hidden>
Date: 2020-06-06 03:11:32
Also in: linux-fsdevel, lkml

On Fri, Jun 5, 2020 at 9:54 PM Kyle Evans [off-list ref] wrote:
On Fri, Jun 5, 2020 at 9:55 AM Szabolcs Nagy [off-list ref] wrote:
quoted
* Christian Brauner [off-list ref] [2020-06-02 22:42:17 +0200]:
quoted
[... snip ...]

First, it helps to close all file descriptors of an exec()ing task. This
can be done safely via (quoting Al's example from [1] verbatim):

        /* that exec is sensitive */
        unshare(CLONE_FILES);
        /* we don't want anything past stderr here */
        close_range(3, ~0U);
        execve(....);
this api needs a documentation patch if there isn't yet.

currently there is no libc interface contract in place that
says which calls may use libc internal fds e.g. i've seen

  openlog(...) // opens libc internal syslog fd
  ...
  fork()
  closefrom(...) // close syslog fd
  open(...) // something that reuses the closed fd
  syslog(...) // unsafe: uses the wrong fd
  execve(...)

syslog uses a libc internal fd that the user trampled on and
this can go bad in many ways depending on what libc apis are
used between closefrom (or equivalent) and exec.
Documentation is good. :-) I think you'll find that while this example
seems to be innocuous on FreeBSD (and likely other *BSD), this is an
atypical scenario and generally not advised.  You would usually not
start closing until you're actually ready to exec/fail.
Minor correction: not innocuous here, either; O_CLOFORK is not yet a thing. :-)
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help