본문 바로가기
linux

레이스 컨디션

by 상레알 2010. 12. 13.

원문 : http://ttongfly.net/zbxe/?document_srl=42475
       : http://blog.naver.com/unbboyajin/60101471147

1. 레이스 컨디션 ( Race Conditin)


레이스 컨디션이란, 버그를 갖고 있는 setuid 프로그램과 해커의 exploit이 서로 경쟁(Race) 상태(condition)에 이르게 하여, setuid 프로그램의 권한으로 다른 파일에 접근할 수 있게 하는 방법을 말한다. 예를 들어 한 프로그램이 root의 소유권으로 setuid가 붙어 있고, 또 이 프로그램이 작업의 성격상 임시파일을 생성한다고 할때 해커가 그 임시파일과 같은 이름의 심볼릭 링크를 생성해 두 었다면 실제로 프로그램이 조작하는 파일은 심볼릭 링크된 목표 파일일 것이다. 보다 구체적인 예를 들어 보자

Solaris 2.6 이하 모든 싯템에서 kcms_calibrate라는 프로그램은 /tmp 디렉토리에 Kp_kcms_sys.semcd라는 임시파일을 생성하게 된다. 만약 해커가 kcms_calibrate를 실행하기 직전에 /tmp/Kp_kcms_sys.semcd 라는 이름으로 /root/.rhosts를 목적지로 갖는 심볼릭 링크를 만든다면 실제로 kcms_calibrate가 조작하는 파일은 심볼릭 링크의 목표파일로 설정되어 있는 /root/.rhosts가 되는 것이다. 다행이solaris 에서는 /root/.rhosts를 조작하는 것만으로  root 쉘을 얻을 수 는 없지만 root의 권한으로 다른 파일에 접근할 수 있다는 것만으로도 충분히 보안상의 헛점이 될 수 있다.

2. 레이스 컨디션이 발생할 조건

해커가 A라는 프로그램을 대상으로 Race Condition을 시도하고자 할때, A는 다음과 같은 조건을 만족하고 있어야한다.

- setuid 가 붙어 있을것.
- 임시파일을 생성할 것.
- 그 임시파일의 이름을 해커가 미리 알고 있을것.
- 임시파일을 생성할때 Race Conditon에 대한 대처를 하지 않을 것

위 4개의 조건이 동시에 만족될때, 해커는 A라는 프로그램을 대상으로 Race Condition을 시도할 수 있다.

3. exploit의 구조

Race condition을 이용한 exploit을 제작할 때에 exploit은 치소한 다음의 기능을 가져야 한다.

{
     - system() 함수 또는 exec() 함수를 이용하여 타겟 프로글맹르 백그라운드로 실행시킬것 
       (이로써 목표 프로그램과  exploit은 Race Condition 상태에 놓여지게 된다.)

     - synlink() 함수를 사용하여 이미 알고 있는 임시 파일의 이름으로 심볼릭 링크를 생성한다.
     ( 목표 프로그램이 임시파일을 생성하기 전에 미리 같은 이름의 심볼릭 링크를 생성함으로써 목표 프로그램이 조작하는
        파일의 경로를 바꾸어 두는것이다. )
}
이 exploit을 목표 프로그램ㅔ 대해 실행 시켰을때 exploit의 실행이 끝나기 전에는 Race Condition 이 성공했는지를 파악 할 수 있없으므로, for문을 이용하여 여러번 반복시켜 주는것이 성공 확률을 높일 수 있다.

synlink() 함수를 이용하여 심볼릭 링크를 생성할때, 목표파일을 존재하지 않는 파일로 지정할 경우 default u-mask에 의해서 rwxrwxrwx의 권한을 갖는 목표파일이 생성되어 진다.  목표 프로그램이 만일 root소유라면, 결국 목표파일은 root소유로 만들어 질 것이다. 해커는 이렇게 생성된 목표파일을 이용할 수 도 있다. 또는 , 이미 존재하는 파일 예를 들어 /etc/passwd 등을 목표파일로 지정하면 목표 프로그램이 조작하느 파일은 심볼릭 링크로 연결된 /etc/passwd 가 되는 것이다.

4. 새로운 Race Condition

