From: Mike Rapoport <rppt@linux.ibm.com>
To: "Michael Kerrisk (man-pages)" <mtk.manpages@gmail.com>
Cc: Alejandro Colomar <alx.manpages@gmail.com>, linux-man@vger.kernel.org
Subject: Re: [PATCH 08/23] man2: new page describing memfd_secret() system call
Date: Tue, 10 Aug 2021 11:53:28 +0300 [thread overview]
Message-ID: <YRI+iFIGsyh4V+hb@linux.ibm.com> (raw)
In-Reply-To: <c59c067a-b152-2e23-3591-833d8349dcda@gmail.com>
Hi Michael,
On Mon, Aug 09, 2021 at 04:00:46AM +0200, Michael Kerrisk (man-pages) wrote:
> Hi Mike and Alex,
>
> I think some more work is needed for this page. Mike, would
> you be willing to do some work on the points below please?
I'm really stretched at the moment, so it'll take a while.
What do you say about starting without the elaborate NOTES section and only
updating the page according to your comments below?
I will add the NOTES section a bit later then.
> On 8/8/21 10:41 AM, Alejandro Colomar wrote:
> > From: Mike Rapoport <rppt@linux.ibm.com>
> >
> > Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
> > Signed-off-by: Alejandro Colomar <alx.manpages@gmail.com>
> > ---
> > man2/memfd_secret.2 | 146 ++++++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 146 insertions(+)
> > create mode 100644 man2/memfd_secret.2
> >
> > diff --git a/man2/memfd_secret.2 b/man2/memfd_secret.2
> > new file mode 100644
> > index 000000000..466aa4236
> > --- /dev/null
> > +++ b/man2/memfd_secret.2
> > @@ -0,0 +1,146 @@
> > +.\" Copyright (c) 2021, IBM Corporation.
> > +.\" Written by Mike Rapoport <rppt@linux.ibm.com>
> > +.\"
> > +.\" Based on memfd_create(2) man page
> > +.\" Copyright (C) 2014 Michael Kerrisk <mtk.manpages@gmail.com>
> > +.\" and Copyright (C) 2014 David Herrmann <dh.herrmann@gmail.com>
> > +.\"
> > +.\" %%%LICENSE_START(GPLv2+)
> > +.\"
> > +.\" This program is free software; you can redistribute it and/or modify
> > +.\" it under the terms of the GNU General Public License as published by
> > +.\" the Free Software Foundation; either version 2 of the License, or
> > +.\" (at your option) any later version.
> > +.\"
> > +.\" This program is distributed in the hope that it will be useful,
> > +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
> > +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > +.\" GNU General Public License for more details.
> > +.\"
> > +.\" You should have received a copy of the GNU General Public
> > +.\" License along with this manual; if not, see
> > +.\" <http://www.gnu.org/licenses/>.
> > +.\" %%%LICENSE_END
> > +.\"
> > +.TH MEMFD_SECRET 2 2020-08-02 Linux "Linux Programmer's Manual"
> > +.SH NAME
> > +memfd_secret \- create an anonymous file to access secret memory regions
> > +.SH SYNOPSIS
> > +.nf
> > +.PP
> > +.BR "#include <sys/syscall.h>" " /* Definition of " SYS_* " constants */"
> > +.B #include <unistd.h>
> > +.PP
> > +.BI "int syscall(SYS_memfd_secret, unsigned int " flags );
> > +.fi
> > +.PP
> > +.IR Note :
> > +glibc provides no wrapper for
> > +.BR memfd_secret (),
> > +necessitating the use of
> > +.BR syscall (2).
> > +.SH DESCRIPTION
> > +.BR memfd_secret ()
> > +creates an anonymous file and returns a file descriptor that refers to it.
>
> s/file/RAM-based file/
>
> > +The file provides a way to create and access memory regions
> > +with stronger protection than usual RAM-based files and
> > +anonymous memory mappings.
> > +Once all references to the file are dropped, it is automatically released.
>
> "dropped" is not clear. Should it be something like:
>
> Once all open references to the file are closed,
>
> > +The initial size of the file is set to 0.
> > +Following the call, the file size should be set using
> > +.BR ftruncate (2).
> > +.PP
> > +The memory areas backing the file created with
> > +.BR memfd_create(2)
> > +are visible only to the contexts that have access to the file descriptor.
>
> "contexts" is not clear here. Can you reword to explain what you mean?
> (processes, threads, something else?)
>
> > +These areas are removed from the kernel page tables
>
> s/These areas are/The memory region is/
>
> > +and only the page tables of the processes holding the file descriptor
> > +map the corresponding physical memory.
>
> Perhaps a sentence here such as:
>
> "(Thus, the pages in the region can't be accessed by the kernel itself,
> so that, for example, pointers to the region can't be passed to
> system calls.)"
>
> > +.PP
> > +The following values may be bitwise ORed in
> > +.I flags
> > +to control the behavior of
> > +.BR memfd_secret (2):
> > +.TP
> > +.B FD_CLOEXEC
> > +Set the close-on-exec flag on the new file descriptor.
>
> s/.$/, which causes the region to be removed from the process on execve(2)./
>
> > +See the description of the
> > +.B O_CLOEXEC
> > +flag in
> > +.BR open (2)
> > +for reasons why this may be useful.
>
> Maybe the previous sentence is not necessary?
>
> > +.PP
> > +As its return value,
> > +.BR memfd_secret ()
> > +returns a new file descriptor that can be used to refer to an anonymous file.
>
> s/that can be used to refer/that refers/
>
> > +This file descriptor is opened for both reading and writing
> > +.RB ( O_RDWR )
> > +and
> > +.B O_LARGEFILE
> > +is set for the file descriptor.
> > +.PP
> > +With respect to
> > +.BR fork (2)
> > +and
> > +.BR execve (2),
> > +the usual semantics apply for the file descriptor created by
> > +.BR memfd_secret ().
> > +A copy of the file descriptor is inherited by the child produced by
> > +.BR fork (2)
> > +and refers to the same file.
> > +The file descriptor is preserved across
> > +.BR execve (2),
> > +unless the close-on-exec flag has been set.
> > +.PP
> > +The memory regions backed with
> > +.BR memfd_secret ()
> > +are locked in the same way as
> > +.BR mlock (2),
>
> I find the wording here just a little unclear
>
> How about:
>
> The memory region is locked into memory in the same way as
> with mlock(2), so that it will never be written into swap
>
> > +however the implementation will not try to> +populate the whole range during the
> > +.BR mmap (2)
> > +call.
>
> s/call./call that attaches the region into the process's address space;
> instead, the pages are only actually allocated as they are
> faulted in./
>
> > +The amount of memory allowed for memory mappings
> > +of the file descriptor obeys the same rules as
> > +.BR mlock (2)
> > +and cannot exceed
> > +.BR RLIMIT_MEMLOCK .
> > +.SH RETURN VALUE
> > +On success,
> > +.BR memfd_secret ()
> > +returns a new file descriptor.
> > +On error, \-1 is returned and
> > +.I errno
> > +is set to indicate the error.
> > +.SH ERRORS
> > +.TP
> > +.B EINVAL
> > +.I flags
> > +included unknown bits.
> > +.TP
> > +.B EMFILE
> > +The per-process limit on the number of open file descriptors has been reached.
> > +.TP
> > +.B EMFILE
> > +The system-wide limit on the total number of open files has been reached.
> > +.TP
> > +.B ENOMEM
> > +There was insufficient memory to create a new anonymous file.
> > +.TP
> > +.B ENOSYS
> > +.BR memfd_secret ()
> > +is not implemented on this architecture.
> > +.SH VERSIONS
> > +The
> > +.BR memfd_secret (2)
> > +system call first appeared in Linux 5.14.
> > +.SH CONFORMING TO
> > +The
> > +.BR memfd_secret (2)
> > +system call is Linux-specific.
> > +.SH SEE ALSO
> > +.BR fcntl (2),
> > +.BR ftruncate (2),
> > +.BR mlock (2),
> > +.BR mmap (2),
> > +.BR setrlimit (2)
>
> I feel like this page could benefit from a NOTES section
> that explains the rationale for the system call. This could
> note that the fact that the region is not accessible from the
> kernel removes a whole class of security attacks.
>
> Also, the NOTES section could mention the "secretmem_enable"
> boot option, what its purpose is, what values it can have,
> and what is default behavior if this option is not specified.
>
> Also, is ti still the case that if this system call is used,
> then users can no longer hibernate their systems? If so,
> this really should be mentioned in NOTES!
>
> Also, in NOTES perhaps it is worth mentioning that the
> pages in the region can enter the cache (right?).
>
> Perhaps Jon's articles at https://lwn.net/Articles/865256/
> https://lwn.net/Articits/835342/ and https://lwn.net/Articles/812325/,
> as well as your own commit message
> (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1507f51255c9)
> may inspire some other ideas on details that should be included
> in NOTES.
>
> Thanks,
>
> Michael
>
> --
> Michael Kerrisk
> Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/
> Linux/UNIX System Programming Training: http://man7.org/training/
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2021-08-10 8:53 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-08 8:41 [PATCH 00/23] More patches from others Alejandro Colomar
2021-08-08 8:41 ` [PATCH 01/23] pipe.7: also mention writev(2) in atomicity section Alejandro Colomar
2021-08-08 13:20 ` Alejandro Colomar (man-pages)
2021-08-08 20:06 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 02/23] sigaction.2: Document SA_EXPOSE_TAGBITS and the flag support detection protocol Alejandro Colomar
2021-08-09 0:29 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 03/23] sigaction.2: Apply minor tweaks to Peter's patch Alejandro Colomar
2021-08-09 0:34 ` Michael Kerrisk (man-pages)
2021-08-09 6:36 ` Alejandro Colomar (man-pages)
2021-08-08 8:41 ` [PATCH 04/23] namespaces.7: ffix Alejandro Colomar
2021-08-08 20:08 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 05/23] unix.7: tfix Alejandro Colomar
2021-08-08 20:23 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 06/23] futex.2: Document FUTEX_LOCK_PI2 Alejandro Colomar
2021-08-09 0:06 ` Michael Kerrisk (man-pages)
2021-08-09 8:14 ` Kurt Kanzenbach
2021-08-09 9:01 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 07/23] futex.2: Minor tweaks to Kurt's patch Alejandro Colomar
2021-08-09 0:05 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 08/23] man2: new page describing memfd_secret() system call Alejandro Colomar
2021-08-09 2:00 ` Michael Kerrisk (man-pages)
2021-08-10 8:53 ` Mike Rapoport [this message]
2021-08-08 8:41 ` [PATCH 09/23] termios.3: Document missing baudrate constants Alejandro Colomar
2021-08-08 20:30 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 10/23] getopt.3: Further clarification of optstring Alejandro Colomar
2021-08-08 22:11 ` Michael Kerrisk (man-pages)
2021-08-09 6:40 ` Alejandro Colomar (man-pages)
2021-08-08 8:41 ` [PATCH 11/23] getopt.3: Minor tweak to James's patch Alejandro Colomar
2021-08-08 22:12 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 12/23] termios.3: Use bold style for Bnn and EXTn macro constants Alejandro Colomar
2021-08-08 20:31 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 13/23] ioctl_tty.2: Document ioctls: TCGETS2, TCSETS2, TCSETSW2, TCSETSF2 Alejandro Colomar
2021-08-08 20:37 ` Michael Kerrisk (man-pages)
2021-08-08 20:56 ` Michael Kerrisk (man-pages)
2021-08-08 21:15 ` Pali Rohár
2021-08-08 21:30 ` Michael Kerrisk (man-pages)
2021-08-10 19:11 ` Pali Rohár
2021-08-10 20:40 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 14/23] ioctl_tty.2: Update DTR example Alejandro Colomar
2021-08-08 20:12 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 15/23] termios.3: Add information how to set baud rate to any other value Alejandro Colomar
2021-08-08 20:34 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 16/23] man-pages.7: wfix Alejandro Colomar
2021-08-08 20:09 ` Michael Kerrisk (man-pages)
2021-10-17 19:42 ` Alejandro Colomar (man-pages)
2021-08-08 8:41 ` [PATCH 17/23] termios.3: ffix Alejandro Colomar
2021-08-08 20:35 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 18/23] termios.3: SPARC architecture has 4 different Bnnn constants Alejandro Colomar
2021-08-08 20:36 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 19/23] regex.3: wfix Alejandro Colomar
2021-08-08 20:11 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 20/23] mount_setattr.2: New manual page documenting the mount_setattr() system call Alejandro Colomar
2021-08-10 1:34 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 21/23] mount_setattr.2: Minor tweaks to Chirstian's patch Alejandro Colomar
2021-08-10 1:35 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 22/23] ldd.1: Fix example command Alejandro Colomar
2021-08-08 22:32 ` Michael Kerrisk (man-pages)
2021-08-08 8:41 ` [PATCH 23/23] close_range.2: Glibc added a wrapper recently Alejandro Colomar
2021-08-08 20:58 ` Michael Kerrisk (man-pages)
2021-08-10 1:39 ` [PATCH 00/23] More patches from others Michael Kerrisk (man-pages)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YRI+iFIGsyh4V+hb@linux.ibm.com \
--to=rppt@linux.ibm.com \
--cc=alx.manpages@gmail.com \
--cc=linux-man@vger.kernel.org \
--cc=mtk.manpages@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox