레이스 컨디션 어택은 이미 알고 있는 취약점이지만, 이번에 팀 스터디를 하면서 관련된 내용을 접하게 되었고
복습 겸 그 때 몰랐던 내용을 추가적으로 찾아서 정리한다.
경쟁 조건 공격은 둘 이상의 프로세스(리소스를 사용하는 주체)가 하나의 리소스에 사전 협의 없이 동시에 접근 가능할 때, 상호 간에 리소스의 현재 정보에 대해 동기화가 되지 않아 발생하는 취약점이다.
이 취약점에는 임시파일이라는 키워드가 부속으로 따라붙는데, 임시파일을 사용하는 환경에서 유용히 사용될 수 있기 때문이다.
다음과 같은 사정을 가정해본다.
실행 중에만 중요한 리소스를 임시로 생성한 후에 사용이 끝난 후 바로 삭제하는 프로그램이 있다.
실행 중에만 존재하는 리소스이므로 공격자는 이 프로그램에 접근할 방법이 없다고 생각할 수 있지만 앞서 말한 경쟁 조건을 이용해서 해당 리소스에 접근할 수 있다.
이 취약한 프로그램을 실행을 시킨 후에, 동시에 그 리소스를 읽는 공격자의 코드를 실행한다면?
타이밍이 일치하여 삭제 전에 리소스에 접근하는 코드가 실행됐다면, 리소스의 내용이 공격자에게 유출될 것이다.
먼저 가장 흔하게 접하는 C언어의 기본 레이스 컨디션에 취약한 프로그램 코드이다.
당연히 관리자의 setuid가 적용되어 있다.
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> int main(int argc, char *argv[]) { struct stat st; FILE *fp; if (access("temp", F_OK | W_OK) == 0) remove("temp"); if ((fp = fopen("temp", "a")) == NULL) { fprintf(stderr, "Can't open file."); exit(EXIT_FAILURE); } fprintf(fp, "%s\n", "race condition!!"); fprintf(stderr, "Write Success!!!\n"); fclose(fp); remove("temp"); exit(EXIT_SUCCESS); }
argv[1]
로 전달된 문자열을 temp
라는 파일에 write하는데, 그러기 전에 temp
라는 파일이 존재한다면 삭제한다.
만약, temp
를 삭제하고 fopen
으로 temp
에 접근하는 이전 시점에 공격자가 temp
파일을 생성할 수 있다면 다음과 같은 순서에 의해서
temp
에 원하는 내용을 write 할 수 있다.
remove('temp') /* Code executed by attacker's program ln -s /etc/passwd temp */ if ((fp = fopen("temp", "a")) == NULL) { ... ...
temp
는 심볼릭 링크 파일이므로 그 대상인 /etc/passwd
에 'race condition!!'이 추가되어 있을 것이다.
#/etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
race condition!!
/bin/mail
)과거 sendmail은 받은 전자우편을 수신자 파일(/var/spool/mail/[receiver]
)에 저장했었다.
만약 ftp 계정에 대해 메일을 보내는 동작과, /var/spool/mail/ftp
파일을 삭제한 후
ln -s /etc/passwd /var/spool/mail/ftp
로 심볼릭 링크를 생성하는 동작을 동시에 실행한다면?
공격자가 전송한 메일 내용이 /etc/passwd
에 저장될 것이다.
/usr/bin/ps
)Solaris 2.x에서 ps
명령어는 현재 프로세스 목록을 출력해주는데, 이 결과를 /tmp/ps_data
로 생성하며 또한 관리자 소유의 setuid로 설정했다고 한다.
만약 setuid를 설정하기 전에 /tmp/ps_data
를 삭제하고 ln -s /bin/sh /tmp/ps_data
로 심볼릭 링크를 생성한다면?
실행시 관리자 권한의 쉘을 획득할 수 있는 백도어가 생기는 것이다.
file:///C:/Users/suij4/Downloads/ASEC2002[race_condition].pdf