![어떤 프로그램이 실행 파일을 호출하는지 모니터링](https://linux55.com/image/92915/%EC%96%B4%EB%96%A4%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%B4%20%EC%8B%A4%ED%96%89%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94%EC%A7%80%20%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81.png)
실행 파일이 shebang 라인을 통해 인터프리터로 사용되는 경우를 포함하여 어떤 프로그램이 특정 실행 파일을 호출하는지 알고 싶습니다.
이것은 질문과 정확히 동일하지 않습니다.어떤 프로그램이 특정 파일에 액세스하는지 확인. 예를 들어 호출 성공 후 auditctl -w /usr/bin/myprogram
감사 이벤트가 발생하여 프로그램이 자동으로 실행되고 있음을 알려줍니다 .execve
한 가지 옵션은 아래와 같이 실행 파일을 래퍼로 바꾸는 것입니다.
#!/bin/sh
logger "$0: executed by uid=$(id -u) ruid=$(id -ur) cmd=$(ps -o args= -p $PPID)"
exec "$0.real" "$@"
하지만 이렇게 하려면 실제 파일을 이동해야 하며 이는 파괴적입니다(파일은 읽기 전용일 수 없으며 패키지 관리자가 수정한 내용과 충돌하는 등). 프로그램이 스크립트의 인터프리터로 사용되면 shebang이 중첩되지 않기 때문에 작동하지 않습니다. (이 경우 auditctl -w /usr/bin/interpreter
유용한 결과를 제공하지만 두 경우 모두에 작동하는 솔루션이 필요합니다.) bash의 경우 /bin/sh
bash가 권한을 제거하기 때문에 setuid 프로그램에서는 작동하지 않습니다.
해당 실행 파일을 shebang 해석기로 사용하고 특히 호출 프로세스에 대한 유용한 정보(PPID뿐만 아니라 적어도 프로세스 이름 또는 상위 실행 파일 경로 등)를 기록하는 등 특정 실행 파일의 실행을 모니터링하려면 어떻게 해야 합니까? 호출 프로세스) 사용자 및 매개변수)? 파일을 래퍼로 바꾸지 않는 것이 좋습니다. Linux 관련 솔루션이 가능합니다.
답변1
/etc/ld.so.preload
이는 번거로울 수 있지만 동적으로 연결된 실행 파일인 경우 올바른 실행 파일이 있음을 감지한 경우에만 로깅 후크를 실행하는 전역 사전 로드를 설정할 수 있습니다 .
그것은 다음과 같습니다:
#define _XOPEN_SOURCE
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define TARGET "/some_executable"
__attribute__((constructor))
static void
logger(int argc, char** argv){
/*catch own argv right here and parent's later from /proc */
static char buf[sizeof(TARGET)];
readlink("/proc/self/exe", buf, sizeof(buf)-1);
if ( 0==strcmp(TARGET, buf)){
/* ... */
syslog(/*...*/);
}
}
이 접근 방식의 명백한 단점은 시스템에서 동적으로 연결된 모든 실행 파일의 실행이 약간 지연된다는 것입니다. 그러나 측정 결과에 따르면 지연이 매우 작은 것으로 나타났습니다(<1ms, 여기서 포크+실행 비용은 약 2ms).
권한 제거 문제에 관해서는 아마도 상위 proc 파일(대부분 해당 파일)을 무조건 읽고 에코하는 작은 setuid-root 바이너리가 있을 것입니다. status
아마도 해당 상위 파일이 원하는 파일인 경우에만 가능합니다. 상위 실행 파일을 기록합니다. 그런 다음 로깅 후크에서 setuid 실행 파일을 생성하여 실행 파일의 부모(setuid 도우미의 조부모)에 대한 정보를 얻을 수 있습니다.
답변2
당신은 그것을 사용할 수 있습니다팬 알림특정 파일 시스템의 파일에 대한 모든 열린 작업을 수신하기 위한 API입니다. 이 정보는 열려 있는 파일의 이름과 요청자의 프로세스 ID를 제공하는 파일 설명자를 포함하는 이벤트 구조의 스트림으로 제공됩니다.
귀하의 프로그램은 열기를 허용하거나 거부하도록 선택할 수 있습니다. 즉, /proc
경쟁 조건 없이 계속되도록 허용하기 전에 열기를 수행한 명령과 사용자를 찾기 위해 pid를 찾을 수 있습니다.
매뉴얼 페이지팬 알림(7)이벤트를 가져오고 공개 요청을 중재하기 위해 완전한 C 프로그램이 제공되므로 /proc
. 마운트된 파일 시스템.
이 fatrace
명령은 간단한 테스트를 통해 이 정보 중 일부를 얻는 방법을 보여줍니다. 예를 들어 작은 스크립트를 복사 /bin/bash
한 다음 작성합니다./tmp/bash
~/test2
#!/tmp/bash
pwd
fatrace
현재 디렉터리 파일 시스템을 수신하고 열기를 수신하는 /tmp
옵션을 사용하여 파일 시스템에서만 실행합니다 (별도의 tmpfs 마운트라고 가정).-c
-f O
cd /tmp
sudo fatrace -c -f O
이제 달리면
sh -c 'echo $$; ~/test2'
expect -c 'spawn /home/meuh/test2'
~/test2
기록된 내용이 표시되어야 합니다.
sh(7360): RO /tmp/bash
expect(7414): RO /tmp/bash
bash(7590): RO /tmp/bash