실행 전 명령 바이너리 확인


13

bash 스크립트에서 실제로 실행중인 것을 확인하는 방법이 있습니까?

(예 : 당신의 bash는 스크립트가 여러 가지 명령을 호출 말 tar, mail, scp, mysqldump) 그리고 당신이 있는지 확인하고자하는 tar실제, 실제 인 tar바이 결정될 수있는 root파일 및 상위 디렉토리 소유자 및 쓰기 권한을 가진 유일한 하나 인 사용자 가 아니라 일부 /tmp/surprise/tarwww-data또는 apache2소유자 인.

내가 아는 한 PATH, 환경에 따라 실행중인 bash 스크립트에서 추가로 확인할 수 있는지 궁금 하다면 어떻게해야합니까?

예 : (의사 코드)

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

2
당신이 편집증이라면, 자신의 바이너리를 사용하십시오!
Ipor Sircer 2012 년

8
xhienne의 답변에 따라 which올바르게 tar수행 할 말이 아니라 ls파일에 대한 잘못된 정보가 있으면 해킹 당할 수 있습니다. 또한 grep잘못된 정보를 반환하도록 해킹 될 수 있습니다. 대신 쉘 일치를 사용하면 피할 수 있지만 쉘은 해킹 될 수 있습니다. 그리고 쉘은 type처음 부터 잘못된 결과를 내기 위해 해킹 당 하거나 쉘의 교체 가능성이 50 세의 OS에 비해 유닉스의 중요한 혁신이기 때문에 완전히 대체 될 수 있습니다 . Ken Thompson의 1984 Turing 주소를 참조하십시오. 거북은 끝이야
dave_thompson_085

2
TE서명이있는 데이터베이스 (예 : MD5 체크섬보다 광범위한 데이터베이스) 가있는 Linux (Trusted Execution ( ) 라는 구성 요소가있는 AIX 만 해당)에 대해서는 응답 할 수 없습니다 . TE가 활성 상태이고 파일이 데이터베이스에 있으면 데이터베이스를 선택할 수 있습니다 프로그램의 실행 여부-데이터베이스와 일치하지 않는다는 경고 만 표시 TEP(Trusted execution PATH) 및 TLP(Trusted LIBrary PATH) TEP의 프로그램 만 실행될 수 있으며 라이브러리는 디렉토리에는 TLP에 포함되어 있습니다. 리눅스에는 'AppArmor'라고 불리는 것이 있습니다
Michael Felt

1
스크립트가 통제 할 수없는 환경에서 스크립트를 실행할 때까지는 이러한 종류의 안전을 확보 할 수 있지만 너무 늦습니다. 당신이 볼 수있는 모든 것은 공격자가 설정 한 chroot입니다.
Charles Duffy

2
... 시스템을 완전히 신뢰할 수있게하려면 ChromeOS 접근 방식을 따라야합니다. 하드웨어에 내장 된 키로 펌웨어에 서명하십시오. 펌웨어로 확인한 부트 로더 / 커널; 검증을 위해 블록 레벨 서명을 사용하여 루트 OS 파티션을 읽기 전용; @MichaelFelt가 논의한 것과 유사한 접근법도 있습니다 (무결성 측정 아키텍처 참조). 그러나 성능 영향은 더 높고 무결성 수준은 감소합니다 ( 이진 서명을 확인 하면 실행 불가능한 공격을 통한 공격에 도움이되지 않기 때문에) 함유량).
Charles Duffy

답변:


24

실행할 바이너리를 검증하는 대신 처음부터 올바른 바이너리를 실행할 수 있습니다. 예를 들어 실행하지 않으 려면 스크립트에서 /tmp/surprise/tar실행 /usr/bin/tar하십시오. 또는 $PATH무언가를 실행하기 전에 적절한 값으로 설정하십시오 .

파일 /usr/bin/과 다른 시스템 디렉토리에있는 파일을 신뢰하지 않으면 자신감을 회복 할 방법이 없습니다. 귀하의 예에서을 (를) 사용하여 소유자를 확인하고 ls있지만 어떻게 신뢰할 수 있는지 알고 ls있습니까? 같은 인수와 같은 다른 솔루션에 적용 md5sum하고 strace.

시스템 무결성에 대한 높은 신뢰가 필요한 경우 IMA 와 같은 특수 솔루션 이 사용됩니다. 그러나 이것은 스크립트에서 사용할 수있는 것이 아닙니다. 전체 시스템은 변경 불가능한 파일의 개념과 함께 특별한 방식으로 설정되어야합니다.


다른 배포판이 /bin대신 바이너리를 넣기로 선택하면 중단됩니다 /usr/bin.
Damian Yerrick

IMA는 이에 대한 두 가지 프로덕션 준비 방법 중 하나입니다. 다른 하나는 ChromeOS에서 rootfs의 블록 수준 유효성 검사를 수행하기 위해 취하는 dm-verity 접근법입니다.
Charles Duffy

@DamianYerrick Fair 비고. $PATH다중 분배 지원이 필요한 경우 두 경로로 설정하십시오 .
Dmitry Grigoryev

RBAC의 유무에 관계없이 AIX TE는이를 달성 할 수있는 세 번째 "생산 준비"커널이 될 것입니다. TE는 일단 수동적 이상으로 활성화되면 파일이 열리지 않거나 프로그램이 실행되지 않습니다. 또한 응용 프로그램 및 라이브러리 사용은 TEP (신뢰할 수있는 실행 경로) 또는 TLP (신뢰할 수있는 라이브러리 경로)에서만 사용되도록 설정할 수 있습니다. 기본 정보는 ibm.com/support/knowledgecenter/en/ssw_aix_61/… 을 참조 하십시오.
Michael Felt

6

침입자가 시스템에 액세스하여 어떤 상황에서도 $PATH포함하지 않아야하는 시스템을 수정할 수 /tmp있는 경우 실행 파일의 소유권에 대해 걱정하기에 너무 늦습니다.

대신 침입을 다루는 방법에 대해 읽어야 합니다 .

침입 방지에 집중하는 것이 좋습니다.

이런 종류의 일이 중요한 시스템이 있다면, 공개해야 할 부분과 비공개가 필요한 부분을 분리하고 통신 모드의 감사를 수행하는 것이 좋습니다. 이 사이.


4

확인하여 어느 정도 가능하다 md5sum파일 합니다. 따라서 apt패키지 관리 를 사용하는 시스템 ( 특히, Ubuntu 16.04)에는 설치 중에 /var/lib/dpkg/info/tar.md5sums온 모든 파일의 md5 합계를 저장하는 파일이 있습니다 tar. 따라서 출력이 md5sum /bin/tar해당 파일의 내용과 일치하는지 확인하는 간단한 if 문을 작성할 수 있습니다.

물론 파일 자체가 변조되지 않았다고 가정합니다. 물론 이것은 공격자가 루트 / 스도 액세스 권한을 얻은 경우에만 발생할 수 있으며, 이때 모든 베팅이 해제됩니다.


8
그러나 어떻게 확인 /usr/bin/md5sum합니까?
Dmitry Grigoryev

공격자가 대체 할 수있는 경우 /bin/tar또는 /usr/bin/tar, 그것은이다 매우 가능성이 그들은 또한 간단하게 교체 할 수 있습니다 md5sum또는 /var/lib/dpkg/info/tar.md5sums. 또는 $SHELL.
Jonas Schäfer

1
필자는 지난 단락에서 이미 언급했듯이 그러한 일이 발생하기 위해서는 공격자가 시스템에 대한 루트 액세스 권한을 얻어야하며 그 시점에서 모든 것이 가능하다고 생각합니다. 침입자가 루트 액세스 권한은 없지만 사용자에 대한 PATH 변수를 변경하거나 tar다른 이진을 가리키는 별칭을 만들 수있는 경우 에는 작동합니다. 루트 수준에서 시스템이 손상되면, 궤도에서 핵을-수있는 하나의 옵션이 있습니다
Sergiy Kolodyazhnyy

