touch
파일 생성 명령어
레이스 컨디션(Race Condition)
심볼릭링크 : 바로가기의 개념. 원본파일을 심볼릭링크 파일이 가라킴 심볼릭링크 파일에 수정을 가하면 원본 파일도 수정.
root 권한의 SetUID가 걸린 A라는 프로그램이 있다.
A는 실행한 후에 /tmp 안에 byebye라는 임시파일을 만든다.
일반 user가 이 임시파일(/tmp/byebye)을 삭제하고, /etc/passwd의 심볼릭 링크를 만드는데 이름을 /tmp/byebye라고 하여 만들었다.
그럼 A를 실행시키면?
A는 실행되는 동안 root의 권한을 가지게 된다. A는 byebye라는 임시파일을 만드는데 byebye는 /etc/passwd의 심볼릭링크이다. /etc/passwd는 root만이 쓰기가 가능한데, SetUID가 root이기 때문에 결국 /etc/passwd 파일에 쓰기가 가능해지는 것이다. 따라서 심볼릭링크 파일을 수정하면 원본파일(/etc/passwd)도 수정이 되는 것이다.
결국, /tmp/byebye의 내용이 /etc/passwd로 들어가 /etc/passwd는 손상을 입게 될 것이다.
이에 대한 대응책으로 프로그램이 임시파일을 만들 때 이미 같은 파일이 있으면 그것을 지워버린 후 임시파일을 생성하도록 프로그램을 만들기 시작했다.
하지만
① <프로그램 실행>
② <생성할 임시파일과 같은 이름의 파일이 존재하는지 확인>
③ <같은 이름의 파일이 있으면 삭제, 없으면 건너뜀>
④ <임시파일을 생성>
위와 같은 과정을 거칠 때, 해커는 ③번과 ④번사이에 간격을 노리게 된다. 하지만 이 간격 사이에 심볼릭링크를 만드는 것은 불가능하므로 고안된 것이 레이스컨디션
(Race Condition)이다.
두 개의 프로그램이 동시에 실행되도록 한다. A를 반복실행하는 프로그램과 심볼릭링크(byebye)를 반복해서 생성하는 프로그램을 작성한다.
두 개의 프로그램들이 실행되는 시간의 차이가 있을 것이므로 ③번과 ④번 사이에서 심볼릭링크가 생성될 것이다.
두 개의 프로그램이 심볼릭링크를 삭제하고, 생성하는 경쟁 상태를 Race Condition이라 하는 것이다.
즉, 이를 이용하면 root의 권환으로 특정파일에 수정을 가할 수 있다.
<레이스컨디션 조건>
ⓐ 해당 프로그램에 root 권한의 SetUID가 걸려있을 것
ⓑ 프로그램 실행 도중 어떤 파일을 생성할 것
ⓒ 그 생성되는 파일의 이름과 위치를 알고 있을 것
ⓓ 파일이 생성되는 디렉토리에 쓰기권한을 가지고 있을 것
in hackerschool
root 권한의 SetUID가 걸린 프로그램 A가 있다.
이 파일은 /tmp에 temp라는 임시파일을 생성.
일반사용자가 A라는 파일에 대한 /tmp에 temp라는 이름의 심볼릭링크 생성.
일반사용자가 A를 실행.
A는 /tmp의 temp에 어떤 내용을 쓰고 이는 A에 쓰여진다.
그래서
1. 프로그램 실행
2. 생성할 임시파일과 같은 이름의 파일이 유무 검사.
3. 있다면 삭제, 없으면 pass
4. 임시파일 생성
로 A의 구조가 바뀜.
그럼 해커는 3번과 4번의 간격을 노림.
A를 실행시키고 심볼릭 링크를 생성하는 것을 반복한다면 언젠가는 3번과 4번 사이에 파일이 생성되겠지..
구현
AA : level5 반복 실행
#include <unistd.h>
int main()
{
int i;
for(i=0; i<=1000; i++)
{
system("/usr/bin/level5");
}
return 0;
}
AD : level5.tmp의 내용을
#include <unistd.h>
int main()
{
int i;
for(i=0;i<=1000;i++)
{
system("ln -s /tmp/symbolic /tmp/level5.tmp");
}
return 0;
}
그럼 레이스컨디션 상태가 되고 level5.tmp가 생성되는 순간에 symbolic 파일에 password가 쓰일 것이다.
동시 작업 수행 : 하나는 백그라운드로 실행, 하나는 그냥 실행
백그라운드 : & 사용
'Security' 카테고리의 다른 글
hackerschool level6 ctrl + c (0) | 2011.07.14 |
---|---|
hackerschool level5 Hard Link, Symbolic Link (0) | 2011.07.14 |
hackerschool level4 service finger, chmod (0) | 2011.07.14 |
hackerschool level3 system 배열 (0) | 2011.07.14 |
hackerschool level1d redirection (0) | 2011.07.14 |