Да.
Возможности root были разделены. Теперь у процесса может быть их подмножество (, включая root, у которого их нет ).
Глядя на справочную страницу возможностей , мы можем увидеть, что root может (обычно )делать.
Я включаю сюда несколько :
CAP_DAC_OVERRIDE
Bypass file read, write, and execute permission checks. (DAC
is an abbreviation of "discretionary access control".)
CAP_KILL
Bypass permission checks for sending signals (see kill(2)).
This includes use of the ioctl(2) KDSIGACCEPT operation.
CAP_NET_BIND_SERVICE
Bind a socket to Internet domain privileged ports (port
numbers less than 1024).
CAP_SYS_MODULE
* Load and unload kernel modules (see init_module(2) and
delete_module(2));
* in kernels before 2.6.25: drop capabilities from the system-
wide capability bounding set.
CAP_SYS_TIME
Set system clock (settimeofday(2), stime(2), adjtimex(2)); set
real-time (hardware) clock.
CAP_SYS_RAWIO
* Perform I/O port operations (iopl(2) and ioperm(2));
* access /proc/kcore;
* employ the FIBMAP ioctl(2) operation;
* open devices for accessing x86 model-specific registers
(MSRs, see msr(4));
* update /proc/sys/vm/mmap_min_addr;
* create memory mappings at addresses below the value
specified by /proc/sys/vm/mmap_min_addr;
* map files in /proc/bus/pci;
* open /dev/mem and /dev/kmem;
* perform various SCSI device commands;
* perform certain operations on hpsa(4) and cciss(4) devices;
* perform a range of device-specific operations on other
devices.
Из показанных здесь CAP_SYS_MODULE
можно использовать для загрузки модуля ядра, который может это сделать; CAP_SYS_RAWIO
можно использовать для открытия /dev/mem
; Есть и другие способы с другими возможностями, в том числе ptrace
.
pgrep -f
соответствует конкатенации с символами SPC аргументов, переданных последней команде, выполняемой процессом (, как показано в /proc/pid/cmdline
в Linux ). Это никогда не содержит символов NUL.
Значит, нужно:
pgrep -f '^[^ ]*foo( |$)'
Хотя вы пропустите процессы, которые выполнили какую-либо команду с /path/with space/foo
как argv[0]
, и он сообщит о процессах, которые выполнили команду с foo bar
как argv[0]
.
В любом случае вы не можете передать NUL в качестве аргумента выполняемой команде, поскольку аргументы команды представляют собой строки с разделителями NUL -.
В zsh
вы можете передавать NUL встроенным командам и функциям (, поскольку на них не распространяется это ограничение execve()
, поскольку они не выполняются). Итак, в Linux вы можете сделать:
print -rC1 /proc/<->(Ne[$'[[ "${$(<$REPLY/cmdline)%%\0*}" = *foo ]]']:t)
, чтобы найти процессы, у которых argv[0]
заканчивается на foo
.
Или:
print -rC1 /proc/<->/exe(N-.e['[[ $REPLY:A = *foo ]]']:h:t)
Для тех, кто выполняет команду, путь которой заканчивается на foo
(, хотя вы можете быть ограничены вашими собственными процессами ).
В Linux имена процессов ограничены 15 байтами и заменяются на первые 15 байтов базового имени первого аргумента каждого вызова, который они делают в execve()
, хотя их также можно изменить, записав в /proc/pid/comm
или с prctl(PR_SET_NAME)
. Процессы также могут изменять содержимое /proc/pid/cmdline
. См., например,:
$ perl -lne 'BEGIN{$0 = "foo bar 90123456789"}; print "$ARGV: $_"' /proc/self/{cmdline,comm}
/proc/self/cmdline: foo bar 90123456789
/proc/self/comm: foo bar 9012345