FreeBSD реализует непривилегированный chroot

Это основано на недавно введенном флаге NO_NEW_PRIVS для реализации непривилегированного chroot, включенного с помощью `security.bsd.unprivileged_chroot`. Это позволяет некорневым процессам выполнять chroot (2) при условии, что у них установлен флаг NO_NEW_PRIVS. Утилита chroot (8) получает новый флаг -n, который устанавливает NO_NEW_PRIVS перед chroot. Проверено: kib Спонсор: EPSRC Замечания: да Дифференциальная версия: https://reviews.freebsd.org/D 30130

@@ – 967, 6 + 967, 11 @@ kern_chdir (struct thread td, const char path, enum uio_seg pathseg)

return (0);

}

+ static int unprivileged_chroot = 0;

+ SYSCTL_INT (_security_bsd, OID_AUTO, unprivileged_chroot, CTLFLAG_RW,

+ & unprivileged_chroot, 0,

+ «Непривилегированные процессы могут использовать chroot (2)»);

/

Изменить понятие корневого (“ / ”) каталога.

/

@@ – 967, 11 + 2020, 28 @@ int

sys_chroot (struct thread td, struct chroot_args uap)

{

struct nameidata nd;

+ struct proc p;

int error;

error = priv_check (td, PRIV_VFS_CHROOT);

– если (ошибка ! = 0)

– возврат (ошибка);

+ if (error! = 0) {

+ p = td-> td_proc;

+ PROC_LOCK (p);

+ если (unprivileged_chroot == 0 ||

+ (p-> p_flag2 & P2_NO_NEW_PRIVS) == 0) {

+ PROC_UNLOCK (p);

+ return (ошибка );

+}

+ PROC_UNLOCK (p);

+}

NDINIT (& nd, СМОТРЕТЬ, СЛЕДУЮЩИЕ | ЗАКРЫТЫЙ | LOCKLEAF | AUDITVNODE1,

UIO_USERSPACE, uap-> path, td);

error = namei (& nd);

@@ – 39, 7 + 39, 7 @@

. “@ (#) chroot.8 8.1 (Беркли) 6/9 / 94

. “$ FreeBSD $

. ”

-. Дд июнь 27, 2020

+. Дд июль 27, 2021

.Dt CHROOT 8

.Os

.Sh ИМЯ

@@ – 39, 6 + 44, 7 @@

.Op Fl G Группа Ar Ns Op Cm &, Ns Группа Ar …

.Op Fl g Ar гроу p

.Op Fl u Ar user

+. Op Fl n

.Ar newroot

.Op Ar command Op Ar arg …

.Sh ОПИСАНИЕ

@@ – 61, 6 + 62, 16 @@ Запустить команду с правами указанного

.It Fl u Ar user

Запустите команду как

.Ar user.

+. It Fl n

+ Используйте

+. Dv PROC_NO_NEW_PRIVS_CTL

+. Xr procctl 2

+ команда перед переходом в режим chroot, эффективное отключение битов SUID / SGID

+ для вызывающего процесса и его потомков.

+ If

+ .Dv security.bsd.unprivileged_chroot

+ sysctl установлен в 1, это сделает е возможно chroot без

+ привилегий суперпользователя.

.El

.Sh СРЕДА

На следующую переменную среды ссылается

@@ – 51, 6+ 51, 7 @@ static char sccsid = “@ (#) chroot.c 8.1 (Беркли) 6/9 / 94 “;

__FBSDID (” $ FreeBSD $ “);

#включают

+ # include

#include

#include

@@ – 52, 6 + 61, 7 @@ __FBSDID ( “$ FreeBSD $”);

#include

#включают

#включают

+ # включить

#включают

#включают

#включают

@@ – 67, 13 + 69, 15 @@ main (int argc, char argv)

const char shell;

gid_t gid, gidlist;

uid_t uid;

– int ch, gids;

+ int arg, ch, error, gids;

long ngroups_max;

+ bool непривилегированный;

gid = 0;

uid = 0;

user = group = grouplist = NULL;

– while ((ch = getopt (argc, argv, “G: g: u:”))! = -1) {

+ nonpriviledged = false;

+ while ((ch = getopt (argc, argv, “G : g: u: n “))! = -1) {

переключатель (ch) {

case ‘u’:

user = optarg;

@@ – 90, 6 + 94, 9 @@ main (int argc, char argv)

if grouplist == ‘ 0’)

использование ();

перерыв;

+ case ‘n’:

+ nonpriviledged = true;

+ break;

case ‘?’:

по умолчанию:

usage ();

@@ – 153, 6 + 160, 13 @@ main (int argc, char argv )

}

}

+ if (непривилегированный) {

+ arg = PROC_NO_NEW_PRIVS_ENABLE;

+ error = procctl (P_PID, getpid (), PROC_NO_NEW_PRIVS_CTL, & arg);

+ if (ошибка! = 0)

+ err (1, “procctl”);

+}

+

if (chdir (argv [0]) == -1 || chroot (” . “) == -1)

err (1,”% s “, argv [0]);

@@ – 179, 6 + 193, 6 @@ static void

использование (void)

{

(void) fprintf (stderr, “использование: chroot [-g group] [-G group,group,…] «

-« [-u user] newroot [command] n »);

+ “[-u user] [-n ] newroot [command] n “);

exit (1);

}

Leave a comment

Your email address will not be published. Required fields are marked *