3

예, 내장 방법이 type있습니다. whichPATH에서만 검색 하는 명령과 달리 type명령 이름이 실제로 예약 키워드, 내장, 별명, 함수 또는 디스크 파일인지를 알려줍니다.

$ type -t foobar || echo "Not found"
Not found

$ type -t echo
builtin

$ enable -n echo; type -t echo; type -p echo
file
/usr/bin/echo

$ echo() { printf "(echoing) %s\n" "$*"; }; type -t echo
function

$ alias echo="/bin/echo 'I say: ' "; type -t echo
alias

또한 type -a당신에게 당신의 명령에 대한 모든 후보자들을 줄 것입니다 (처음부터 마지막까지) :

$ type -a echo
echo is aliased to `/bin/echo 'I say: ' '
echo is a function
echo () 
{ 
    printf "(echoing) %s\n" "$*"
}
echo is a shell builtin
echo is /usr/local/bin/echo
echo is /bin/echo

마지막으로 디스크의 이진 파일 만 걱정하는 경우 type -PaPATH의 모든 이진 파일을 얻는 데 사용할 수 있습니다 (위와 동일한 순서).

$ type -Pa tar
/home/me/bin/tar                <= oh oh, is this normal?
/bin/tar

즉, type혼자서 결국 어떤 명령이 호출 될지 정확히 알려주지는 않습니다. 당신은 예를 들어, tar이진 (예를 호출하는 별칭 alias tar="/tmp/tar"다음) type를 알려줍니다이는 것입니다 alias.


type -a모든 형태 (예 : 별칭 및 외부 프로그램)를 포함
dave_thompson_085

@dave 감사합니다, 정말 흥미 롭습니다. 제 답변을 업데이트했습니다
xhienne

1
typebash가 아는 한 알려줄 것이지만, 악의적 인 공격자로부터 통제를받는다면 bash가 생각하는 것이 실제 진실을 반영한다고 믿을 이유가 없습니다. 아시다시피, LD_PRELOAD모든 단일 C 라이브러리 호출을 가로채는 모듈이 있습니다.
Charles Duffy

1
@CharlesDuffy 물론입니다. 보안 각도를 향해 대답하고 싶지 않았습니다. 난 그냥 맨 위의 질문에 대한 답을 제시하고 있습니다 : "거기 어떤 방법을 실제로 떠들썩한 파티 스크립트에서 실행중인 것을 확인"하고 대안을 제시 which.
xhienne

나는 enable전에 본 적이 없다 . 이 답변의 조언을 사용하여 type enable셸이 내장 help enable되어 있는지 확인한 다음 수행하는 작업 을 확인했습니다.
Joe

3

를 사용하여 스크립트가 정확히 실행중인 명령을 확인할 수 있습니다 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와 같은 호출을 목록에 포함시키는 것을 실수로 잊어 버리지 않습니다.


3
이것은 자동 테스트를 수행하기 위해 스크립트에서 사용할 수있는 것이 아니며, strace그 자체가 파괴되지 않았다고 믿을 특별한 이유 는 없습니다.
Charles Duffy

0

Linux OS는 파일을 기반으로하며 Linux에서 실행되는 많은 명령은 컴퓨터에있는 파일의 일부 변경 사항으로 해결 될 수 있습니다. 그 때문에 어쩌면 당신의 문제에 대한 최적의 솔루션입니다. 파일 시스템이 실행되기 전에 변경 사항이 있는지 명령을 테스트 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

명령을 부분적으로 디 컴파일하는 'strace'명령이 있습니다 ...

여기에 이미지 설명을 입력하십시오

정말로 깊이 들어가고 싶다면 디 컴파일러에서 스크립트가 실행 될지 확인하십시오. 즉, 해당 명령의 어셈블러 해석을 확인해야합니다. bash를 위해 objdump -d. Linux bin 스크립트는 주로 C프로그래밍 언어로 작성 되므로 좋은 C디 컴파일러를 사용하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.