유닉스/리눅스 시스템에는 환경변수라고 하는 쉘에서 사용하는 특별한 용도의 변수가 존재한다.
# 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 "^\.:|:\.:"
다만 환경에 따라서 . 이 필요할 수도 있으니, 무조건 없애야 한다는 정답은 아니겠지만, 가급적 없는게 더 좋아보인다.
'IT > 보안' 카테고리의 다른 글
[보안점검] /etc/hosts 권한 (0) | 2022.05.13 |
---|---|
[보안점검] 패스워드 복잡성 (0) | 2022.05.11 |
[보안점검] root 계정 원격 접속 제한 (0) | 2022.05.10 |
해킹 당하지 말자[종류 - phishing 피싱 편] (0) | 2020.04.15 |
해킹 당하지 말자[종류 - 원격제어 편] (0) | 2020.04.15 |