Почему strace / gdb не присоединяется к процессу, даже если я root?

26
  • Я вошел в систему как root, но straceдает мне это:

    root @ kyznecov-System: / home / kyznecov # ps -e | grep 111
     3807 баллов / 2 00:00:00 111
     3810 баллов / 2 00:00:00 111
    root @ kyznecov-System: / home / kyznecov # strace -p 3810
    
    attach: ptrace (PTRACE_ATTACH, ...): операция не разрешена
    Не удалось подключиться к процессу. Если ваш идентификатор совпадает с идентификатором цели
    обработайте, проверьте настройку / proc / sys / kernel / yama / ptrace_scope или попробуйте
    снова как пользователь root. Для получения дополнительной информации см. /Etc/sysctl.d/10-ptrace.conf
    корень @ kyznecov-системы: / Главная / kyznecov
    
    root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope
    0
  • Затем я попытался использовать gdbдля отладки многопроцессную программу в Eclipse CDT с разветвлением, и это дало мне тот же результат / ошибку:

    введите описание изображения здесь

Любые идеи?

andreykyz
источник
Поскольку ptrace_scope равен нулю, это не должно иметь значения, но в качестве эксперимента вы можете попробовать более простое использование strace, где процесс трассировки является родителем отслеживаемого процесса. Например strace /bin/echo test? Это дает то же самое сообщение об ошибке?
Джордан Уггла
@EliahKagan, теоретически то, что описал OP, не может произойти при отсутствии ошибки в ядре. Если у вас есть какое-то время в течение следующих 24 часов или около того, и вы можете превратить свой комментарий в ответ, это было бы замечательно - мое тестирование на Precise не выявило проблем, и в этом случае было бы однозначным ответом на некоторую причуду. в конфигурации OP ... он не вернулся с момента своего первоначального вопроса 29 мая.
Иш
@EliahKagan, одна вещь просто поразила меня при перечитывании бита «операция не разрешена» - потому что я видел это много раз, когда якобы являлся пользователем root на VPS / VM OpenVZ (они разделяют ядро ​​хост-машины, поэтому нет , ты всего лишь король своего маленького острова) ... может быть, так и было? Смотрите эту пасту
иш
@izx Срок годности вашей пасты истек. И у меня есть этот вопрос (внутри контейнера), любое понимание было бы хорошо
Кунал Тяги

Ответы:

25

Одна из причин, чтобы получить ошибку:

attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted

потому что процесс уже был связан с gdb, straceили подобным. Чтобы проверить, так ли это, запустите:

grep TracerPid /proc/$THE_PID/status

Если он ненулевой, это pid существующей программы, которая уже выполняет трассировку для этого процесса.

Натан Кидд
источник
Мы не замечаем этого, если мы отлаживаем в Eclipse ... который уже использует GDB
ernesto
Спасибо за указание на это. Я запускал программу через упаковщик strace. Программа разветвляется, а затем исполняет себя. Исполняемый дочерний элемент быстро умирает, когда запускает оболочку strace, которую не удается подключить, поскольку родительский процесс уже находится под контролем strace.
Роб Кеннеди
18

Как прокомментировал izx , это может произойти только из-за ошибки в ядре. Поэтому любому, кто может создать эту проблему в настоящее время, включая, в частности, оригинальный постер этого вопроса, было бы разумно сообщить о ней как об ошибке , внимательно и внимательно прочитав эту страницу, а затем запустив ее ubuntu-bug linuxна зараженном компьютере . Об этом следует сообщать linuxв Ubuntu, а не против основного (восходящего) ядра, если только вы не можете создать его на основном ядре (вы должны были бы yamaзагрузить).

Ожидаемое поведение в каждой версии Ubuntu, начиная с Ubuntu 10.10, заключается в том, что процесс A не может отследить запущенный процесс B, если B не является прямым потомком A (или A запускается как root). Это улучшение безопасности, благодаря которому процесс, скомпрометированный злоумышленником, не может использовать средства отладки, предоставляемые ядром, для обнаружения информации из других процессов. Это объясняется в разделе « Область действия ptrace» вики-страницы сообщества «Функции безопасности» .

