Adding checks for fd omission
Adding function check_fds to new file fd.c. The function check_fds should be called in every setuid/setgid program. Co-developed-by: Alejandro Colomar <alx@kernel.org>
This commit is contained in:
committed by
Serge Hallyn
parent
b76fc2947f
commit
d2f2c1877a
@@ -61,6 +61,7 @@ libshadow_la_SOURCES = \
|
||||
faillog.h \
|
||||
failure.c \
|
||||
failure.h \
|
||||
fd.c \
|
||||
fields.c \
|
||||
find_new_gid.c \
|
||||
find_new_uid.c \
|
||||
|
||||
41
lib/fd.c
Normal file
41
lib/fd.c
Normal file
@@ -0,0 +1,41 @@
|
||||
// SPDX-FileCopyrightText: 2024, Skyler Ferrante <sjf5462@rit.edu>
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
/**
|
||||
* To protect against file descriptor omission attacks, we open the std file
|
||||
* descriptors with /dev/null if they are not already open. Code is based on
|
||||
* fix_fds from sudo.c.
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "prototypes.h"
|
||||
|
||||
static void check_fd(int fd);
|
||||
|
||||
void
|
||||
check_fds(void)
|
||||
{
|
||||
/**
|
||||
* Make sure stdin, stdout, stderr are open
|
||||
* If they are closed, set them to /dev/null
|
||||
*/
|
||||
check_fd(STDIN_FILENO);
|
||||
check_fd(STDOUT_FILENO);
|
||||
check_fd(STDERR_FILENO);
|
||||
}
|
||||
|
||||
static void
|
||||
check_fd(int fd)
|
||||
{
|
||||
int devnull;
|
||||
|
||||
if (fcntl(fd, F_GETFL, 0) != -1)
|
||||
return;
|
||||
|
||||
devnull = open("/dev/null", O_RDWR);
|
||||
if (devnull != fd)
|
||||
abort();
|
||||
}
|
||||
@@ -120,6 +120,9 @@ extern void initenv (void);
|
||||
extern void set_env (int, char *const *);
|
||||
extern void sanitize_env (void);
|
||||
|
||||
/* fd.c */
|
||||
extern void check_fds (void);
|
||||
|
||||
/* fields.c */
|
||||
extern void change_field (char *, size_t, const char *);
|
||||
extern int valid_field (const char *, const char *);
|
||||
|
||||
Reference in New Issue
Block a user