레이스 컨디션(Race Condition)
시스템 해킹 중 Race Condition를 해보겠다.
레이스 컨디션이란 프로세서들이 여러번 실행되는 과정에서 실행 순서가 뒤바뀌어 실행자가 원하는 결과를 얻는 것이다.
레이스 컨디션을 사용하는 예제로 리눅스에서 root권한 얻을 수 있는 계정을 /etc/passwd에 삽입하는 것을 보여주겠다.
먼저 vi 를 이용하여 임시 파일을 생성하는 프로그램을 컴파일 했다는 가정 하에 해보겠다.
다음은 컴파일을 한 뒤 SetUID를 주겠다.
코드 일부를 분석하자.
remove("/tmp/program/tempfile", "a")) == NULL) //tempfile이 있으면 삭제
if((fp = fopen("/tmp/program/tempfile", "a")) == NULL) //tempfile 생성
{
fprintf(stderr, "Can't open\n");
exit(1);
}
fprintf(fp, "%s\n", argv[1]);
fclose(fp); //종료
삭제 - 생성 - 종료
이렇게 실행 되는 프로그램이다. 레이스 컨디션을 사용하여 순서가 뒤바뀌게 하여 root 권한을 얻을 수 있는 계정을 넣어보겠다.
레이스 컨디션을 하기 위한 간단한 코딩을 하겠다.
프로그램을 무한번 실행하면서 root 권한을 얻을 수 있는 계정을 넣는 프로그램.
passwd에 무한번 심볼릭 링크 할 프로그램.
이 두가지를 컴파일 한 뒤 두가지를 각각 다른 터미널에서 실행시키자.
그리고 passwd 파일을 열어 보면
insertid 라는 계정이 들어가있다. 이 계정이 root 권한을 가지고 있는지 확인해보겠다.
일반 계정인 eram 계정에서 insertid로 들어갔을 때 root 권한을 얻은 것을 확인할 수 있다.
이제 레이스 컨디션이 어떤것인지 보았으니 레이스 컨디션 보안 방법에 대해서 소개하겠다.
위의 소스를 간단히 설명하면
lstat("/tmp/tmpfile",&st); 생성된 /tmp/tmpfile을 선언해 놓은 구조체에 전달
if(S_ISLNK(st.st_mode)) 구조체에 전달된 tmpfile이 심볼릭 링크 파일일 경우 메시지 출력하고 제거, 프로그램 종료
필자의 리눅스 환경
'My Study > System' 카테고리의 다른 글
레지스터 (0) | 2015.05.13 |
---|---|
Handray (0) | 2015.03.25 |
Stack Corruption (0) | 2015.03.18 |
리틀 엔디안(Little Endian), 빅 엔디안 (Big Endian) (1) | 2015.03.14 |
메모리 구조 (0) | 2014.12.13 |