요약
- 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 사이에 파일이 삭제되거나 변경될 수 있음
발생 조건
- 리소스 상태를 먼저 검사
- 검사 결과를 기반으로 이후 작업 수행
- 검사와 사용 사이에 다른 프로세스/스레드가 상태 변경 가능
보안 취약점 예시
- 파일 권한 검사 후 파일 접근: 심볼릭 링크 공격에 취약
- 계좌 잔액 확인 후 출금: 동시 출금 요청으로 잔액 초과 인출 가능
해결 방법
- Atomic 연산 사용: 검사와 사용을 단일 연산으로 수행
- Lock 사용: 검사-사용 구간을 임계 영역으로 보호
- 예외 처리: 검사 없이 바로 시도하고 실패 시 처리 (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