정보보안 공부/운영체제, 시스템

[시스템 보안] 레이스 컨디션 (race condition)

pxatd 2022. 6. 26. 13:58
728x90

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값을 비교하여 많약 다르다면 레이스 컨디션 공격이 적용되었음을 알 수 있음 
728x90