IT/보안

[보안점검] 홈 PATH 디렉터리 권한 및 PATH 설정

송시 2022. 5. 12. 15:44
728x90

유닉스/리눅스 시스템에는 환경변수라고 하는 쉘에서 사용하는 특별한 용도의 변수가 존재한다.

 

# env

 

명령어를 통해 쉘의 환경변수를 볼 수 있다.

 

환경변수는 

 

이름=값 의 형태를 보이는데, 이 환경변수에는 다양한 정보들이 있다.

 

환경변수에 저장되어 있는 값은 echo $변수이름 을 통해서 확인할 수 있다.

 

물론 env 명령어를 통해서도 확인이 된다.

 

# echo $HOME

# echo $USER

# echo $PWD

# echo $PATH

 

등등 다양하다. 그 중에서 PATH 에 대한 이야기를 해보고자 한다.

 

아래는 현재 필자가 사용중인 PATH 환경 변수다.

 

# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

 

어디 한번 PATH 를 날려볼까?

 

# PATH=
# echo $PATH

[공란]
아무값도 나오지 않는다.

 

자 이제 우리가 리눅스를 처음으로 배울때 가장 많이 사용하는 ls 와 find 명령어를 입력해보자.

 

# ls
-bash: ls: No such file or directory
# find
-bash: find: No such file or directory

 

그런 파일이나 디렉토리를 찾을 수 없다고 한다.

 

그럼 모든 명령어가 다 안되는 걸까?

아래를 보자

# pwd
/root

# cd /dev

#

 

pwd 와 cd 명령어는 아무런 에러가 발생하지 않는다.

 

이유는 간단하다.

 

bash shell 에서 builtin 이라고 치고 tab 키를 눌러보자, 아래의 리스트와 같은 명령어들이 나올 것이다.

# builtin
:          alias      break      cd         complete   declare    echo       exec       false      getopts    history    let        mapfile    pushd      readarray  set        source     times      type       umask      wait
.          bg         builtin    command    compopt    dirs       enable     exit       fc         hash       jobs       local      popd       pwd        readonly   shift      suspend    trap       typeset    unalias
[          bind       caller     compgen    continue   disown     eval       export     fg         help       kill       logout     printf     read       return     shopt      test       true       ulimit     unset

이 명령어들은 우리가 오피스텔 입주 할때 이미 함께 있는 냉장고나, 세탁기 처럼 빌트인 되어 있는 명령어들이다.

 

다시 PATH를 처음의 상태로 원복해본다.

 

# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

 

ls 와 find 의 절대경로를 알아보자.

# which ls
/usr/bin/ls
# which find
/usr/bin/find

 

/usr/bin 아래에 바이너리 파일로 존재한다.

 

우리가 앞서 살펴본 PATH 의 환경변수에 /usr/bin 이 위치한 것이 보이는가?

 

아주 만약에 ls 라는 명령어가 2곳에 존재하고, 각각 /usr/local/sbin/ls 와 /usr/bin/ls 라고 가정하면

 

ls 라는 명령어를 칠 때 가장 첫번째 디렉토리를 탐색하고 해당 명령어가 존재 한다면, 다음 디렉토리(/usr/local/bin)에서 탐색하지 않게 된다.

 

이러한 PATH를 잘 활용하면 java 실행을 버전별로 관리할 수 있게 되거나, 여러 유사한 프로그램 또는 명령어가 있더라도, 내가 원하는 순서, 원하는 위치의 프로그램 또는 명령어를 실행할 수 있도록 도움이 된다.

 

그런데 이 편리함이 보안의 구멍을 유발하기도 한다.

 

유닉스/리눅스 시스템에서 경로를 말할때 절대경로와 상대경로 2가지를 사용한다.

 

그중 상대경로로 . 가 존재하고 이는 현재 위치를 의미한다.

 

이 . 은 사실 과거 시스템에서 매우 유용하게 사용되었다.

 

프로그램의 위치등을 크게 신경쓰지 않더라도, 현재 위치에서 파일을 바로 실행하는데 매우 편한 도움을 받는다.

 

현재 위치에 다음과 같이 실행 가능한 파일이 있다.

# ls -al executeme
-rwxr-xr-x 1 root root 11 May 12 15:32 executeme

파일의 내용은 hello 를 출력해주는 매우 단순한 파일이다

# cat executeme
echo hello

 

바로 실행시켜보자 마치 ls 명령어를 사용하듯이

 

# executeme
-bash: executeme: command not found

명령어를 찾을 수 없다고 한다.

이번엔 상대경로를 사용해서 함께 써보자

# ./executeme
hello

역시나 잘 실행된다.

 

현재 경로를 PATH 환경변수에 넣어보자.

 

# PATH=.:$PATH
# echo $PATH
.:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

 

앞서 실행했던 방식으로 한번 다시 해보자

 

# executeme
hello

 

PATH 환경변수에 . (현재 경로)을 추가하니 경로를 정의하지 않더라도 잘 실행되는 것을 알 수 있다.

 

이번엔 좀 다른 예를 들어보자.

ls 라는 파일이름으로 "hello ls" 를 출력하는 내용이다.

# cat ls
echo hello ls

 

이제 현재 위치에 어떠한 파일들이 존재하는지 ls 라는 명령어로 확인해보자

# ls -al
hello ls

 

우리가 알고 있는 ls 명령어가 아닌 현재 위치에 존재하는 ls 라는 파일의 echo 명령어가 먹혔다.

 

이러한 방법으로 해커는 사용자는 자신이 사용한 명령어의 정채도 모른체 자신이 원하는 것을 얻을 수 있게 된다.

 

물론 이 방법은 시스템 영역에 침입이 이미 되어있다고 가정 할때에 큰 효과를 볼 수 있다.

 

이러한 위험 요소를 제거 하기 위해 PATH 환경 변수에 현재의 경로를 의미하는 . 가 있는지 없는지를 확인하고 있다.

 

아래의 명령어를 통해 점검이 가능하며 아무런 값도 안나온다면 . 이 PATH 에 없는 것이고, 결과가 나온다면, 조치가 필요할 수 있다.

 

# echo $PATH |grep -E "^\.:|:\.:"

 

다만 환경에 따라서 . 이 필요할 수도 있으니, 무조건 없애야 한다는 정답은 아니겠지만, 가급적 없는게 더 좋아보인다.

 

 

728x90