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에서 지원된다는 이점이 있습니다. 여기서는 jdoe
UID가 있다고 가정합니다 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
입니다(런타임이 컨텍스트 스위치를 푸시하는 방법을 실행하고 확인하세요) .SystemTap
strace
vmstat 1
strace