/tmp/*some folder*
일부 파일을 만들고 실행하는 바이너리가 있습니다 . 동일한 바이너리는 이러한 파일을 실행한 후 즉시 삭제합니다. 이러한 파일을 차단할 수 있는 방법이 있나요?
바이너리 파일에는 쓰기 권한이 필요하기 때문에 폴더를 읽기 전용으로 만들 수 없습니다. 실행 시 파일을 복사하거나 원본 바이너리가 파일을 삭제하는 것을 방지하는 방법이 필요합니다.
답변1
chattr +a /tmp/*some folder*
폴더를 추가만하도록 설정합니다. 파일을 생성하고 쓸 수 있지만 삭제할 수는 없습니다. chattr -a /tmp/*some folder*
완료되면 사용하세요.
답변2
다음 inotifywait
명령을 사용할 수 있습니다이노티파이 도구예를 들어 다음에서 생성 /tmp/some_folder
된 모든 파일을 하드링크합니다 ./tmp/some_folder
/tmp/some_folder_bak
#!/bin/sh
ORIG_DIR=/tmp/some_folder
CLONE_DIR=/tmp/some_folder_bak
mkdir -p $CLONE_DIR
inotifywait -mr --format='%w%f' -e create $ORIG_DIR | while read file; do
echo $file
DIR=`dirname "$file"`
mkdir -p "${CLONE_DIR}/${DIR#$ORIG_DIR/}"
cp -rl "$file" "${CLONE_DIR}/${file#$ORIG_DIR/}"
done
하드링크이기 때문에 프로그램이 수정하면 업데이트해야 하지만, 프로그램이 삭제할 때 삭제하면 안 됩니다. 하드 링크 클론은 정상적으로 삭제할 수 있습니다.
이 방법은 원자적이지 않으므로 프로그램이 새로 생성된 파일을 삭제하기 전에 이 스크립트를 사용하여 하드 링크를 생성해야 합니다.
복제하고 싶다면모두로 변경하면 /tmp
보다 분산된 스크립트 버전을 사용할 수 있습니다.
#!/bin/sh
TMP_DIR=/tmp
CLONE_DIR=/tmp/clone
mkdir -p $CLONE_DIR
wait_dir() {
inotifywait -mr --format='%w%f' -e create "$1" 2>/dev/null | while read file; do
echo $file
DIR=`dirname "$file"`
mkdir -p "${CLONE_DIR}/${DIR#$TMP_DIR/}"
cp -rl "$file" "${CLONE_DIR}/${file#$TMP_DIR/}"
done
}
trap "trap - TERM && kill -- -$$" INT TERM EXIT
inotifywait -m --format='%w%f' -e create "$TMP_DIR" | while read file; do
if ! [ -d "$file" ]; then
continue
fi
echo "setting up wait for $file"
wait_dir "$file" &
done
답변3
/tmp에서 실행된 프로그램이 여전히 실행 중인 경우 파일 시스템에서 "제거"되더라도 inode가 여전히 데이터와 함께 존재하기 때문에 일반적으로 원래 바이너리를 검색할 수 있습니다. 삭제하면 단순히 디렉터리에서 이름의 연결이 해제됩니다.
Linux에서는 /proc/PID/exe 링크를 통해 inode의 내용에 액세스할 수 있습니다. 비슷한 도구를 사용 ls
하면 원래 경로가 표시되고 링크가 끊어진 것으로 표시됩니다(색상별로). 그러면 목록의 이름에 "(삭제됨)"과 같은 내용이 표시됩니다. 그러나 파일을 읽어 검색할 수는 있습니다.
이 개념을 보여주는 예(수면을 예시 도구로 사용):
$ cp /bin/sleep /tmp/otherprog
$ /tmp/otherprog 300 &
[1] 3572
$ rm /tmp/otherprog
$ ls -l /proc/3572/exe
lrwxrwxrwx 1 john john 0 Feb 27 08:54 /proc/3572/exe -> /tmp/otherprog (deleted)
$ cp /proc/3572/exe /tmp/saved
$ diff /tmp/saved /bin/sleep
$ echo $?
0
수면 프로그램의 내용을 "otherprog"라는 새로운 프로그램에 복사해서 "새" 프로그램을 만들고, 한동안 계속 실행되도록 실행해 봤습니다. 그런 다음 /tmp에서 프로그램을 삭제했습니다. 셸에서 얻은 PID를 사용하여(관심 있는 프로그램의 PID를 찾으면 관심 있는 프로그램의 PID를 찾을 수 있습니다. ps
) /proc에 있는 exe 링크를 살펴본 다음 파일의 내용을 복사했습니다(심지어 대상 파일 이름은 사라졌지만) 내용이 원본과 동일한지 확인했습니다.
물론 /tmp에 있는 프로그램이 일시적인 경우에는 작동하지 않습니다. 왜냐하면 프로그램이 종료되면 inode의 링크 수가 데이터가 실제로 디스크에서 해제되는 지점까지 떨어지기 때문입니다.
/tmp 디렉토리에서 링크를 해제하기 전에 서둘러 파일을 복사하는 것을 방지합니다.