IT이야기

GDB를 프로세스에 연결하려고 할 때 "추적 작업이 허용되지 않음"을 해결하는 방법

cyworld 2022. 5. 7. 09:37
반응형

GDB를 프로세스에 연결하려고 할 때 "추적 작업이 허용되지 않음"을 해결하는 방법

gdb로 프로그램을 첨부하려고 하는데 반환된다.

프로세스 29139에 부착
프로세스에 연결할 수 없음.uid가 대상 프로세스의 uid와 일치할 경우 /proc/sys/kernel/yama/ptrace_scope의 설정을 확인하거나 루트 사용자로 다시 시도하십시오.자세한 내용은 /etc/sysctl.d/10-ptrace.conf를 참조하십시오.
추적:작업이 허용되지 않음.

gdb-debugger가 "프로세스에 연결하지 못했습니다, 권한을 확인하고 다시 시도하십시오."를 반환함

strace returns "attach: ptrace(PTRACE_ATTACH, ...): 작업이 허용되지 않음"

"kenernel.yama.ptrace_scope" 1을 0으로 바꾸고/proc/sys/kernel/yama/ptrace_scope1대 0으로 하고 시도했다.set environment LD_PRELOAD=./ptrace.so이것과 함께:

#include <stdio.h>
int ptrace(int i, int j, int k, int l) {
    printf(" ptrace(%i, %i, %i, %i), returning -1\n", i, j, k, l);
    return 0;
}

그러나 그것은 여전히 같은 오류를 반환한다.디버거에 어떻게 부착하지?

도커를 사용하는 경우 다음과 같은 옵션이 필요할 수 있다.

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined

만약 당신이 포드맨을 사용하고 있다면, 당신은 아마도 포드맨이 필요할 것이다.--cap-add옵션도:

podman run --cap-add=SYS_PTRACE

이는 Linux의 커널 강화로 인해 발생하며, 다음과 같은 방법으로 이 동작을 사용하지 않도록 설정할 수 있음echo 0 > /proc/sys/kernel/yama/ptrace_scope또는 에서 수정하여/etc/sysctl.d/10-ptrace.conf

Ubuntu 및 에 대한 설명 스레드와 함께 Fedora 22(설명서 링크 포함)의 이 기사를 참조하십시오.

단지 관련된 대답을 강조하고 싶을 뿐이다.당신이 뿌리라고 가정해봅시다.

strace -p 700

그리고 다음을 얻으십시오.

strace: attach: ptrace(PTRACE_SEIZE, 700): Operation not permitted

확인:

grep TracerPid /proc/700/status

이런 걸 보면.TracerPid: 12즉, 0이 아니라 ptrace 시스템 호출을 이미 사용하고 있는 프로그램의 PID 입니다.둘 다gdb그리고strace그것을 사용하고, 한 번에 한 명만 활동할 수 있다.

나는 내가 필요했다는 것을 덧붙이고 싶다.--security-opt apparmor=unconfined@bucky가 언급한 옵션들과 함께.이것은 Ubuntu 18.04 (Docker 클라이언트와 호스트 둘 다)에 있었다.따라서 컨테이너 내에서 gdb 디버깅을 활성화하기 위한 전체 호출은 다음과 같다.

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined

우리 대부분이 도커 문제로 이곳에 도착하는 동안 쿠베르네츠가 대답할 겁니다 누군가에게 도움이 될 수도 있으니...


추가해야 한다.SYS_PTRACE팟의 보안 컨텍스트에 있는 기능:spec.containers.securityContext:

       securityContext:
          capabilities:
            add: [ "SYS_PTRACE" ]

2개가 있다.securityContext2개의 다른 위치에 있는 키.키를 잘못 배치한 경우보다 인식되지 않는 경우.다른 것을 시도해봐.

기본적으로 루트 사용자도 있어야 할 수 있다.다른 보안 컨텍스트에서는spec.securityContext) 추가 :

      securityContext:
        runAsUser: 0
        runAsGroup: 0
        fsGroup: 101

FYY : 0은 루트다.그러나 fsGroup 값은 나에게 알려지지 않았다.내가 하고 있는 일이라면 난 상관없어. 하지만 넌 할 수 있어.

