1. 공유자원의 접근
1) 공유 자원
- 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말함
- 공동으로 이용되기 때문에 누가 언제 데이터를 읽거나 쓰느냐에 따라 그 결과가 달라짐
2) 경쟁 조건 (race condition)
- 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황
- 경쟁 조건이 발생하면 공유 자원 접근 순서에 따라 실행 결과가 달라질 수 있음
(CPU 관점에서 일어나는 문맥 교환과 비슷한 의미, 레이스 컨디션 자체가 공격은 아니나 악용하면 충분히 공격으로 적용 가능)
<ATM 에서 돈을 입출금하는 시나리오>
A 기기에 돈을 10만원 있는 것을 확인
B 기기에 돈을 5만원 예금
잔고는 총 15만원이 됨
(그러나 A 기기에는 update가 되지 않음)
즉, A 기기에서 10만원을 다시 예금했을 때, 잔고에는 20만원이 있는 상황이 발생
-> 이러한 행위를 막기 위해 리눅스에서는 락(lock)이라고 표현함, 임계영역에 진입하면 일이 끝날 때까지는 CPU를 개방하지 않는 방식으로 해결하고자 함
2. 레이스 컨디션 공격
1) 레이스 컨디션 공격의 개념
- 레이스 컨디션은 둘 이상의 프로세스나 스레드가 공유 자원에 동시에 접근할 때 순서에 따라 결과가 발생가는 조건 / 상황을 말함
- 실행중인 프로세스가 임시파일을 만드는 경우 악의적인 프로그램을 통해 그 프로세스의 실행중에 끼어들어 임시파일을 목적파일로 연결 (=심볼릭 링크) 하여 악의적인 행위를 할 수 있는데 이를 레이스 컨디션 공격이라고 함
- 만약 프로세스가 SetUID 설정이 되어 root 권한으로 실행된다면 권한 상승을 통해 심각한 문제가 발생할 수 있음
2) 레이스 컨디션 공격의 아이디어
- 일종의 끼워넣기
- 관리자 권한으로 실행되는 프로그램 중간에 끼어들어 자신이 원하는 작업을 수행하는 것 ( 관리자 권한의 형태로 실행되고 있는 프로그램에 끼어드는 것 = 권한 상승 공격 )
3) 임계 영역 개념
- 레이스 컨디션 공격을 막기 위함
- 하나의 프로세스를 끝내기 전에는 CPU를 놓치 않음
- 즉, 다른 프로세스가 중간에 끼어들 수 없음
3. 파일 링크의 이해
1) 파일 링크란?
- windows에서의 '바로가기' 라고 생각하면 됨
- 하드링크와 심볼릭 링크가 있음
2) 하드 링크
- 원본이 똑같이 생성되고, 동일한 수준이며 로그 또한 동기화 됨
- 총 두 개가 만들어 짐
- 하드 링크 된 파일을 수정하면 원래 파일 /root/a.txt 파일도 똑같이 수정됨
- 리눅스에서 ls 명령어를 통해 나오는 링크 개수는 하드링크 개수를 말하며 원본 파일을 수정하면 하드링크도 수정 됨, 역도 성립
- 하드 링크 제약 : 컴퓨터는 효율적인 일을 처리하기 위해 파티션을 나누는데 이런 경우에 하드링크가 다른 파티션에 존재하면 안 됨
3) 심볼릭 링크
- 하드 링크와 달리 두 개의 파일을 생성하지 않음
- 동기화의 개념이 아니라 데이터가 있는 파일이 처음부터 하나 뿐임
- 포인터 개념과 비슷함
-하드링크는 파일이 두 개여서 두 개가 동기화되지만, 심볼릭 링크는 파일이 하나이며 바로가기처럼 이돌하여 파일을 보여줌
4) 동일 권한의 원본 파일 재생성하기
- 심볼릭 링크는 원본 파일이 삭제되더라도 원본 파일의 이름과 위치를 기억하고 계속 그 파일을 바라보는 상태로 남게 됨
- 삭제된 원본 파일 대신 똑같은 경로에 새 파일을 생성할 경우 처음과 같은 심볼릭 링크로 파일 존재
4. 레이스 컨디션 공격의 이해
1) 심볼릭 링크와 레이스 컨디션 공격
- 실행되는 프로그램에 대한 레이스 컨디션 공격 수행 조건
- 파일 소유자가 root이고 SetUID 비트를 가져야 함
- 생성되는 임시 파일의 이름을 알고 있어야 함 (동일한 이름으로 바꿔치기 위해)
- ps 명령어로 특정 파일에 접근하는 프로세스 목록 확인
- lsof 명령어로 특정 프로세스가 사용하는 파일 목록 출력 가능
- 생성된 임시 파일을 확인하면 임시 파일 이름으로 프로그램이 실행되기 전 심볼릭 링크 파일 생성 가능
- 프로그램이 임시 파일을 사용하기 위해 생성하지 건 해당 임시 파일이 이미 존재하고 있는지 여부를 판단하지 않는다면 프로그램음 위 그림과 같이 실행
- 임시 파일을 생성하는 프로그램들은 임시 파일 생성 전에 임시 파일의 존재 여부를 확인 (파일이 존재하면 임시파일이 생성되지 않으므로)
- 파일이 존재할 경우 그 파일을 지우고 재생성 함
- 프로그램 로직은 다음과 같음
- 임시 파일의 존재 여부 확인
- 임시 파일이 있다면 삭제하고 재생성
- 임시파일에 접근하고 처리
- 위 그림은 레이스 컨디션으로 수행할 프로세스임
2) 레이스 컨디션 공격 대응책
- 프로그램 로직 중에 임시파일을 생성한 후 임시파일에 접근하기 전에 임시파일에 대한 심볼릭 링크 설정 여부와 권한에 대한 검사 과정 추가
- 최초 파일 정보를 저장하는 st와 파일을 연 후 st2에 저장된 inode값을 비교하여 많약 다르다면 레이스 컨디션 공격이 적용되었음을 알 수 있음
'정보보안 공부 > 운영체제, 시스템' 카테고리의 다른 글
[운영체제] 세마포어 구현 (0) | 2023.02.06 |
---|---|
[시스템 보안] 세그멘테이션 폴트를 gdb 디버깅을 통해 확인하기 (0) | 2022.06.26 |
[시스템 보안] 백도어 (back door) (0) | 2022.06.26 |