왜 루트인데도 strace / gdb가 프로세스에 연결되지 않습니까?


26
  • 루트로 로그인했지만 다음을 strace제공합니다.

    root @ kyznecov- 시스템 : / home / kyznecov # ps -e | grep 111
     3807 pts / 2 00:00:00 111
     3810 포인트 / 2 00:00:00 111
    root @ kyznecov- 시스템 : / home / kyznecov # strace -p 3810
    
    첨부 : ptrace (PTRACE_ATTACH, ...) : 허용되지 않는 작업
    프로세스에 첨부 할 수 없습니다. uid가 대상의 uid와 일치하는 경우
    프로세스에서 / proc / sys / kernel / yama / ptrace_scope의 설정을 확인하거나 시도하십시오
    루트 사용자로 다시. 자세한 내용은 /etc/sysctl.d/10-ptrace.conf를 참조하십시오.
    root @ kyznecov- 시스템 : / home / kyznecov
    
    root @ kyznecov- 시스템 : / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope
    0
  • 그런 다음 gdb포크로 Eclipse CDT에서 다중 프로세스 프로그램을 디버깅하는 데 사용하려고 시도했지만 동일한 결과 / 오류가 발생했습니다.

    여기에 이미지 설명을 입력하십시오

어떤 아이디어?


ptrace_scope가 0이므로 중요하지 않지만 실험처럼 추적 프로세스가 추적되는 프로세스의 부모 인 strace를보다 간단하게 사용할 수 있습니다. 예를 들어 strace /bin/echo test? 동일한 오류 메시지가 표시됩니까?
Jordan Uggla

@EliahKagan, 이론적으로 OP가 설명 한 것은 커널 버그가 없으면 발생할 수 없습니다 . 다음 24 시간 정도의 시간이 있고 귀하의 의견을 답변으로 바꿀 수 있다면 좋을 것입니다. Precise에서 테스트 한 결과 아무런 문제가 없었으며, 이런 방식으로 인해 기발한 부분이 있다는 결정적인 답이 될 것입니다 OP의 구성에서 ... 그는 5 월 29 일에 그의 초기 질문 이후로 돌아 오지 않았습니다.
ish

@EliahKagan, OpenVZ VPS / VM에 뿌리를 두고 있을 때 (호스트 시스템 커널을 공유하는 경우가 많음) , 당신은 당신 자신의 작은 섬의 왕일뿐입니다). 이 페이스트
ish

@izx 붙여 넣기가 만료되었습니다. 그리고 컨테이너
안에이

답변:


25

오류가 발생하는 한 가지 이유 :

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

프로세스가 이미에 부착되어 있기 때문에이다 gdb, strace또는 이와 유사한. 이런 경우인지 확인하려면 다음을 실행하십시오.

grep TracerPid /proc/$THE_PID/status

0이 아닌 경우 해당 프로세스에서 이미 추적을 실행중인 기존 프로그램의 pid입니다.


우리는 이미 Eclipse에서 디버깅하고 있다면 이미 눈치 채지 못합니다. 이미 GDB를 사용하고 있습니다
ernesto

이것을 지적 해 주셔서 감사합니다. strace wrapper를 통해 프로그램을 실행 중이었습니다. 프로그램이 포크 된 다음 실행됩니다. execked 자식은 strace wrapper를 실행할 때 빠르게 죽습니다. 부모 프로세스가 이미 strace의 제어를 받고 있기 때문에 연결되지 않습니다.
Rob Kennedy

18

izx 가 언급 했듯이 , 이것은 커널 버그로 인해 발생할 수 있습니다. 따라서 현재이 질문의 원본 포스터를 포함하여이 문제를 일으킬 수있는 사람은 해당 페이지를 철저하고 신중하게 읽고 영향을받는 컴퓨터에서 실행 하여 버그보고하는 것이 좋습니다ubuntu-bug linux . 메인 라인 커널에서 로드 할 수없는 경우 메인 라인 (업스트림) 커널이 아니라linux Ubuntu에서 이를보고해야합니다 ( 로드해야 함).yama

Ubuntu 10.10으로 시작하는 모든 버전의 Ubuntu에서 예상되는 동작은 B가 A의 직접적인 자식이 아니면 프로세스 A가 실행중인 프로세스 B를 추적 할 수 없다는 것 root입니다. 이는 보안 강화 기능으로, 공격자가 손상된 프로세스가 커널이 제공 한 디버깅 기능을 사용하여 다른 프로세스에서 정보를 검색 할 수 없도록합니다. 이것은 보안 기능 커뮤니티 위키 페이지ptrace 범위 섹션에 설명되어 있습니다.

이 제한적인 동작은 기본값이지만 프로세스 A가 프로세스 A와 동일한 사용자 ID로 실행중인 실행중인 프로세스 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있지만, 원래 포스터는 여전히 실행할 때 그렇게 할 수없는 다음이었다 straceroot. 이것이 버그 일 수있는 방법을 찾기는 어렵습니다. 버그로보고하는 것이 좋습니다.

처음에는 ptrace_scope설정 0이 무시되고 마치 처리되는 문제를 재현 할 수 있다고 생각 했습니다 1. 그러나 나는 더 이상 똑같은 일을 다시했기 때문에 이것이 더 이상 사실이라고 믿지 않으며 문제를 재현 할 수 없습니다. 나는 이것을 테스트했다 :

  • 나는 매일 메인 박스로 사용하는 Lubuntu Precise amd64 실제 머신입니다.
  • Lubuntu Precise i386 (12.04) 라이브 CD를 실행하는 VirtualBox 가상 머신.
  • Quantal i386 (Ubuntu + 1)을 매일 실행하는 동일한 VirtualBox 가상 머신 (20120608).

세 대의 컴퓨터 모두에서 예상되는 동작이 발생하며이 질문의 원래 포스터가 요구하는 조건을 재현 할 수 없습니다. 다음은 터미널 (Precise 라이브 시스템)의 일부 텍스트입니다.

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를 최대한 포괄적으로 검색 하면 소수의 결과 만 생성 되며이 버그에 대한 보고서는 없습니다 . 버그를보고하면 다른 사람에게 도움이되고 해결 방법이나 수정으로 이어질 수 있으며 문제가 여전히 발생한다고 가정 할 때이 문제에 대한 작업을 진행할 수있는 유일한 의미있는 방법 일 수 있습니다.


제안 해 주셔서 감사합니다. 내일 자세히 읽어보고 소제목을 추가 할 수도 있지만, 이것이 매우 철저하다고 생각합니다.)
ish

내 게시물에서 볼 수 있습니다 : root @ kyznecov-System : / home / kyznecov # cat / proc / sys / kernel / yama / ptrace_scope 0 내가했던 것 : echo 0 | sudo tee / proc / sys / kernel / yama / ptrace_scope
andreykyz

concole에서는 모든 것이 쉽게 작동합니다. 그러나 일식에서 프로그램을 실행하고 콘솔에서 strace를 시도하면 문제가 발생합니다.
andreykyz

2
이미 추적중인 프로세스의 부작용 일 수 있습니까? allow-fork-mode 자식이있는 부모 프로세스에서 gdb를 사용할 때도 같은 문제가 발생했습니다.
Jamie Pate

2
14.04 에서도이 버그가 발생합니다. 버그가보고 된 사람이 있습니까?
detly
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.