이제 다음 작업을 수행하십시오.

strace -s 100000 -e write=1  -e trace=write -p 16

너는 더 이상 허락을 받지 않을 거야!

주의: 이것은 판도라 상자 입니다.이것을 생산에 사용하는 것은 권장하지 않는다.

위의 사용 사례를 실제로 다루지는 않았지만, 나는 다음과 같은 문제가 있었다.

문제:우연히 나는 내 프로그램을 시작했다.sudogdb를 발사할 때 나한테 줬어ptrace: Operation not permitted.

해결책:sudo gdb ...

Debian Distribution에서 set capability 명령을 설정하여 Ethernet Raw Sockets를 처리할 수 있는 더 높은 권한으로 코드를 실행하고 있었다.나는 위의 해결책을 시도해 보았다.echo 0 > /proc/sys/kernel/yama/ptrace_scope또는 에서 수정하여/etc/sysctl.d/10-ptrace.conf하지만 그건 나에게 효과가 없었어.

또한 설치된 디렉토리(usr/bin/gdb)에서 gdb에 대한 기능 설정 명령을 사용해 보았더니 다음과 같이 작동한다./sbin/setcap CAP_SYS_PTRACE=+eip /usr/bin/gdb. 루트 권한으로 이 명령을 실행하십시오.

나는 이 오래된 질문에 대답하려고 했는데, 그것은 받아들여지지 않았고 다른 어떤 대답도 요점을 이해하지 못했기 때문이다.진짜 답은 이미 다음과 같다./etc/sysctl.d/10-ptrace.conf우분투 휘하의 내 경우인 만큼이 파일에는 다음과 같은 내용이 있다.

PTRACE가 필요한 충돌 핸들러를 시작하는 애플리케이션의 경우, 디버거에서 PTRACE를 사용할 프로세스를 세그폴트 핸들러에 구체적으로 선언하여 디버거에 의해 예외를 등록할 수 있다: prctl(PR_SET_PTRACER, 디버거_pid, 0, 0, 0);

그러니 위의 것과 같은 일을 하라: 계속하라./proc/sys/kernel/yama/ptrace_scope1로prctl(PR_SET_PTRACER, debugger_pid, 0, 0, 0);난세에그러면 디버거가 디버깅을 할 수 있게 된다.이것은 없어도 된다.sudo리부팅 없이.

보통, 디버지는 또한 전화할 필요가 있다.waitpid디버거가 디버거의 진드기를 찾을 수 있도록 충돌 후 탈출하는 것을 피하기 위해.

