
검사-오픈 창 사이에 심볼릭 링크 교체를 사용하여 민감한 파일을 노출하는 Flask의 TOCTOU 파일 권한 경쟁 조건에 대한 교육용 CVE PoC입니다.
# toctou_server.py - File server that checks permission then opens
import os, time, tempfile
from flask import Flask, request
app = Flask(__name__)
SAFE_DIR = '/tmp/safe'
@app.route('/read')
def read_file():
filename = request.args.get('file')
filepath = os.path.join(SAFE_DIR, filename)
# Check: ensure it's a regular file and owned by user
if not os.path.isfile(filepath):
return "Not a file", 403
# Race window: attacker replaces file with symlink to /etc/shadow
time.sleep(0.2) # simulate processing delay
with open(filepath, 'r') as f:
return f.read()
if __name__ == '__main__':
app.run(port=5000)
파일 서버는 경로가 일반 파일인지 확인한 후, 지연 시간이 지난 뒤 해당 파일을 엽니다. 공격자는 레이스 윈도우(race window) 동안 파일을 민감한 시스템 파일(예: /etc/shadow)에 대한 심볼릭 링크로 교체하여 검사를 우회하고 보호된 데이터를 읽을 수 있습니다.
isfile)와 사용(open)이 원자적(atomic)이지 않으므로, 공격자가 그 사이에 파일 시스템 객체를 변경할 수 있습니다.pip install flask
python toctou_server.py
python exploit_toctou.py
레이스가 성공하면 응답에 shadow 파일이 포함됩니다.