Quando un sito serve file (immagini, documenti, fogli di stile), un attaccante può provare un trucco antico ma sempre attuale: chiedere file che non dovrebbe poter vedere, "uscendo" dalle cartelle pubbliche. Si chiama path traversal, e si previene con una tecnica precisa.
Cos'è il path traversal
L'attacco sfrutta sequenze come ../ per risalire nelle cartelle del server. Una richiesta apparentemente innocua può così puntare a file di sistema o di configurazione:
GET /download?file=../../etc/passwd
Perché è pericoloso
Fuori dalle cartelle pubbliche ci sono file di configurazione, chiavi, credenziali. Un path traversal riuscito può esporre proprio i segreti che tengono in piedi l'applicazione.
La difesa: path containment
La regola è "contenere" ogni percorso dentro una cartella consentita. Si calcola il percorso assoluto richiesto e si verifica che inizi davvero dalla cartella pubblica; in caso contrario, si rifiuta:
const base = path.resolve('public');
const target = path.resolve(base, richiesto);
if (!target.startsWith(base)) return nega();
Validare sempre l'input
Il path containment fa parte di una regola più ampia: non fidarsi mai dell'input dell'utente. Ogni dato che arriva da fuori va controllato prima di essere usato.
Dove il controllo salta comunque
La validazione va fatta sul percorso già normalizzato e risolto, non sulla stringa in arrivo: filtrare i ../ a mano lascia scoperte la doppia codifica (%252e%252e), i separatori diversi e i link simbolici che puntano fuori dalla cartella consentita. Su filesystem non sensibili alle maiuscole anche il confronto del prefisso può ingannare. Quando è possibile la difesa più solida è un'altra: non accettare percorsi dall'utente, ma un identificatore da confrontare con un elenco di file consentiti.
Collegato: proteggere i sorgenti e penetration testing.