Это ограничительное поведение используется по умолчанию, но его можно изменить, чтобы процесс A мог отслеживать любой запущенный процесс B, запущенный с тем же идентификатором пользователя, что и у процесса A. То есть вы можете настроить свою систему так, чтобы любой из ваших процессов мог отлаживать друг друга. Это упрощает подключение отладчиков к уже запущенным процессам.

Настройка для этого выставляется в /proc/sys/kernel/yama/ptrace_scope sysctl . 1обозначает более ограничительное поведение и 0менее ограничительное поведение. Настройки можно прочитать с помощью:

cat /proc/sys/kernel/yama/ptrace_scope

Менее ограничительное (не по умолчанию) поведение может быть установлено с помощью:

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

И более ограничительное (по умолчанию) поведение может быть установлено (или установлено обратно) с помощью:

echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Мало того, что первоначальный постер этого вопроса не смог прикрепить straceэкземпляр к запущенному в данный момент процессу с ptrace-scopeустановленным значением 0, но оригинальный постер все еще не мог сделать это при запуске straceкак root. Трудно понять, как это может быть что-то кроме ошибки - я настоятельно рекомендую сообщать об этом как об одном.

Сначала я подумал, что смог воспроизвести проблему, когда ptrace_scopeпараметр 0игнорируется и обрабатывается так, как если бы он был 1. Но я больше не верю, что это так, потому что я снова сделал все то же самое, и я не могу воспроизвести проблему. Я проверил это на:

  • Физическая машина Lubuntu Precise amd64, которую я ежедневно использую в качестве основного блока.
  • Виртуальная машина VirtualBox, на которой установлен live-диск Lubuntu Precise i386 (12.04).
  • Идентичная виртуальная машина VirtualBox, на которой работает Quantal i386 (Ubuntu + 1) ежедневно (20120608).

На всех трех машинах происходит ожидаемое поведение, и я не могу воспроизвести условие, о котором спрашивает оригинальный автор этого вопроса. Вот некоторый текст из Терминала (из точной живой системы):

lubuntu@lubuntu:~$ nano&
[1] 3492
lubuntu@lubuntu:~$ strace -p 3492
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Could not attach to process.  If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user.  For more details, see /etc/sysctl.d/10-ptrace.conf

[1]+  Stopped                 nano
lubuntu@lubuntu:~$ cat /proc/sys/kernel/yama/ptrace_scope
1
lubuntu@lubuntu:~$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
0
lubuntu@lubuntu:~$ strace -p 3492
Process 3492 attached - interrupt to quit
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---

strace продолжал производить сообщения, пока я не приостановил это, как ожидалось.

В заключение я рекомендую снова сообщить об этом как об ошибке. Максимально инклюзивный поиск по тексту https://bugs.launchpad.net (который включает в себя все обнаруженные ошибки в Ubuntu) ptrace_scopeпозволяет получить лишь несколько результатов, в которых явно нет отчетов об этой ошибке . Сообщение об ошибке поможет другим, может привести к обходным путям или исправлению и, вероятно, является единственным значимым способом продвинуться вперед в работе над этой проблемой (при условии, что проблема все еще возникает).

Элия ​​Каган
источник
Спасибо за предложение, я буду читать его подробно завтра и , возможно , добавить некоторые подзаголовки, но я думаю , что это очень основательное :)
иш
в моем посте вы можете увидеть: root @ kyznecov-System: / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope 0 Я сделал это: echo 0 | sudo tee / proc / sys / kernel / yama / ptrace_scope
andreykyz
В консоле все работают легко. Но если я запустил программу в eclipse и попробовал strace из консоли, я получил указанную проблему.
andreykyz
2
может быть побочный эффект процесса уже отслеживается? У меня была такая же проблема при использовании GDB на родительском процессе с позволяют вилки режима ребенка
Джейми Pate
2
Я получаю эту ошибку тоже 14.04. Кто-нибудь знает, сообщалось ли об этом когда-либо об ошибке?
детально