Zettelkasten

Time-of-Check to Time-of-Use(TOCTOU)는 검사 시점과 사용 시점 사이의 경쟁 조건이다.

·수정 2026.04.23·수정 2

요약

  • TOCTOU는 리소스 상태를 검사(check)한 후 사용(use)하기까지의 시간 간격에서 발생하는 race condition
  • 검사와 사용이 atomic하지 않아 그 사이에 상태가 변경될 수 있음

본문

문제 상황

# 취약한 코드 예시
if os.path.exists(filename):      # Time-of-Check
    with open(filename, 'r') as f:  # Time-of-Use
        data = f.read()
# check와 use 사이에 파일이 삭제되거나 변경될 수 있음

발생 조건

  1. 리소스 상태를 먼저 검사
  2. 검사 결과를 기반으로 이후 작업 수행
  3. 검사와 사용 사이에 다른 프로세스/스레드가 상태 변경 가능

보안 취약점 예시

  • 파일 권한 검사 후 파일 접근: 심볼릭 링크 공격에 취약
  • 계좌 잔액 확인 후 출금: 동시 출금 요청으로 잔액 초과 인출 가능

해결 방법

  1. Atomic 연산 사용: 검사와 사용을 단일 연산으로 수행
  2. Lock 사용: 검사-사용 구간을 임계 영역으로 보호
  3. 예외 처리: 검사 없이 바로 시도하고 실패 시 처리 (EAFP 패턴)
# 개선된 코드 (EAFP 패턴)
try:
    with open(filename, 'r') as f:
        data = f.read()
except FileNotFoundError:
    handle_missing_file()

참고

  • Race Condition의 하위 유형
  • CWE-367: Time-of-check Time-of-use (TOCTOU) Race Condition