프로세스 생성 시 후크 작업

프로세스 생성 시 후크 작업

각 프로세스 생성 시 스크립트 실행을 연결하는 것이 가능합니까?

디스크 활동을 모니터링하기 위해 inotifywait와 기본적으로 동일하지만 프로세스 테이블에 적용됩니다.

프로세스가 생성되는 동안 로깅, cgset 등과 같은 작업을 수행할 수 있습니다. 새로운 프로세스의 과제에 재귀적으로 적용되는 것을 볼 수 있습니다. 그러나 경쟁 조건에 취약한 변경 사항을 파악하기 위해 프로세스 테이블을 최대한 빨리 폴링하는 것보다 더 좋은 방법이 있습니까?

감사해요

답변1

첫째, 프로세스 생성은 기록하기에 유용한 이벤트가 아니며 보안(리소스 제약 조건 제외)과 관련이 없습니다. 내 생각에 당신은 프로그램의 실행을 연결하는 것을 의미한다고 생각합니다.execve, 아니요fork.

둘째, 귀하가 인용한 사용 사례는 일반적으로 자체적으로 출시하는 것보다 이러한 목적으로 설계된 기존 메커니즘을 사용하는 것이 더 좋습니다.

  • 로깅의 경우,BSD 프로세스 회계정보가 거의 제공되지 않으며 Linux의 대부분의 Unix 변형에서 작동합니다.GNU 회계 유틸리티(배포판에서 패키지를 설치하십시오). Linux에서 보다 복잡한 로깅을 위해 다음을 사용할 수 있습니다.감사 하위 시스템(이것auditctl매뉴얼 페이지에는 위에서 설명한 대로 예가 있으며 기록하려는 시스템 호출은 다음과 같습니다 execve.
  • 특정 프로그램에 보안 제한을 적용하려면 보안 프레임워크를 사용하세요.SELinux또는갑옷을 적용.
  • 컨테이너에서 특정 프로그램을 실행하거나 특정 설정을 사용하려면 실행 파일을 이동하고 해당 위치에 필요한 설정을 설정하고 원본 실행 파일을 호출하는 래퍼 스크립트를 배치합니다.

다른 프로그램의 작동 방식에 영향을 주지 않고 특정 프로그램이 다른 프로그램을 호출하는 방식을 수정하려는 경우 다음과 같은 두 가지 시나리오가 있습니다. 프로그램이 잠재적으로 적대적일 수 있습니다.

  • 프로그램이 악성일 수 있는 경우 전용 가상 머신에서 실행하세요.
  • 프로그램이 공동 작업인 경우 가장 확실한 공격 각도는 다른 PATH.마운트 네임스페이스(당신은 또한 볼 수 있습니다커널: 네임스페이스 지원). 정말 세부적인 제어가 필요한 경우 호출자를 사용하여 라이브러리를 로드하고 특정 라이브러리 호출을 재정의할 수 있습니다 LD_PRELOAD=my_override_library.so theprogram. 바라보다실행 전 파일 설명자 리디렉션예를 들어. 내부 C 라이브러리 호출은 영향을 받지 않으므로 이 외에도 내부적으로 호출되는 모든 C 라이브러리 함수를 execve재정의해야 합니다 . 다음 프로그램을 실행하면 보다 정확한 제어를 얻을 수 있습니다 . 이렇게 하면 C 라이브러리 함수에 의해 생성된 시스템 호출을 무시할 수 있지만 설정하기가 더 어렵습니다. (쉬운 방법은 모르겠습니다.) 이것).execveLD_PRELOADptrace

답변2

//fakeExec.c
#include <unistd.h>
#include <stdio.h>
#include <sys/syscall.h>
int execve(const char *path, char *const argv[], char *const envp[]) {
  printf("Execing \"%s\"\n", path);
    return syscall(SYS_execve, path, argv, envp);
}

터미널에서:

$ gcc -fPIC -shared fakeExec.c -o fakeExec.so
$ export LD_PRELOAD=$PWD/fakeExec.so 

이제 새로 실행된 각 파일을 stdout.

포크 포장을 완료하려면 분명히 더 많은 작업이 필요했습니다.

(간단한 fork래퍼(위와 유사하지만 fork대신 execve)는 작동하지만 setgpid생성된 프로세스에 일부 버그가 발생할 수 있습니다.

분명히 libc fork함수에는 내가 잘 이해하지 못하는 몇 가지 추가 기능이 있습니다. )

관련 정보