My Study/System

레이스 컨디션(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
레이스 컨디션(Race Condition)  (1) 2014.11.18
  1. 박오이님 수정/삭제 답글

    레이스 컨디션 관련해서 공부하고 있엇는데 이 게시물로 정말 공부가 되었습니다ㅎㅎ
    감사합니다

최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.