
PoC éducatif d'une CVE pour une course TOCTOU sur les permissions de fichiers dans Flask ; utilise le remplacement de lien symbolique pendant la fenêtre de vérification-ouverture pour divulguer des fichiers sensibles.
# 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)
Un serveur de fichiers vérifie qu'un chemin est un fichier régulier, puis l'ouvre après un délai. Un attaquant peut remplacer le fichier par un lien symbolique vers un fichier système sensible (par exemple /etc/shadow) pendant la fenêtre de course, contournant ainsi la vérification et lisant des données protégées.
isfile) et l'utilisation (open) ne sont pas atomiques, ce qui permet à un attaquant de modifier l'objet du système de fichiers entre les deux.pip install flask
python toctou_server.py
python exploit_toctou.py
Si la course réussit, la réponse contient le fichier shadow.