opentpty () с setuid в CentOS 7 - PullRequest
       23

opentpty () с setuid в CentOS 7

0 голосов
/ 09 ноября 2018

Запуск исполняемого файла с set uid, который вызывает openpty (), завершается неудачей в CentOS 7, но работает в CentOS 6. Похоже, что проблема связана с opentpty (), пытающейся превратить / dev / pts / * из эффективного uid в настоящий uid. И 6, и 7 делают это. Сбой как в 6, так и в 7. Однако в 6 ошибка «игнорируется», / dev / pty / * остается владельцем эффективного uid, и возвращается 0. В 7 ошибка приводит к очистке, / dev / pty / * удаляется и возвращается -1.

Правильно ли я оценил выше? Любые идеи о том, как сделать так, чтобы openpty () не проваливался при запуске из установленного кода uid?

Спасибо!

Для:

fprintf(stderr, "uid: %d, euid: %d\n", getuid(), geteuid());
int ret=openpty(&session->ptyfd, &session->ttyfd, NULL, NULL, &ws);
fprintf(stderr, "pty FD: %d, tty FD: %d\n", session->ptyfd, session->ttyfd);

Centos 6:

geteuid32()                             = 506
getuid32()                              = 500
write(2, "uid: 500, euid: 506\n", 20)   = 20
open("/dev/ptmx", O_RDWR)               = 3
statfs("/dev/pts", {f_type="DEVPTS_SUPER_MAGIC", f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(3, TIOCGPTN, [0])                 = 0
stat64("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
getuid32()                              = 500
chown32("/dev/pts/0", 500, 5)           = -1 EPERM (Operation not permitted)
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb772c728) = 13801
waitpid(13801, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0) = 13801
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=13801, si_status=0, si_utime=0, si_stime=0} ---
ioctl(3, TIOCSPTLCK, [0])               = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(3, TIOCGPTN, [0])                 = 0
stat64("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("/dev/pts/0", O_RDWR|O_NOCTTY)     = 4
ioctl(4, SNDRV_TIMER_IOCTL_STATUS or TIOCSWINSZ, {ws_row=33566, ws_col=2052, ws_xpixel=24928, ws_ypixel=219}) = 0
write(2, "pty FD: 3, tty FD: 4\n", 21)  = 21

Centos 7:

geteuid()                               = 1003
getuid()                                = 1000
write(2, "uid: 1000, euid: 1003\n", 22) = 22
open("/dev/ptmx", O_RDWR)               = 3
statfs("/dev/pts", {f_type=DEVPTS_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NOEXEC|ST_RELATIME}) = 0
ioctl(3, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(3, TIOCGPTN, [5])                 = 0
stat("/dev/pts/5", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 5), ...}) = 0
getuid()                                = 1000
chown("/dev/pts/5", 1000, 5)            = -1 EPERM (Operation not permitted)
close(3)                                = 0
write(2, "pty FD: 0, tty FD: 0\n", 21)  = 21
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...