프로그래머들은 해커들이 Race Condition을 이용하여 시스템을 위협하는 것으 막기위해 다음과 같은 방법을 생각해 냈다.
- 임시파일을 생성할 때, 그 임시파일이 이미 존재하는 파일인지 검사한다.
- 만일 이미 존재하고 있다면 exploit이 생성한 심볼릭 링크일 가능성이 있으므로, 그 파일을 지우고 새로 임시파일을 생성한다.

하지만 해커들은 프로그래머들의 노력을 무시하듯이 더욱 발전된 형태의 Race Conditiom을 개발하믕로써 이를 무색하게 했다. 보다 발전된 형태의 Race Condition은 다음과 같은 구조를 갖는다.

{
- system() 함수나 exec()함수를 이용하여 목표 프로글매을 백그라운드로 실행시킨다.
- 임시파일이 심볼릭 링크인지 판단하여 심볼릭 링크가 아니라면 임시파일을 지운다
- 임시파일의 이름으로 심볼릭 링크를 생성한다.
}

다시 말해서, 목표 프로그램이 임시파일을 생성할 때, Race Condition이 이루어지고 있는가를 검사한 뒤에 임시파일을 생성한다는 점을 이용하여 일단 목표 프로글매으로 하여금 안전한 조건을 만들어 주고 목표 프로그램이 안전하다고 생각하며 임시파일을 생성하는 순간 생성도니 임시파일을 지우면서 심볼릭 링크를 생성하는 것이다. 이렇게 되면 목표 프로그램과 exploit은 임시파일을 사이에 두고 서로 동태를 파악하며 CPU를 향해 계속해서 달리는 형태가 되어 그야말로 Race Condition이라는 이름이 잘 걸맞게 된다.

5. 대응책

프로그래머들은 기존의 방버으로는 Race Condition을 피할 수 없음을 알고 또 한번 Race Condition에 대한 대응ㅇ르 고아해 냈다. 임시파일을 생성할때, 일단 임시 파일을 생성한 뒤에 방금 생성한 파일이 심볼릭 링크인지를 검사하는 방법이다. 현재까지 이러한 방식의 프로그램은Race Condition이 불가능한 것으로 알려져 있다.


추가적 명령어 설명

ln 명령어 옵션

1. 파일 링크의 개념  i-node 파일의 생성과 동시에 임의로 부여되며, 번호확인은 ls -i로 확인할 수 있다. 또한 ㄷ리눅스에서는 모든 디바이스나 디렉토리를 파일 개념으로 인식하기 때문에 전부 inode를 부여받는다. 만약 inode가 같은 파일이 있다면 파일 이름이 다르더라도 이 파일은 같은 파일이 된다.

[하드 링크]

하드 링크는 일반 파일을 링크할때 주로 이용하며, 옵션없이, ln 명령으로 링크시키면 된다. 생성된 링크파일은 원래 파일의 inode (index node 라 하며 파일에 대한 정보가 저장된 레코드)를 그대로 참조하기에 원 파일이 지워져도 아무런 문제가 없다.

[심볼릭 링크 -ln -s 명령으로 링크 ]

심볼릭 링크는 주로 디렉토리를 링크할 때 사용한다. 원 파일이 삭제 되면 실제 데이터 블럭을 참조하던 inode도 삭제되어, 심볼릭 링크된 파일은 의미가 없어진다.


ln 명령어

[option]
   -s : 심볼릭링크(소프트링크)를 생성한다. 만약 이 옵션이 없으면 하드링크가 생성된다.
   -v : 링크를 만드는 정보를 자세히 출력한다.

[예제]
# ln -s /directory/* linkdir : /directory/디렉토리 안의 모든 파일의 링크 파일을 linkdir 디렉토리에 생성
# ln -s ./sourcefile ./linkfile : 링크생성
# ls -ld linkfile : 링크확인
# unlink(또는 rm) linkfile : 링크해제
/etc/xinetd.d 라는 디렉토리를 자주간다면 현재 나의 홈디렉토리에 링크해보자.
ln -s /etc/xinetd.d xx => /etc/xinetd.d라는 디렉토리를 현재 디렉토리의 xx라는 것으로 링크한다. ls xx 하면 ls /etc/xinetd.d의 내용과 동일한 내용이 나타나고 또한 cd xx하면 그 디렉토리안으로 들어간 것과 같다.