Когда вы удаляете атрибут dumpable, группа из / proc /
файлов и ссылок становится нечитаемой другими процессами, даже принадлежит пользователю.
Справочная страница prctl
гласит:
Процессы, которые не могут быть выгружены, не могут быть подключены через ptrace (2) PTRACE_ATTACH; см. ptrace (2) для получения дополнительной информации.
Если процесс не является дампируемым, право собственности на файлы в каталоге
/ proc / [pid]
процесса затрагивается, как описано в proc (5) .
И proc
справочная страница гласит:
/ proc / [pid]
Каждый подкаталог
/ proc / [pid]
содержит псевдо -файлы и каталоги, описанные ниже. Эти файлы обычно принадлежат действующему пользователю и действующему идентификатору группы процесса. Однако в целях безопасности право собственности предоставляется root: root, если процесс " dumpable "атрибуту присвоено значение , отличное от 1.
И, наконец, ptrace
справочная страница гласит:
Проверка режима доступа Ptrace
Различные части API пользовательского пространства ядра (не только операции
ptrace ()
) требуют так называемых проверок «режима доступа ptrace», результат которых определяет, будет ли операция разрешена (или, в некоторых случаях , приводит к тому, что операция "чтения" возвращает очищенные данные).(...)
Алгоритм, используемый для проверки режима доступа ptrace, определяет , разрешено ли вызывающему процессу выполнить соответствующее действие над целевым процессом. (В случае открытия файлов
/ proc / [pid]
"вызывающий процесс" - это тот, который открывает файл, а процесс с соответствующим PID - "целевой процесс".) Алгоритм выглядит следующим образом:(...)
- Запретить доступ, если атрибут "dumpable" целевого процесса имеет значение , отличное от 1 (...), а вызывающий не имеет возможности
CAP_SYS_PTRACE
в пространстве имен пользователя целевого процесса.
Утилита printf
поддерживает восьмеричные escape-символы:
- В дополнение к escape-последовательностям, показанным в нотации формата файла XBD (
'\\'
,'\a '
,'\b'
,'\f'
,'\n'
,'\r'
,'\t'
,'\v'
),"\ddd"
, где ddd - один, два или три- цифровое восьмеричное число, должно быть записано как байт с числовым значением, указанным восьмеричным числом.
Встроенная функция printf
по крайней мере в Bash и Zsh также поддерживает шестнадцатеричные escape-последовательности \xHH
, а также кавычки $'...'
, которые интерполируют escape-последовательности аналогично.
Таким образом, чтобы использовать такие символы в аргументах командной строки для какой-либо команды, сделайте что-то вроде этого:
$ somecmd "arg_with_$(printf '\017')_xoff"
или поместите его в переменную, если вам нужно использовать символ более одного раза
$ xoff=$(printf '\017')
$ somecmd "many${xoff}odd${xoff}chars"
Или, чтобы передать два байта 0x0f 0x11
(017 021
в восьмеричном формате) на команду, указанную в комментариях:
$ printf "\x0f\x11" | somecmd...
$ printf "\017\021" | somecmd...
Это зависит от оболочки; ZSH предлагает форму $\NNN
% perl -e 'printf "%vx\n", shift' $'\177'
7f
%
Как в zsh
, так и в ksh
другим вариантом будет использование control+v , а затем возврат , который должен вставить ^M
в командную строку, хотя это может быть утомительным и может чрезмерно усложнить историю оболочки.
При их отсутствии другим вариантом является запуск программы, которая генерирует соответствующие символы.
% perl -e 'printf "%vx\n", shift' $( perl -e 'print "\x0F"' )
f
%
Или использовать небольшую программу на C с соответствующими аргументами для вашей программы; это позволит избежать любых осложнений, которые может добавить оболочка
#include <err.h>
#include <unistd.h>
int main(void)
{
execlp("perl", "perl", "-e", "printf \"%vx\\n\", shift", "\x0F",
(char *) 0);
err(1, "exec failed");
return 1;
}