The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/8036

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 79d6da7cd0634e13227672189923ed905131d563 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Thu, 15 Oct 2020 09:40:27 +0200
Subject: [PATCH 1/3] forkmount: improve

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 lxd/main_forkmount.go | 23 ++++++++++-------------
 1 file changed, 10 insertions(+), 13 deletions(-)

diff --git a/lxd/main_forkmount.go b/lxd/main_forkmount.go
index 2e32756b91..a34d3957ea 100644
--- a/lxd/main_forkmount.go
+++ b/lxd/main_forkmount.go
@@ -329,17 +329,14 @@ static void do_lxc_forkumount(void)
 
 void forkmount(void)
 {
-       char *cur = NULL;
-
-       char *command = NULL;
+       char *command = NULL, *cur = NULL;
+       int ns_fd = -EBADF, pidfd = -EBADF;
        pid_t pid = 0;
-       int ns_fd = -EBADF, pidfd;
 
        // Get the subcommand
        command = advance_arg(false);
-       if (command == NULL || (strcmp(command, "--help") == 0 || 
strcmp(command, "--version") == 0 || strcmp(command, "-h") == 0)) {
-               return;
-       }
+       if (command == NULL || (strcmp(command, "--help") == 0 || 
strcmp(command, "--version") == 0 || strcmp(command, "-h") == 0))
+               _exit(EXIT_SUCCESS);
 
        // Check that we're root
        if (geteuid() != 0) {
@@ -354,9 +351,9 @@ void forkmount(void)
        if (strcmp(command, "lxd-mount") == 0) {
                // Get the pid
                cur = advance_arg(false);
-               if (cur == NULL || (strcmp(cur, "--help") == 0 || strcmp(cur, 
"--version") == 0 || strcmp(cur, "-h") == 0)) {
-                       return;
-               }
+               if (cur == NULL || (strcmp(cur, "--help") == 0 || strcmp(cur, 
"--version") == 0 || strcmp(cur, "-h") == 0))
+                       _exit(EXIT_SUCCESS);
+
                pid = atoi(cur);
                if (pid <= 0)
                        _exit(EXIT_FAILURE);
@@ -372,9 +369,9 @@ void forkmount(void)
        } else if (strcmp(command, "lxd-umount") == 0) {
                // Get the pid
                cur = advance_arg(false);
-               if (cur == NULL || (strcmp(cur, "--help") == 0 || strcmp(cur, 
"--version") == 0 || strcmp(cur, "-h") == 0)) {
-                       return;
-               }
+               if (cur == NULL || (strcmp(cur, "--help") == 0 || strcmp(cur, 
"--version") == 0 || strcmp(cur, "-h") == 0))
+                       _exit(EXIT_SUCCESS);
+
                pid = atoi(cur);
                if (pid <= 0)
                        _exit(EXIT_FAILURE);

From 317ab6bc5285d849f0c30e35d7f5e73ca519faff Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Thu, 15 Oct 2020 10:56:29 +0200
Subject: [PATCH 2/3] seccomp: improve logging for the seccomp notifier

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 lxd/seccomp/seccomp.go | 53 ++++++++++++++++++++++++++----------------
 1 file changed, 33 insertions(+), 20 deletions(-)

diff --git a/lxd/seccomp/seccomp.go b/lxd/seccomp/seccomp.go
index e424b31b4b..699fdf85fb 100644
--- a/lxd/seccomp/seccomp.go
+++ b/lxd/seccomp/seccomp.go
@@ -947,6 +947,7 @@ retry:
                return fmt.Errorf("Failed to send full response to seccomp 
client %v", siov.ucred.Pid)
        }
 
+       logger.Debugf("Send seccomp notification for id(%d)", siov.resp.id)
        return nil
 }
 
@@ -1186,11 +1187,14 @@ func (s *Server) doDeviceSyscall(c Instance, args 
*MknodArgs, siov *Iovec) int {
 // HandleMknodSyscall handles a mknod syscall.
 func (s *Server) HandleMknodSyscall(c Instance, siov *Iovec) int {
        ctx := log.Ctx{"container": c.Name(),
-               "project":              c.Project(),
-               "syscall_number":       siov.req.data.nr,
-               "audit_architecture":   siov.req.data.arch,
-               "seccomp_notify_id":    siov.req.id,
-               "seccomp_notify_flags": siov.req.flags,
+               "project":               c.Project(),
+               "syscall_number":        siov.req.data.nr,
+               "audit_architecture":    siov.req.data.arch,
+               "seccomp_notify_id":     siov.req.id,
+               "seccomp_notify_flags":  siov.req.flags,
+               "seccomp_notify_pid":    siov.req.pid,
+               "seccomp_notify_fd":     siov.notifyFd,
+               "seccomp_notify_mem_fd": siov.memFd,
        }
 
        defer logger.Debug("Handling mknod syscall", ctx)
@@ -1233,11 +1237,14 @@ func (s *Server) HandleMknodSyscall(c Instance, siov 
*Iovec) int {
 // HandleMknodatSyscall handles a mknodat syscall.
 func (s *Server) HandleMknodatSyscall(c Instance, siov *Iovec) int {
        ctx := log.Ctx{"container": c.Name(),
-               "project":              c.Project(),
-               "syscall_number":       siov.req.data.nr,
-               "audit_architecture":   siov.req.data.arch,
-               "seccomp_notify_id":    siov.req.id,
-               "seccomp_notify_flags": siov.req.flags,
+               "project":               c.Project(),
+               "syscall_number":        siov.req.data.nr,
+               "audit_architecture":    siov.req.data.arch,
+               "seccomp_notify_id":     siov.req.id,
+               "seccomp_notify_flags":  siov.req.flags,
+               "seccomp_notify_pid":    siov.req.pid,
+               "seccomp_notify_fd":     siov.notifyFd,
+               "seccomp_notify_mem_fd": siov.memFd,
        }
 
        defer logger.Debug("Handling mknodat syscall", ctx)
@@ -1309,11 +1316,14 @@ type SetxattrArgs struct {
 // HandleSetxattrSyscall handles setxattr syscalls.
 func (s *Server) HandleSetxattrSyscall(c Instance, siov *Iovec) int {
        ctx := log.Ctx{"container": c.Name(),
-               "project":              c.Project(),
-               "syscall_number":       siov.req.data.nr,
-               "audit_architecture":   siov.req.data.arch,
-               "seccomp_notify_id":    siov.req.id,
-               "seccomp_notify_flags": siov.req.flags,
+               "project":               c.Project(),
+               "syscall_number":        siov.req.data.nr,
+               "audit_architecture":    siov.req.data.arch,
+               "seccomp_notify_id":     siov.req.id,
+               "seccomp_notify_flags":  siov.req.flags,
+               "seccomp_notify_pid":    siov.req.pid,
+               "seccomp_notify_fd":     siov.notifyFd,
+               "seccomp_notify_mem_fd": siov.memFd,
        }
 
        defer logger.Debug("Handling setxattr syscall", ctx)
@@ -1588,11 +1598,14 @@ func (s *Server) mountHandleHugetlbfsArgs(c Instance, 
args *MountArgs, nsuid int
 // HandleMountSyscall handles mount syscalls.
 func (s *Server) HandleMountSyscall(c Instance, siov *Iovec) int {
        ctx := log.Ctx{"container": c.Name(),
-               "project":              c.Project(),
-               "syscall_number":       siov.req.data.nr,
-               "audit_architecture":   siov.req.data.arch,
-               "seccomp_notify_id":    siov.req.id,
-               "seccomp_notify_flags": siov.req.flags,
+               "project":               c.Project(),
+               "syscall_number":        siov.req.data.nr,
+               "audit_architecture":    siov.req.data.arch,
+               "seccomp_notify_id":     siov.req.id,
+               "seccomp_notify_flags":  siov.req.flags,
+               "seccomp_notify_pid":    siov.req.pid,
+               "seccomp_notify_fd":     siov.notifyFd,
+               "seccomp_notify_mem_fd": siov.memFd,
        }
 
        defer logger.Debug("Handling mount syscall", ctx)

From f71ea4c4497a3a58d30f87c0f54beff032aca642 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@ubuntu.com>
Date: Thu, 15 Oct 2020 10:56:45 +0200
Subject: [PATCH 3/3] seccomp: make sure that insertMountLXD() doesn't call
 into LXC

Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
---
 lxd/instance/drivers/driver_lxc.go |  9 +++++++--
 lxd/seccomp/seccomp.go             | 10 +++++-----
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/lxd/instance/drivers/driver_lxc.go 
b/lxd/instance/drivers/driver_lxc.go
index ac307d6d1e..c2e57e1803 100644
--- a/lxd/instance/drivers/driver_lxc.go
+++ b/lxd/instance/drivers/driver_lxc.go
@@ -6066,7 +6066,12 @@ func (c *lxc) unmount() (bool, error) {
        return unmounted, nil
 }
 
-// Mount handling
+// insertMountLXD inserts a mount into a LXD container.
+// This function is used for the seccomp notifier and so cannot call any
+// functions that would cause LXC to talk to the container's monitor. Otherwise
+// we'll have a deadlock (with a timeout but still). The InitPID() call here is
+// the exception since the seccomp notifier will make sure to always pass a
+// valid PID.
 func (c *lxc) insertMountLXD(source, target, fstype string, flags int, 
mntnsPID int, shiftfs bool) error {
        pid := mntnsPID
        if pid <= 0 {
@@ -6117,7 +6122,7 @@ func (c *lxc) insertMountLXD(source, target, fstype 
string, flags int, mntnsPID
        mntsrc := filepath.Join("/dev/.lxd-mounts", filepath.Base(tmpMount))
        pidStr := fmt.Sprintf("%d", pid)
 
-       pidFdNr, pidFd := c.inheritInitPidFd()
+       pidFdNr, pidFd := seccomp.MakePidFd(pid, c.state)
        if pidFdNr >= 0 {
                defer pidFd.Close()
        }
diff --git a/lxd/seccomp/seccomp.go b/lxd/seccomp/seccomp.go
index 699fdf85fb..7a4553dee2 100644
--- a/lxd/seccomp/seccomp.go
+++ b/lxd/seccomp/seccomp.go
@@ -656,8 +656,8 @@ func InstanceNeedsIntercept(s *state.State, c Instance) 
(bool, error) {
        return needed, nil
 }
 
-// InheritInitPidFd prepares a pidfd to inherit for the init process of the 
container.
-func inheritPidFd(pid int, s *state.State) (int, *os.File) {
+// MakePidFd prepares a pidfd to inherit for the init process of the container.
+func MakePidFd(pid int, s *state.State) (int, *os.File) {
        if s.OS.PidFds {
                pidFdFile, err := shared.PidFdOpen(pid, 0)
                if err != nil {
@@ -1112,7 +1112,7 @@ func CallForkmknod(c Instance, dev deviceConfig.Device, 
requestPID int, s *state
                return int(-C.EPERM)
        }
 
-       pidFdNr, pidFd := inheritPidFd(requestPID, s)
+       pidFdNr, pidFd := MakePidFd(requestPID, s)
        if pidFdNr >= 0 {
                defer pidFd.Close()
        }
@@ -1332,7 +1332,7 @@ func (s *Server) HandleSetxattrSyscall(c Instance, siov 
*Iovec) int {
 
        args.pid = int(siov.req.pid)
 
-       pidFdNr, pidFd := inheritPidFd(args.pid, s.s)
+       pidFdNr, pidFd := MakePidFd(args.pid, s.s)
        if pidFdNr >= 0 {
                defer pidFd.Close()
        }
@@ -1615,7 +1615,7 @@ func (s *Server) HandleMountSyscall(c Instance, siov 
*Iovec) int {
                shift: s.MountSyscallShift(c),
        }
 
-       pidFdNr, pidFd := inheritPidFd(args.pid, s.s)
+       pidFdNr, pidFd := MakePidFd(args.pid, s.s)
        if pidFdNr >= 0 {
                defer pidFd.Close()
        }
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to