제섭의 대답은 정확하다; 그것은 리눅스 커널 강화 때문이다.내 경우, 나는 Mac용 Docker Community를 사용하고 있으며, 플래그를 변경하려면 저스틴 코맥의 nsenter(ref: https://www.bretfisher.com/docker-for-mac-commands-for-getting-into-local-docker-vm/)를 사용하여 LinuxKit 셸에 들어가야 한다.

docker run -it --rm --privileged --pid=host justincormack/nsenter1

/ # 고양이 /etc/이슈

LinuxKit 시작

                    ##         .
              ## ## ##        ==
           ## ## ## ## ##    ===
       /"""""""""""""""""\___/ ===
      {                       /  ===-
       \______ O           __/
         \    \         __/
          \____\_______/

/ # cat /sym/symer/koder/yama/ptrace_message

1

/ # 에코 0 > /mech/sys/keneral/yama/ptrace_message

/ # 출구

만약 허가가 문제라면, 당신은 아마도 gdbserver를 사용하기를 원할 것이다. (나는 gdb, 독커, 아니오, 또는 여러 가지 이유로 거의 항상 gdbserver를 사용한다.)도커 이미지에 gdbserver(Deb) 또는 gdb-gdbserver(RH)를 설치해야 한다.도커에서 프로그램을 실행하십시오.

$ sudo gdbserver :34567 myprogram arguments

(포트 번호, 1025-65535를 선택하십시오.)그런 다음 호스트의 gdb에서

(gdb) target remote 172.17.0.4:34567

어디에172.17.0.4보고된 도커 이미지의 IP 주소/sbin/ip addr list도커 영상에 나타나다이것은 이전 지점에 부착될 것이다.main달릴 수 있다.tb main그리고c에 멈추다main또는 당신이 좋아하는 곳.gdb를 cgdb, emacs, vim에서 실행하거나 심지어 IDE 또는 일반에서 실행하십시오.소스에서 gdb를 실행하거나 트리를 빌드할 수 있으므로 모든 것이 어디에 있는지 알 수 있다.(소스를 찾을 수 없는 경우 를 사용하십시오.dir명령).이것은 보통 도커 이미지에서 실행하는 것보다 훨씬 낫다.

gdbserver는 에 의존한다.ptrace그래서 당신은 위에서 제안된 다른 것들도 할 필요가 있을 것이다. --privileged --pid=host내게 충분한.

다른 OS나 임베디드 대상에 배포하면 gdb서버나 gdb 스텁을 거기서 실행할 수 있고, gdb를 같은 방법으로 실행해, 실제 네트워크를 통해서나 직렬 포트를 통해서도 연결할 수 있다./dev/ttyS0).

아마도 누군가가 이 과정을 gdb에 첨부했을 것이다.

  • ps -ef | grep gdb

gdb는 동일한 프로세스를 두 번 부착할 수 없다.

LD_PRELOAD로 무엇을 하고 있는지, ptrace 기능으로 무엇을 하고 있는지 모르겠다.

아주 간단한 프로그램에 gdb를 첨부해보는 건 어떨까?단순히 Hello 등을 반복적으로 인쇄하는 프로그램을 만들고 gdb --pid [Hello program PID]를 사용하여 부착한다.

만약 그것이 효과가 없다면 당신은 정말로 문제가 있다.

또 다른 문제는 사용자 ID이다.추적 중인 프로그램이 다른 UID로 설정되었는가?그렇다면 동일한 사용자 ID를 사용하거나 루트인 경우가 아니면 추적할 수 없다.

같은 문제에 직면하고 많은 해결책을 시도했지만, 마침내 해결책을 찾았지만, 정말 문제가 무엇이었는지 모르겠다.먼저 ptrace_conf 값을 수정하여 Ubuntu에 루트로 로그인했지만 여전히 문제가 나타난다.그런데 가장 이상한 일이 일어난 것은 gdb가 내게 다음과 같은 메시지를 보여준 것이다.

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 warning: process 3767 is already traced by process 3755 ptrace: Operation not permitted.

ps 명령단말기에는 프로세스 3755가 나열되지 않았다.

3755의 과정을 /proc/$pid에서 찾았는데 무슨 과정이었는지 모르겠어!!

마지막으로 PTRACE_ATTACH syscall을 사용하여 vid gdb와 트레이서 c 프로그램을 첨부하려고 하는 대상 파일(foo.c)을 삭제했고, 다른 폴더에서는 다른 c 프로그램을 만들어 컴파일했다.

문제가 해결되어 gdb나 ptrace_attach syscall로 다른 프로세스에 연결할 수 있게 되었다.

(gdb) attach 4416

Attaching to process 4416

그리고 4416을 처리하기 위해 많은 신호를 보낸다.gdb와 ptrace로 모두 테스트해 봤는데, 둘 다 제대로 작동한다.

정말 무엇이 문제였는지 모르지만, 우분투에는 많은 사이트들이 언급했듯이 버그가 아니라고 생각한다. https://askubuntu.com/questions/143561/why-wont-strace-gdb-attach-to-a-process-even-though-im-root

추가 정보

ovs 브리지 추가와 같은 인터페이스를 변경하려면 다음을 사용하십시오.--privileged대신에--cap-add NET_ADMIN.

sudo docker run -itd --name=testliz --privileged --cap-add=SYS_PTRACE --security-opt seccomp=unconfined ubuntu

FreeBSD를 사용하는 경우 편집/etc/sysctl.conf, 라인을 변경하십시오.

security.bsd.unprivileged_proc_debug=0

security.bsd.unprivileged_proc_debug=1

그런 다음 재부팅하십시오.

참조URL: https://stackoverflow.com/questions/19215177/how-to-solve-ptrace-operation-not-permitted-when-trying-to-attach-gdb-to-a-pro

반응형