본문 바로가기

⏱️ 경쟁조건 (TOCTOU) - 실습 시뮬레이터

CWE-367: Time-of-check Time-of-use (TOCTOU) Race Condition

KISA 소프트웨어 보안약점 진단가이드(2021) · 시간 및 상태
💡 쉽게 말하면
"비었나?" 확인하고 "넣는" 처리 사이 찰나에 남이 끼어들면 덮어쓰입니다. 확인과 처리를 한 번에(원자적) 해야 합니다.
✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ 경쟁조건 식별
  • ⬜ 원자적 연산 적용
☕ Java 코드 에디터 취약한 코드
FileWriter.java 💡 검사와 생성을 원자적으로 처리하세요(CREATE_NEW).
// [취약] 존재검사(exists) 후 생성(write) 사이 시간차 → TOCTOU
File f = new File("/tmp/session.dat");
if (!f.exists()) {
    FileWriter w = new FileWriter(f);
    w.write(secret);
    w.close();
}
💡 수정 가이드 (KISA 기준)
1. 원자적 파일 생성

존재 확인과 생성을 하나의 원자적 연산으로 수행합니다.

Path p = Paths.get("/tmp/session.dat"); try (var ch = Files.newByteChannel(p, StandardOpenOption.CREATE_NEW, // 없을 때만 원자적 생성 StandardOpenOption.WRITE)) { ch.write(ByteBuffer.wrap(secret.getBytes())); }
📊 분석 결과 및 설명
🎯 목표

파일의 존재 검사와 생성/사용을 원자적으로 처리하여 경쟁조건을 제거해야 합니다.

⚠️ 현재 취약점

TOCTOU Race Condition

검사 후 사용 사이의 시간차를 악용해 심볼릭 링크 공격 등이 가능합니다.

✅ 학습 진행도
  • ⬜ 진단 시작
  • ⬜ 경쟁조건 식별
  • ⬜ 배타적 생성 적용
🐍 Python 코드 에디터 취약한 코드
file_util.py 💡 open()의 'x'(배타적 생성) 모드를 사용하세요.
import os
# [취약] exists 검사 후 open 사이 경쟁조건(TOCTOU)
if not os.path.exists(path):
    with open(path, "w") as f:
        f.write(secret)
💡 수정 가이드 (KISA 기준)
1. 배타적 생성 모드

'x' 모드는 파일이 이미 있으면 예외를 던집니다.

# 파일이 없을 때만 원자적으로 생성 try: with open(path, "x") as f: f.write(secret) except FileExistsError: pass
📊 분석 결과 및 설명
🎯 목표

파일 생성 시 검사-사용 경쟁조건을 배타적 생성으로 제거합니다.

⚠️ 현재 취약점

TOCTOU Race Condition

검사와 사용 사이 시간차로 인한 파일 교체/링크 공격이 가능합니다.

📰 실제 사고사례 & 표준 매핑
2016년 Dirty COW(CVE-2016-5195) 리눅스 경쟁조건으로 일반 사용자가 root 권한을 획득할 수 있었습니다.
🏷️ CWE-362
※ 공개적으로 알려진 사례 기반 교육용 요약 · CWE/OWASP는 공개 표준 분류