Создал на FreeBSD 4.10 chroot-окружения для юзверей ssh. Туда вошли /bin, /dev, кое-что из /etc, /var/run, /usr/bin, прочие необходимые библиотеки, в том числе perl, gcc, make. И несколько портов - mc, архиваторы. Все работает здорово, в том числе и ps, не работает top:kvm_open: /dev/mem: Permission denied
Прочитал man top. Проверяем из-под chroot-енного юзверя:
$ ls -l /etc/passwd
-rw-r--r-- 1 root wheel 4606 Nov 9 10:51 /etc/passwd$ ls -l /dev/*mem
crw-r----- 1 root kmem 2, 1 Nov 10 07:26 /dev/kmem
crw-r----- 1 root kmem 2, 0 Nov 10 07:26 /dev/mem$ ls -l /kernel
-r-xr-xr-x 1 root wheel 2447436 Sep 3 07:29 /kernelЕсли сделать от root'а
# chmod o+r /usr/chroot/dev/mem /usr/chroot/dev/kmem
тогда top под юзверем начинает работать, но это же не несекьюрно!
Обращаем внимание на оригинальную установку пермишнов:
# ls -l /dev/*mem
crw-r----- 1 root kmem 2, 1 3 11:07 /dev/kmem
crw-r----- 1 root kmem 2, 0 3 11:07 /dev/mem
Флаги те же - 640, но ведь работает же подо всеми юзверями, блин.В чем тут может быть дело?
P.S. ps работает и под chroot-енным юзверем.
>Создал на FreeBSD 4.10 chroot-окружения для юзверей ssh. Туда вошли /bin, /dev,
>кое-что из /etc, /var/run, /usr/bin, прочие необходимые библиотеки, в том числе
>perl, gcc, make. И несколько портов - mc, архиваторы. Все работает
>здорово, в том числе и ps, не работает top:
>
>kvm_open: /dev/mem: Permission denied
>
>Прочитал man top. Проверяем из-под chroot-енного юзверя:
>
>$ ls -l /etc/passwd
>-rw-r--r-- 1 root wheel 4606 Nov 9 10:51
>/etc/passwd
>
>$ ls -l /dev/*mem
>crw-r----- 1 root kmem 2,
>1 Nov 10 07:26 /dev/kmem
>crw-r----- 1 root kmem 2,
>0 Nov 10 07:26 /dev/mem
>
>$ ls -l /kernel
>-r-xr-xr-x 1 root wheel 2447436 Sep 3 07:29
>/kernel
>
>Если сделать от root'а
># chmod o+r /usr/chroot/dev/mem /usr/chroot/dev/kmem
>тогда top под юзверем начинает работать, но это же не несекьюрно!
>Обращаем внимание на оригинальную установку пермишнов:
># ls -l /dev/*mem
>crw-r----- 1 root kmem 2,
>1 3 11:07 /dev/kmem
>crw-r----- 1 root kmem 2,
>0 3 11:07 /dev/mem
>Флаги те же - 640, но ведь работает же подо всеми юзверями,
>блин.
>
>В чем тут может быть дело?
>
>P.S. ps работает и под chroot-енным юзверем.
Насколько я знаю, top использует proc. Ты его подмонтировал в chroot'е?
>Насколько я знаю, top использует proc. Ты его подмонтировал в chroot'е?Пробовал. Результат тот же. Делал так. От root'а:
# mount_procfs procfs /usr/chroot/proc
От юзверя:
$ top
kvm_open: /dev/mem: Permission denied
>>Насколько я знаю, top использует proc. Ты его подмонтировал в chroot'е?
>
>Пробовал. Результат тот же. Делал так. От root'а:
>
># mount_procfs procfs /usr/chroot/proc
>
>От юзверя:
>
>$ top
>kvm_open: /dev/mem: Permission deniedtruss -o /tmp/top top -n
по идее, такая команда должна ответить на вопрос
>truss -o /tmp/top top -n
>
>по идее, такая команда должна ответить на вопросДолжна. Но не ответила. ^_^
mmap(0x0,2048,0x3,0x1000,-1,0x0) = 671506432 (0x28066000)
munmap(0x28066000,0x800) = 0 (0x0)
__sysctl(0xbfbffa90,0x2,0x28064f88,0xbfbffa8c,0x0,0x0) = 0 (0x0)
mmap(0x0,32768,0x3,0x1002,-1,0x0) = 671506432 (0x28066000)
geteuid() = 2020 (0x7e4)
getuid() = 2020 (0x7e4)
getegid() = 999 (0x3e7)
getgid() = 999 (0x3e7)
open("/etc/libmap.conf",0x0,0666) ERR#2 'No such file or directory'
open("/var/run/ld-elf.so.hints",0x0,00) = 4 (0x4)
read(0x4,0xbfbffa70,0x80) = 128 (0x80)
lseek(4,0x80,0) = 128 (0x80)
read(0x4,0x28068100,0x8f) = 143 (0x8f)
close(4) = 0 (0x0)
access("/usr/lib/libncurses.so.5",0) = 0 (0x0)
open("/usr/lib/libncurses.so.5",0x0,05001262053) = 4 (0x4)
fstat(4,0xbfbffab8) = 0 (0x0)
read(0x4,0xbfbfea88,0x1000) = 4096 (0x1000)
mmap(0x0,266240,0x5,0x20002,4,0x0) = 671539200 (0x2806e000)
mprotect(0x280a2000,0x1000,0x7) = 0 (0x0)
mprotect(0x280a2000,0x1000,0x5) = 0 (0x0)
mmap(0x280a3000,36864,0x3,0x12,4,0x34000) = 671756288 (0x280a3000)
mmap(0x280ac000,12288,0x3,0x1012,-1,0x0) = 671793152 (0x280ac000)
close(4) = 0 (0x0)
access("/usr/lib/libm.so.2",0) = 0 (0x0)
open("/usr/lib/libm.so.2",0x0,05001262053) = 4 (0x4)
fstat(4,0xbfbffab8) = 0 (0x0)
read(0x4,0xbfbfea88,0x1000) = 4096 (0x1000)
mmap(0x0,110592,0x5,0x20002,4,0x0) = 671805440 (0x280af000)
mprotect(0x280c5000,0x1000,0x7) = 0 (0x0)
mprotect(0x280c5000,0x1000,0x5) = 0 (0x0)
mmap(0x280c6000,16384,0x3,0x12,4,0x16000) = 671899648 (0x280c6000)
close(4) = 0 (0x0)
access("/usr/lib/libkvm.so.2",0) = 0 (0x0)
open("/usr/lib/libkvm.so.2",0x0,05001262053) = 4 (0x4)
fstat(4,0xbfbffab8) = 0 (0x0)
read(0x4,0xbfbfea88,0x1000) = 4096 (0x1000)
mmap(0x0,24576,0x5,0x20002,4,0x0) = 671916032 (0x280ca000)
mprotect(0x280ce000,0x1000,0x7) = 0 (0x0)
mprotect(0x280ce000,0x1000,0x5) = 0 (0x0)
mmap(0x280cf000,4096,0x3,0x12,4,0x4000) = 671936512 (0x280cf000)
close(4) = 0 (0x0)
access("/usr/lib/libc.so.4",0) = 0 (0x0)
open("/usr/lib/libc.so.4",0x0,05001262053) = 4 (0x4)
fstat(4,0xbfbffab8) = 0 (0x0)
read(0x4,0xbfbfea88,0x1000) = 4096 (0x1000)
mmap(0x0,626688,0x5,0x20002,4,0x0) = 671940608 (0x280d0000)
mprotect(0x28151000,0x1000,0x7) = 0 (0x0)
mprotect(0x28151000,0x1000,0x5) = 0 (0x0)
mmap(0x28152000,20480,0x3,0x12,4,0x81000) = 672473088 (0x28152000)
mmap(0x28157000,73728,0x3,0x1012,-1,0x0) = 672493568 (0x28157000)
close(4) = 0 (0x0)
mmap(0x0,736,0x3,0x1000,-1,0x0) = 672567296 (0x28169000)
munmap(0x28169000,0x2e0) = 0 (0x0)
mmap(0x0,4576,0x3,0x1000,-1,0x0) = 672567296 (0x28169000)
munmap(0x28169000,0x11e0) = 0 (0x0)
mmap(0x0,2208,0x3,0x1000,-1,0x0) = 672567296 (0x28169000)
munmap(0x28169000,0x8a0) = 0 (0x0)
mmap(0x0,688,0x3,0x1000,-1,0x0) = 672567296 (0x28169000)
munmap(0x28169000,0x2b0) = 0 (0x0)
mmap(0x0,13360,0x3,0x1000,-1,0x0) = 672567296 (0x28169000)
munmap(0x28169000,0x3430) = 0 (0x0)
sigaction(SIGILL,0xbfbffb10,0xbfbffaf8) = 0 (0x0)
sigprocmask(0x1,0x0,0x28064ebc) = 0 (0x0)
sigaction(SIGILL,0xbfbffaf8,0x0) = 0 (0x0)
sigprocmask(0x1,0x28064e80,0xbfbffb38) = 0 (0x0)
sigprocmask(0x3,0x28064e90,0x0) = 0 (0x0)
fstat(1,0xbfbff9a0) = 0 (0x0)
__sysctl(0xbfbff9b0,0x2,0xbfbff9b8,0xbfbff9ac,0x804e82b,0x12) ERR#2 'No such file
__sysctl(0xbfbff9b0,0x2,0xbfbff9b8,0xbfbff9ac,0x804e83e,0xe) ERR#2 'No such file
geteuid() = 2020 (0x7e4)
readlink("/etc/malloc.conf",0xbfbff820,63) ERR#2 'No such file or directory'
mmap(0x0,4096,0x3,0x1002,-1,0x0) = 672567296 (0x28169000)
break(0x80ca000) = 0 (0x0)
break(0x80cb000) = 0 (0x0)
stat("/etc/pwd.db",0xbfbff8f0) = 0 (0x0)
open("/etc/pwd.db",0x0,00) = 4 (0x4)
fcntl(0x4,0x2,0x1) = 0 (0x0)
read(0x4,0x80ca000,0x104) = 260 (0x104)
break(0x80cc000) = 0 (0x0)
break(0x80cd000) = 0 (0x0)
break(0x80ce000) = 0 (0x0)
lseek(4,0x4000,0) = 16384 (0x4000)
read(0x4,0x80cd000,0x1000) = 4096 (0x1000)
break(0x80cf000) = 0 (0x0)
break(0x80d0000) = 0 (0x0)
lseek(4,0x5000,0) = 20480 (0x5000)
read(0x4,0x80cf000,0x1000) = 4096 (0x1000)
break(0x80d1000) = 0 (0x0)
lseek(4,0x6000,0) = 24576 (0x6000)
read(0x4,0x80d0000,0x1000) = 4096 (0x1000)
break(0x80d2000) = 0 (0x0)
lseek(4,0x7000,0) = 28672 (0x7000)
read(0x4,0x80d1000,0x1000) = 4096 (0x1000)
break(0x80d3000) = 0 (0x0)
lseek(4,0x8000,0) = 32768 (0x8000)
read(0x4,0x80d2000,0x1000) = 4096 (0x1000)
break(0x80d4000) = 0 (0x0)
lseek(4,0x1000,0) = 4096 (0x1000)
read(0x4,0x80d3000,0x1000) = 4096 (0x1000)
break(0x80d5000) = 0 (0x0)
lseek(4,0x2000,0) = 8192 (0x2000)
read(0x4,0x80d4000,0x1000) = 4096 (0x1000)
break(0x80d6000) = 0 (0x0)
lseek(4,0x3000,0) = 12288 (0x3000)
read(0x4,0x80d5000,0x1000) = 4096 (0x1000)
break(0x80d7000) = 0 (0x0)
__sysctl(0xbfbff928,0x2,0x281598e0,0xbfbff924,0x0,0x0) = 0 (0x0)
open("/dev/mem",0x0,00) ERR#13 'Permission denied'
write(2,0xbfbff1e8,10) = 10 (0xa)
write(2,0xbfbff208,8) = 8 (0x8)
write(2,0xbfbff1d8,20) = 20 (0x14)
exit(0x1) process exit, rval = 256
open("/dev/mem",0x0,00) = Permission denied -- это я знал и раньше.
Все остальные открываемые top'ом файлы или присутствуют и в chroot-окружении, или отсутствовали в исходной системе.
Проблема решена. При копировании /usr/bin/top в chroot-окружение терялся флаг SGID (как раз для группы kmem).