strace가 bash의 PID를 추가하면 sudo 명령이 작동하지 않습니다.

strace가 bash의 PID를 추가하면 sudo 명령이 작동하지 않습니다.

BASH의 PID를 strace.

$ strace -q -f -e execve -p $$ -o <outputFile>

잘 작동하고 출력 파일에 모든 명령 목록이 표시됩니다.

하지만 또 다른 문제에 직면해 있습니다. BASH PID를 연결할 때 명령을 실행할 수 없습니다 sudo.strace

다음 오류가 발생합니다.

sudo: effective uid is not 0, is sudo installed setuid root?

바이너리 setuid로 설정되어 있는지 확인합니다.sudo

---s--x--x. 1 root root 123832 Mar 22 11:35 /usr/bin/sudo

sudo내가 멈출 때 잘 작동합니다 strace.

이것은 버그인가요, 아니면 기술적인 이유가 있나요? 이 문제를 해결하도록 도와주세요.

답변1

이것매뉴얼strace말하는:

실수
setuid 비트를 사용하는 프로그램은 추적 시 유효한 사용자 ID 권한이 없습니다.

비록 버그보다는 setuid 프로세스 디버깅의 보안 영향과 더 관련이 있다고 의심됩니다. 내 기억이 맞다면 strace동일한 추적 인터페이스가 사용되며 gdb이를 통해 실행 중인 프로세스의 메모리를 수정할 수 있습니다. 필요한 것보다 더 많은 권한으로 실행되는 프로세스에 대해 이 작업을 수행할 수 있는 것은 좋지 않습니다.

답변2

사용자가 실행한 모든 명령을 기록하는 다른 방법이 있습니다. 설치 후 sysdig다음과 같은 것을 실행할 수 있습니다.

# sysdig "user.name = jdoe and evt.type = execve"

모든 execve(2)통화를 녹음합니다 jdoe. 출력 형식 등을 사용자 정의하는 -p옵션 입니다.sysdig

또 다른 방법은 이를 사용하는 것인데 SystemTap, 이는 RedHat에서 지원된다는 이점이 있습니다. 여기서는 jdoeUID가 있다고 가정합니다 1000.

probe begin {
    printf("begin trace...\n\n")
}

probe syscall.execve.return {
    if (uid() != 1000) next;
    printf("runs %s[%d]: %s\n", execname(), pid(), cmdline_str());
}

그런 다음 다음과 같은 것을 통해 실행할 수 있습니다.

# stap-prep
...
# stap whatyousavedtheaboveas.stp

두 가지 방법 모두 필요한 것을 정확하게 캡처하고 execve실패한 오류 조건을 처리하는 등 의 조정이 필요할 수 있습니다. 장점은 다음 보다 더 효율적이라는 점 sysdig입니다(런타임이 컨텍스트 스위치를 푸시하는 방법을 실행하고 확인하세요) .SystemTapstracevmstat 1strace

관련 정보