[시스템 해킹]
레이스 컨디션(Race Condition)
※ 공부 목적으로 작성했습니다. 악용하지 마세요
우선, 레이스 컨디션(Race Condition) 공격은 프로세스 간 경쟁상태에 있을 때 불법적으로 관리자 권한을 획득하는 공격이다.
즉, 두 개의 프로세스/쓰레드가 하나의 자원을 접근하려고 할 때 경쟁하는 상태로 이때를 노려 공격자가 정상적인 관리자 권한을 가진 사용자의 권한을 탈취하여 관리자 권한을 얻을 수 있다.
운영체제를 배울 때 많이 접했던 부분인데 시스템 해킹을 공부하면서 나오면서 완전히 새로운 개념인 줄 알았는데 아니었다..
1. Race Condition 경쟁상태
여러 프로세스 실행 시 하나의 자원에 접근하려고 라는 상태로 어떤 순서로 데이터에 접근하느냐에 따라서 결과가 달라질 수 있음.
이러한 경쟁상태를 노려서 원하는 목표를 얻는 게 레이스 컨디션 공격이다.
2. Deadlock 교착상태
프로세스가 다음 단계로 진행하지 못하고 멈춘 상태
* 발생조건
1) 상호배제 Mutual exclusion
2) 점유 대기 Hold and Wait
3) 비선점 No Preemption
4) 순환대기 Circular Wait * 위와 같은 문제를 해결하는 방법
: 해당 방법에는 병행 처리를 위한 프로세스 동기화 방법인 세마포어와 뮤텍스가 있다.
3. Semaphore 세마포어
공유자원에 변수만큼의 프로세스에 접근할 수 있음. 다른 프로세스가 세마포어 해제 가능.
4. Mutex 뮤텍스
공유자원에 오직 하나의 프로세스만 접근할 수 있음. lock을 획득한 프로세스가 lock을 풀어주어야 함
5. Critical Section 임계 구역
공유자원에 접근하는 프로그램의 부분. 한 프로세스가 임계구역을 수행할 때 다른 프로세스가 접근하지 못하도록 한다
리눅스/유닉스에서 레이스 컨디션 공격을 통해 원하는 root 권한을 획득하는 공격을 수행하고자 한다. 해당 공격을 공부하기 전에 링크에 대해 알아야합니다.
복사, 심볼릭링크, 하드링크
윈도우에서 링크(바로가기)는 실제 프로그램이 있는 경로를 알려주는 바로가기 링크만 있습니다.
하지만, 리눅스에는 심롤릭 링크와 하드링크가 있어서 복사와 링크 개념에 대한 이해가 필요합니다.
1. 복사
a 파일의 용량이 10M일때,
b 파일로 파일을 복사하면
용량 : 동일
내용 수정 : a파일을 수정하면 b파일이 수정되지 않음.
파일 삭제 : a파일을 지워도 b는 그대로 남음.
2. 하드링크
기존 파일과 동일한 inode number를 파일에 생성한다. (inode number : 파일시스템별 고유번호)
a 파일의 용량 10M일때,
하드링크 걸어 b 파일을 만들었다고 하면
용량 : a파일은 10M, b파일은 10M로 동일
내용 수정 : a 파일을 수정하면 b파일이 수정된다.
파일 삭제 : a파일을 삭제하면, b파일을 그대로 남는다.
> 하드링크는 하나의 파일에 대해서 이름을 가르치는 링크를 만드는 것이라고 보면 된다.
>> 하드링크 생성 시 inode Links가 1씩 증가
3. 심볼릭 링크
심볼릭 링크는 윈도우의 바로가기랑 비슷하다. 해당 파일의 경로를 담고 있다고 보면 된다.
a 파일이 10M일 때, 심롤릭 링크를 걸어 b파일을 만들었다고 하면
내용 수정 : a 파일 수정되면, b파일도 수정
내용 삭제 : a 파일 삭제되면, b파일은 경로를 찾을 수 없음. 하지만, 동일한 이름의 파일이 같은 위치에 생성되면 바뀐 파일의 내용이 보임.
> 심볼릭 링크는 링크 건 파일의 경로만 저장
레이스 컨디션 공격을 성공하기 위한 필수 조건
1. 프로그램에 root권한의 SetUID가 설정되어 있어야 한다.
* setuid : 파일 실행 시 소유자의 uid로 실행이 됨.
2. 프로그램이 실행 중일 때 임시파일을 생성해야 한다.
3. 임시파일의 위치를 알고 있어야 한다.
4. 파일이 생성되는 디렉터리에 쓰기권한이 있어야 한다.
* 심볼릭 링크를 이용
레이스 컨디션 공격 방식
1. root권한의 setuid가 설정되어 있는 정상 프로그램이 실행되면서 임시파일을 만든다..
* 정상 프로그램이 임시파일을 만들 때 절차이다.
1) 생성할 임시파일의 경로에 동일한 이름의 파일이 있는 확인
2) 동일한 파일이 있으면 해당 파일을 삭제
3) 임시파일 생성
4) 임시파일 실행
2. 공격자는 정상 프로세스가 1.3) 과정의 임시파일을 생성할 때,
(미리 경로와 임시파일 이름을 알고 있다면) 임시파일을 지우고 동일한 이름으로 목표하는 파일 (예, /etc/passwd, 악성파일 등)에 심볼릭 링크를 만든다. (심볼릭 링크는 악성파일과 연결)
3. root권한으로 목표 파일 실행하여 악성 행위 실시
[공격 시나리오]
* 공격목표 : /etc/shadow 파일을 조작하여 root권한의 계정 만들기
1. root 권한의 setuid 설정된 vuln 프로그램이 실행
2. 프로세스가 실행되면서 root 권한으로 vuln파일이 실행되고
3. /tmp경로에 hello라는 임시파일 만들기 위해 임시파일과 동일한 파일이 있는지 확인
4. 동일한 파일이 없어서 임시파일을 생성
5. 공격자는 임시파일이 생성되기 전에 hello라는 임시파일을 삭제하고 임시파일과 동일한 이름(/tmp/hello파일)으로 /etc/shadow 심볼릭 링크 파일을 생성한다.
6. 임시파일이 실행될 때 관리자 권한으로 해당 파일이 실행되면서 /etc/shadow파일 조작이 가능
7. /etc/shadows 파일에 비밀번호 없는 계정 생성
대응방안
1. 가능하면 임시파일 생성 자제
2. 임시파일에 심볼릭 링크가 있는지 검사
3. 임시파일을 만들 때 이름을 추측하지 못하도록 랜덤하게 생성
4. umask을 최하인 022로 설정하여 유지
참고 :
https://dystopia050119.tistory.com/69
http://geundi.tistory.com/48 [Geundi]
https://d4m0n.tistory.com/3