레이스 컨디션 컴퓨터공학과 4학년 20012069 이교욱
학 습 목 표 레이스컨디션의 정의 하드링크와 심볼릭링크 레이스컨디션 공격 ptrace 레이스 컨디션 공격 학 습 목 표 레이스컨디션의 정의 하드링크와 심볼릭링크 레이스컨디션 공격 ptrace 레이스 컨디션 공격 레이스 컨디션 공격에 대한 대응책
레이스컨디션의 정의 버그를 갖고 있는 setuid프로그램과 해커의 exploit(악의적인 코드)이 서로 경쟁상태(Race Condition)에 이르게 하여, setuid 프로그램의 권한으로 다른 파일에 접근할 수 있게 하는 방법을 말한다.
하드링크와 심블릭링크 하드링크 ln 파일 링크파일 제약점 – 링크할 파일이 다른 파티션이면 안된다. ln a.txt link.txt 제약점 – 링크할 파일이 다른 파티션이면 안된다. 1.파일권한, 2.링크의 수, 3.파일생성계정 4.그룹계정
하드링크와 심볼릭링크 심볼릭 링크 ln의 명령 중 ‘-s’ 옵션을 이용한다. ln –s a.txt symlink.txt 하드링크와 달리 링크 수는 ‘1’ 그대로며, 그대신 symlink.txt -> a.txt와 같은 링크된 파일 정보만 표시된다. Symlink.txt 파일을 수정하면 a.txt 파일의 내용도 수정된다.
하드링크와 심볼릭링크 심볼릭링크 실습
하드링크와 심볼릭 링크 심볼릭 링크 파일을 일반 계정소유로, 원본파일을 관리자 계정소유일 때는 원본 파일이 관리자 계정인 root의 소유이기 때문에 심볼릭 파일을 수정할 수 없다. 원본 파일을 삭제를 하면 심볼릭 링크된 파일은 남지만 파일은 삭제된 것으로 표시가 된다.
레이스컨디션 공격 레이스컨디션의 발생 조건 setuid가 붙어 있는것. 임시파일을 생성할 것. 그 임시파일의 이름을 해커가 미리 알고 있을것. 임시파일을 생성할때 Race Condition에 대한 대처를 하지 않을것.
레이스컨디션 공격 int main (int argc, char * argv []){ struct stat st; FILE * fp; if (argc != 3) { fprintf (stderr, "usage : %s file message\n", argv [0]); exit(EXIT_FAILURE); } sleep (20); if ((fp = fopen (argv [1], "w")) == NULL) { fprintf (stderr, "Can't open\n"); fprintf (fp, "%s\n", argv [2]); fclose (fp); fprintf (stderr, "Write Ok\n"); exit(EXIT_SUCCESS); }
레이스컨디션 공격 레이스 컨디션 실습
ptrace 레이스 컨디션 공격 ptrace 함수는 다음 장인 ‘8장. 버퍼 오버플로우’에서 배우게 될 GDB(GUN Debugger)구동 시 주로 사용된다. 즉, GDB는 ptrace 함수를 간단히 쓸 수 있도록 만들어 놓은 ptrace 명령어 집합이라고 볼 수 있다. 예를 들어, 함수를 디버깅할 때 GDB는 자식 프로세스로 디버깅하고자 하는 함수를 실행한다. 자식 프로세스로 호출된 대상 프로그램 안에는 GDB에 의해 몇 개의 중단점이 위치하고 자식 프로세스로 실행된 프로그램은 이 지점에서 프로세스를 중지하고, 그 프로세스를 GDB로 다시 넘겨주게 된다. Ptrace에 대한 레이스컨디션 공격은 이러한 원리에 끼어들기를 시도한 것이다. 공격 코드는 자신이 GDB처럼 SetUID가 지정된 프로세스를 찾아 프로세스를 중지시키고, 그 프로세스를 자신이 넘겨 받는 것이다.
ptrace 레이스 컨디션 공격 ptrace기본 명령 구조 cmd:명령 내용 pid:타겟 프로세스의 프로세스ID ptrace(cmd, pid, addr, data); cmd:명령 내용 자식 프로세스의 주소 공간의 4바이트 단위의 워드를 쓰거나 읽기 특정 신호 가로채기 자식프로세스 주소 공간에 감시점(watchpoint)을 설정하거나 제거하기 중단된 자식 프로세스의 수행 재개 자식 프로세스를 싱글 스텝으로 수행 자식 프로세스를 종료 pid:타겟 프로세스의 프로세스ID addr:타겟 프로세스의 주소 공간의 위치 data:데이터 값은 필요에 따라 다르다.
ptrace 레이스 컨디션 공격 ps –ef | grep 7 7 프로세스를 확인해 보면
ptrace 레이스 컨디션 공격 ls –al | grep 7 cd 115
ptrace 레이스 컨디션 공격 ls -al
ptrace 레이스 컨디션 공격 ptrace 공격 실패
레이스 컨디션 공격에 대한 대응책 int safeopen(char *filename) { struct stat st, st2; int fd; if(lstat(filename, &st) != 0) return –1; if(!s_ISREG(st.st_mode)) return -1; if(st.st_uid != 0) fd = open(filename, O_RDWR, 0); if(fd < 0) if(fstat(fd, &st2) ! = 0) { close(fd); } if(st.st_ino != st2.st_ino) || st.st_dev != st2.st_dev) { return fd;
레이스 컨디션 공격에 대한 대응책 if(!s_ISREG(st.st_mode)) if(lstat(filename, &st) != 0) lstat함수는 파일의 심볼릭 링크의 유뮤에 대한 정보를 반환해준다. if(!s_ISREG(st.st_mode)) 구조체 st에 대한 st_mode 값으로 파일의 종류에 대한 것을 확인한다. S_ISBLK- 블록파일 테스트 S_ISCHR- 문자파일 테스트 S_ISDIR- 디렉토리 테스트 S_ISFIFO- FIFO 테스트 S_ISREG- 일반적인 파일 테스트 S_ISLNK- 심볼릭 링크 테스트 Stat함수와 다른점은 filename 매개변수가 심볼릭 링크면 심볼릭 링크가 가리키는 파일의 상태가 아닌 심볼릭 링크의 상태를 반환하는 것이다.
레이스 컨디션 공격에 대한 대응책 if(st.st_uid != 0) 생성된 파일의 소유자가 root가 아닌 경우를 검사한다. 공격자에 의해 자신이 생성한 파일이 삭제되고, 접근하고자 하는 파일이 일반 계정 소유의 파일인지 확인한다. if(fstat(fd, &st2) ! = 0) 파일 포인터에 의해서 열려진 파일의 정보를 모아 st2구조체에 이를 전달한다. if(st.st_ino != st2.st_ino) || st.st_dev != st2.st_dev) 최초 파일에 대한 정보를 저장하고 있는 st와 파일을 연 후의 st2에 저장된 I 노드 값과 장치(device)값이 변경되었는지 확인한다. ptrace 취약점의 경우에는 시스템 패치를 해주거나, 커널을 업그레이드해주는 것 이외에는 별다른 방법이 없다. 따라서 취약점을 주기적으로 점검하는 것이 좋다. 2. 전달되는 데이터에는 장치(device), i노드, 링크의 개수, 파일 소유자의 사용자 ID, 소유자의 그룹ID, 바이트 단위 크기, 마지막 접근시간, 마지막 수정시간, 마지막 바뀐시간, 파일 시스템 입출력(I/O)데이터 블록의 크기, 할당된 데이터 블록의 수 등이 있다.