각 프로세스 생성 시 스크립트 실행을 연결하는 것이 가능합니까?
본질적으로 디스크 활동을 모니터링하기 위한 inotifywait와 동일하지만 프로세스 테이블에 적용됩니다.
예를 들어 로깅, cgset 등의 프로세스 생성 시 작업을 수행할 수 있도록 허용하는 것입니다. 새로운 프로세스에 반복적으로 적용된다는 과제를 알 수 있습니다. 그러나 경쟁 조건에 취약한 변경 사항을 파악하기 위해 프로세스 테이블을 최대한 빨리 폴링하는 대신 더 좋은 방법이 있습니까?
감사해요
답변1
첫째, 프로세스 생성은 기록하기에 유용한 이벤트가 아니며 보안과 관련이 없습니다(리소스 제한 제외). 나는 당신이 수행되는 프로그램의 실행을 연결하려는 것을 의미한다고 생각합니다.execve
, 아니다fork
.
둘째, 귀하가 인용한 사용 사례는 일반적으로 자체적으로 롤링하는 대신 해당 목적으로 만들어진 기존 메커니즘을 사용하는 것이 가장 좋습니다.
- 로깅의 경우,BSD 프로세스 회계소량의 정보를 제공하며 대부분의 Unix 변형에서 사용할 수 있습니다. Linux에서는GNU 회계 유틸리티(배포판에서 패키지를 설치하십시오). Linux에서 보다 정교한 로깅을 위해 다음을 사용할 수 있습니다.감사 하위 시스템(그만큼
auditctl
매뉴얼 페이지에는 예제가 있습니다. 위에서 설명한 대로 기록하려는 시스템 호출은execve
)입니다. - 특정 프로그램에 보안 제한을 적용하려면 다음과 같은 보안 프레임워크를 사용하세요.SELinux또는앱아머.
- 컨테이너에서 또는 특정 설정으로 특정 프로그램을 실행하려면 실행 파일을 이동하고 원하는 설정을 설정하고 원본 실행 파일을 호출하는 래퍼 스크립트를 해당 위치에 배치합니다.
다른 프로그램의 작동 방식에 영향을 주지 않고 특정 프로그램이 다른 프로그램을 호출하는 방식을 수정하려는 경우 프로그램이 잠재적으로 적대적이거나 그렇지 않은 두 가지 경우가 있습니다.
- 프로그램이 잠재적으로 적대적이라면 전용 가상 머신에서 실행하세요.
- 프로그램이 협력적이라면 가장 확실한 공격 각도는 다른
PATH
. 프로그램이 구성하기 쉽지 않은 절대 경로를 사용하는 경우 골동품이 아닌 Linux 시스템에서 별도의 경로로 실행할 수 있습니다.마운트 네임스페이스(또한보십시오커널: 네임스페이스 지원). 정말 미세한 제어가 필요한 경우LD_PRELOAD=my_override_library.so theprogram
. 보다실행 전 파일 설명자 리디렉션예를 들어. 는 내부 C 라이브러리 호출에 영향을 주지 않으므로 내부적으로execve
호출하는 모든 C 라이브러리 함수를 재정의해야 합니다 . 아래에서 프로그램을 실행하면 보다 정확한 제어를 얻을 수 있습니다 . 이를 통해 C 라이브러리 함수에 의해 생성된 시스템 호출을 무시할 수 있지만 설정하기가 더 어렵습니다(쉬운 방법을 모르겠습니다).execve
LD_PRELOAD
ptrace
답변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
기능에는 약간의 추가 기능이 있는데, 제가 잘 이해하지 못하는 것 같습니다. )