실행 전 명령 바이너리 확인

실행 전 명령 바이너리 확인

Bash 스크립트가 실제로 실행되는 것을 확인할 수 있는 방법이 있습니까?

tarBash 스크립트가 여러 명령(예: , mail, , scp, ) 을 호출하고 이것이 실제인지 mysqldump확인하고 싶다면 파일 및 상위 디렉토리의 소유자이자 유일한 명령인 사용자가 이 작업을 수행할 수 있습니다. 일부 소유자 나 소유자 가 아니라 식별할 수 있는 쓰기 권한이 있는 사용자입니다 .tartarroot/tmp/surprise/tarwww-dataapache2

물론 PATH환경은 이해하고 이게 괜찮은지 궁금하네요또한 확인함실행 중인 bash 스크립트에서 그렇다면 정확히 어떻게 됩니까?

예: (의사 코드)

tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...

답변1

어떤 바이너리를 실행할지 확인하는 대신 처음부터 올바른 바이너리를 실행할 수 있습니다. 예를 들어, 실행되지 않는지 확인하려면 스크립트에서 실행하면 됩니다 /tmp/surprise/tar. /usr/bin/tar또는 $PATH작업을 실행하기 전에 합리적인 값으로 설정하십시오.

시스템 디렉토리 및 기타 시스템 디렉토리에 있는 파일을 신뢰하지 않으면 /usr/bin/신뢰를 회복할 수 없습니다. 귀하의 예에서는 소유자를 확인하는 데 사용하고 있지만 ls이를 신뢰할 수 있는지 어떻게 알 수 있습니까 ls? md5sum및 와 같은 다른 솔루션에도 동일한 주장이 적용됩니다 strace.

시스템 무결성에 대한 높은 수준의 확신이 필요한 경우 특수 솔루션을 사용할 수 있습니다.나는사용된. 그러나 이는 스크립트에서 사용할 수 있는 것이 아닙니다. 전체 시스템은 불변 파일 개념을 사용하여 특별한 방식으로 설정되어야 합니다.

답변2

침입자가 시스템에 접근하여 시스템을 수정할 수 있었다면 $PATH(어떤 상황에서도 포함되어서는 안 됨 /tmp), 실행 파일 소유권에 대해 걱정하기에는 너무 늦었습니다.

대신 다음 내용을 읽어야 합니다.침입에 대처하는 방법.

침략을 완전히 피하는 데 집중하는 것이 가장 좋습니다.

이러한 사항이 중요한 시스템이 있는 경우 공개해야 하는 부분과 비공개로 해야 하는 부분을 분리하고 이들 간의 통신 패턴을 감사하는 것이 좋습니다.

답변3

이는 문서의 유효성을 검사하여 어느 정도 달성할 수 있습니다 md5sum. 따라서 패키지 관리를 사용하는 시스템 apt(나의 경우 Ubuntu 16.04) 에는 /var/lib/dpkg/info/tar.md5sums설치 프로세스 중에 생성된 모든 파일의 md5 합계를 저장하는 파일이 있습니다 tar. 따라서 간단한 if 문을 작성하여 출력이 md5sum /bin/tar파일에 있는 내용과 일치하는지 확인할 수 있습니다.

물론 이는 파일 자체가 변조되지 않았다고 가정합니다. 물론, 이는 공격자가 루트/Sudo 액세스 권한을 얻은 경우에만 발생하며, 이 시점에서 모든 베팅은 중단됩니다.

답변4

를 사용하여 스크립트가 실행 중인 명령을 확인할 수 있습니다 strace. 예를 들어:

strace -f -e execve ./script.sh

다음 스크립트를 사용하십시오.

#!/bin/bash
touch testfile.txt
echo "Hello" >> testfile.txt
cat testfile.txt
rm testfile.txt

strace-e execve인수와 함께 사용될 때 실행되는 명령의 정확한 경로를 알려줍니다.

execve("./script.sh", ["./script.sh"], [/* 69 vars */]) = 0 
Process 8524 attached
[pid  8524] execve("/usr/bin/touch", ["touch", "testfile.txt"], [/* 68 vars */]) = 0 
[pid  8524] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8524, si_status=0, si_utime=0, si_stime=0} --- 
Process 8525 attached [pid > 8525] execve("/bin/cat", ["cat", "testfile.txt"], [/* 68 vars */]) = 0
Hello [pid  8525] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8525, si_status=0, si_utime=0, si_stime=0} --- 
Process 8526 attached [pid > 8526] execve("/bin/rm", ["rm", "testfile.txt"], [/* 68 vars */]) = 0
[pid  8526] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=8526, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

매개변수(strace man에서):

-f: 현재 추적 중인 프로세스에서 fork(2), vfork(2) 및 clone(2) 시스템 호출의 결과로 생성된 하위 프로세스를 추적합니다. -p PID -f멀티스레딩의 경우 thread_id = PID인 스레드뿐만 아니라 프로세스 PID가 있는 모든 스레드가 연결됩니다 .

-e trace=file:파일 이름을 인수로 사용하는 모든 시스템 호출을 추적합니다. -e trace=open,stat,chmod,unlink,...프로세스가 참조하는 파일을 확인하는 데 유용한 약어로 생각할 수 있습니다 . 또한 약어를 사용하면 lstat와 같은 호출을 목록에 포함하는 것을 실수로 잊어버리는 일이 발생하지 않습니다.

관련 정보