Skip to content

Commit 683ad2f

Browse files
committed
libcontainer: mark all non-stdio fds O_CLOEXEC before spawning init
Given the core issue in GHSA-xr7r-f8xq-vfvv was that we were unknowingly leaking file descriptors to "runc init", it seems prudent to make sure we proactively prevent this in the future. The solution is to simply mark all non-stdio file descriptors as O_CLOEXEC before we spawn "runc init". For libcontainer library users, this could result in unrelated files being marked as O_CLOEXEC -- however (for the same reason we are doing this for runc), for security reasons those files should've been marked as O_CLOEXEC anyway. Fixes: GHSA-xr7r-f8xq-vfvv CVE-2024-21626 Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
1 parent b6633f4 commit 683ad2f

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

libcontainer/container_linux.go

+9
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,15 @@ func (c *linuxContainer) start(process *Process) (retErr error) {
353353
}()
354354
}
355355

356+
// Before starting "runc init", mark all non-stdio open files as O_CLOEXEC
357+
// to make sure we don't leak any files into "runc init". Any files to be
358+
// passed to "runc init" through ExtraFiles will get dup2'd by the Go
359+
// runtime and thus their O_CLOEXEC flag will be cleared. This is some
360+
// additional protection against attacks like CVE-2024-21626, by making
361+
// sure we never leak files to "runc init" we didn't intend to.
362+
if err := utils.CloseExecFrom(3); err != nil {
363+
return fmt.Errorf("unable to mark non-stdio fds as cloexec: %w", err)
364+
}
356365
if err := parent.start(); err != nil {
357366
return fmt.Errorf("unable to start container process: %w", err)
358367
}

0 commit comments

Comments
 (0)