$IFS Inter File Separator 파일을 구별짓는 잣대를 가리키는 쉘 변수

입력 필드 구분자

디폴트는 공백문자(빈칸, 탭, 뉴라인)지만 콤마로 구분된 데이타 파일을 파싱하려는 경우처럼 변경이 가능합니다. $*$IFS의 첫번째 문자를 사용하는 것에 주의하세요. 예 6-1 참고.

bash$ echo $IFS | cat -vte
$


bash$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z
	      

제 목 : [NH-mailing] IFS 버그
올린이 : 김심기(lb0gspm) 등록시각:99-12-29 23:23:34 읽음 : 61 받음 : 0
관련자료 없음

/*------------------------------------------------*/
/* Using of IFS bug */
/*------------------------------------------------*/
/* Written by Laks Bluesky */
/*------------------------------------------------*/

0. 환경변수


도스와 마찮가지로 유닉스에서도 많은 종류의 환경변수
가 존재하며, 그 종류는 도스에서 보다 훨씬 다양하다.
IFS 버그는 이러한 환경변수중 PATH 와 IFS 를 조작함으
로써 이루어 지는 해킹 기법이다. 다른 해킹 기법들에
비해 구현하기가 대단히 쉽다.

 

1. PATH 환경변수

도스와 마찮가지로 유닉스에서도 어떤 프로그램을 실행
하고자 할때 그 실행파일 명을 명령으로 주면 된다. 그
런데 도스와 유닉스가 다른점은, 그 실행파일의 경로를
찾아가는 방법이다. 도스에서는 다음과 같은 과정을 통
하여 명령으로 주어진 실행파일의 경로를 찾게 된다.

- 현재 디렉토리에서 주어진 실행파일이 있는지 검색.
- PATH 환경변수에 주어진 디렉토리 중에서 주어진 실행
파일이 있는지 검색.

하지만 유닉스에서는 첫번째 단계가 존재하지 않는다.
즉, 실행파일 명을 명령으로 준 경우 그 파일의 경로를
찾아가기 위해 현재 디렉토리를 검색하지 않는다는 것이
다. 유닉스 시스템에서는 PATH 환경변수에 주어진 디렉
토리 내에서만 주어진 명령을 검색한다.

 

2. IFS 환경변수

IFS 변수는 도스에서는 사용하지 않는 변수이다. 이것은
사용자의 명령행중 공백 구분자를 표시하는 것으로 디폴
트 값은 ' ' 이다. 즉, IFS 환경변수가 디폴트로 설정되
어 있는 경우, 다음과 같은 형태로 명령을 내리는 것이
가능하다.

$ ls -la

이 경우, ls 라는 명령어와 -la 라는 옵션을 구분하기
위해 공백(스페이스, ' ')를 사용하는데, 이것은 IFS 가
' '로 설정되어 있기 때문에 가능한 명령이다.


3. IFS 버그가 이루어 지기 위한 조건

해커가 A 라는 프로그램을 대상으로 IFS 버그를 시도하
고자 할때, A 는 다음의 조건을 만족해야 한다.

- setuid 가 붙어 있을 것.
- 쉘 스크립트로 작성된 실행파일 일것.
- 실행파일 내에서 다른 프로그램을 실행하는 경우, 절
대경로명을 사용할 것.

위 3가지 조건이 동시에 만족될 때에 한해서 A 에 대해
IFS 버그를 이용한 exploit을 시도할 수 있게 된다.

 

4. IFS 버그를 이용한 exploit

예를 들어 다음과 같은 쉘 스크립트 프로그램이 있다고
가정하자.

-- 파일 명 : cls 소유자 : root 퍼미션 : rwsr-xr-x
echo "Screen clear!"
/usr/bin/clear
echo "Screen cleared!"
--

이 실행파일의 경우, IFS 를 시도할 수 있는 모든 조건
을 만족한다. 이 프로그램을 실행하기 전에 IFS 환경변
수와 PATH 환경변수를 조작함으로써 root 의 쉘을 얻을
수 있다. 그 과정을 살펴보자.

- IFS 환경변수를 '/' 로 변경한다.
이렇게 하면 "/usr/bin/clear" 부분에서 '/' 는 디렉토
리를 나타내는 기호가 아니라 공백을 나타내는 기호로
의미가 바뀌어 버린다. 다시말해서 " usr bin clear" 의
의미가 되어진다.

- usr 이라는 이름의 쉘 스크립트를 작성한다.
이렇게 하면 " usr bin clear" 는 usr 이라는 프로그램
을 실행하되, bin 과 clear 라는 인자를 전달하라는 의
미가 되어진다. usr 에는 해커가 원하는 작업을 지정 할
수 있는데, 이 경우 쉘을 실행시키는 스크립트를 작성함
으로써 root 권한의 쉘을 얻을 수 있게 되는 것이다.

- PATH 환경변수에 현재 디렉토리를 추가한다.
" usr bin clear" 는 usr 이라는 프로그램을 실행하라는
의미로 해석된다고 했는데, 위에 설명했듯이 유닉스 시
스템에서는 실행파일의 위치를 찾을때 현재 디렉토리는
검사하지 않는다. 따라서 usr 이라는 이름의 쉘 스크립
트를 실행하기 위해서는 usr 이 위치하는 디렉토리, 즉
현재 디렉토리가 PATH 환경변수에 설정되어 있어야 한다.

이 상태에서 cls 를 실행시킨다면 어떤 결과를 얻을 수
있을까. 우선 echo 명령에 의해 "Screen clear!" 를 출
력한 뒤, usr 을 실행하게 된다. 물론 usr 는 해커가 작
성한 쉘 스크립트가 되고, 이것으로 exploit 은 성공하
게 된다.

 

5. IFS 버그로 인한 exploit을 막는 방법

IFS 버그를 피하기 위해서는 다음과 같은 방법이 있다.

- 가급적 setuid 가 붙은 쉘 스크립트를 작성하지 않는
다.
- 하지만 꼭 필요한 경우에는, 되도록 상대경로를 사용
한다.
- 일반 사용자가 환경변수를 설정할 수 없도록 한다.
/***************************************************/ 

+ Recent posts