attacco di attraversamento del percorso - vulnerabilità di caricamento file

Attraversamento del percorso nei caricamenti di file: come gli sviluppatori creano i propri exploit

Quando il caricamento dei file si trasforma in accesso ai file

Un singolo gestore di caricamento non sicuro può aprire la porta a un attacco di attraversamento completo del percorso e a una vulnerabilità nel caricamento dei file. Quando gli sviluppatori concatenano i nomi dei file direttamente con i percorsi di caricamento, gli aggressori possono inviare nomi di file dannosi come ../../etc/passwd per uscire dalle directory e accedere ai file sensibili. Questo tipo di attraversamento del percorso trasforma una semplice API di caricamento in un potente exploit di accesso ai file, soprattutto quando l'applicazione viene eseguita con autorizzazioni elevate.

⚠️Esempio non sicuro, solo a scopo didattico. Non utilizzare in produzione.

// Vulnerable upload handler, file upload vulnerability [HttpPost("/upload")] public async Task<IActionResult> Upload(IFormFile file) {     var path = Path.Combine("uploads/", file.FileName);  // No validation     using var stream = new FileStream(path, FileMode.Create);     await file.CopyToAsync(stream);     return Ok("File uploaded!"); } 

Un aggressore può caricare un file denominato ../../web.config per sovrascrivere o leggere file con restrizioni, un classico attacco di attraversamento del percorso.

Versione sicura:

// Safe upload with validation and canonicalization [HttpPost("/upload")] public async Task<IActionResult> Upload(IFormFile file) {     var fileName = Path.GetFileName(file.FileName); // strip directories     var targetDir = Path.GetFullPath("uploads/");     var safePath = Path.Combine(targetDir, fileName);       if (!safePath.StartsWith(targetDir))         return BadRequest("Invalid file path");       using var stream = new FileStream(safePath, FileMode.Create);     await file.CopyToAsync(stream);     return Ok("File securely uploaded!"); } 

Nota didattica: Canonizzare sempre i percorsi con Percorso.OttieniPercorsoCompleto() e verifica che il risultato rimanga all'interno della directory di caricamento. Non fidarti mai di un file.NomeFile direttamente.

Errori degli sviluppatori che consentono l'attraversamento del percorso

La maggior parte delle vulnerabilità di caricamento file che causano l'attraversamento del percorso derivano da codice frettoloso e dalla mancata convalida. Gli errori più comuni degli sviluppatori includono:

  • Concatenazione dell'input dell'utente direttamente nei percorsi del file system
  • Confidando Content-Type o solo convalida dell'estensione
  • Saltare la normalizzazione dei percorsi prima del salvataggio

Riutilizzo di cartelle temporanee tra richieste o microservizi

⚠️Esempio non sicuro, solo a scopo didattico. Non utilizzare in produzione.

# Flask example vulnerable to path traversal attack @app.route('/upload', methods=['POST']) def upload():     file = request.files['file']     file.save('uploads/' + file.filename)     return 'Uploaded' 

Gli aggressori possono aggirare questa semplice concatenazione per attraversare le directory (../../app.py) e scrivere o sovrascrivere file arbitrari. Versione sicura:

# Safe file upload validation from werkzeug.utils import secure_filename @app.route('/upload', methods=['POST']) def upload():     file = request.files['file']     name = secure_filename(file.filename)     path = os.path.join('uploads', name)     file.save(path)     return 'Securely uploaded' 

Nota didattica: Utilizzare gli helper forniti dal framework come nome_file_sicuro e applicare le estensioni consentite. Non concatenare mai manualmente l'input nei percorsi dei file.

Sfruttamento nel reale Pipelinee microservizi

Gli attacchi di attraversamento del percorso non si verificano solo negli endpoint pubblici. Spesso compaiono all'interno CI/CD sistemi, repository di artefatti o microservizi che gestiscono i file caricati. Ad esempio, una vulnerabilità di caricamento file in un gestore di artefatti di build potrebbe consentire a un aggressore di sovrascrivere gli script di build o iniettare file dannosi nei runner condivisi.

⚠️Esempio non sicuro, solo a scopo didattico. Non utilizzare in produzione.

# Never expose real tokens, credentials, or internal URLs in pipelines - name: Store build artifact   run: cp $UPLOAD_PATH/$FILENAME /var/artifacts/$FILENAME 

If $NOMEFILE non è convalidato, un creato ../../../etc/passwd il valore può sovrascrivere i file di sistema critici durante la distribuzione, un attacco di attraversamento del percorso nel mondo reale. Versione sicura: 

# Safer artifact storage guardrail - name: Store build artifact securely   run: |     SAFE_NAME=$(basename "$FILENAME")     cp "$UPLOAD_PATH/$SAFE_NAME" /var/artifacts/"$SAFE_NAME" 

Nota didattica: In pipelines, sanificare tutte le variabili di percorso dinamiche. Limitare le operazioni di scrittura alle directory controllate per impedire l'uscita dal file system durante le build o le distribuzioni.

Prevenzione dell'attraversamento del percorso nella logica di caricamento

Per mitigare l'attraversamento dei percorsi, è necessario iniziare con una validazione e un isolamento rigorosi degli input. È importante trattare i nomi dei file e i percorsi come input non attendibili fin dall'inizio, soprattutto quando si gestiscono file caricati.

Best Practices

  1. Normalizzare e canonizzare tutti i percorsi prima di utilizzarli.
  2. Limita i caricamenti in una directory dedicata esterna alla radice web.
  3. Applicare le liste consentite per estensioni di file e tipi MIME.
  4. Non riutilizzare mai le cartelle temporanee tra sessioni o utenti.
  5. Utilizzare lo stoccaggio in container per i file caricati, quando possibile.

Mini checklist preventiva

  • Convalida ogni nome file con Percorso.OttieniNomeFile() o equivalente.
  • Risolvi i percorsi completi e verifica i limiti delle directory.
  • Applicare estensioni e liste consentite MIME.
  • Utilizzare cartelle di caricamento separate per utente o sessione.
  • Includere la scansione e la convalida del caricamento in CI/CD test.

Nota didattica: Ogni gestore di caricamento file è un potenziale vettore di attacco di tipo path traversal. Costruisci una difesa approfondita convalidando, isolando e analizzando tutto il codice di gestione dei file.

Come Xygeni rileva e blocca i flussi di caricamento non sicuri

Xygeni Code Security scansioni basi di codice e pipelineper rilevare i modelli di attraversamento del percorso prima che raggiungano la produzione. Segnala la concatenazione di percorsi non sicuri, la canonizzazione mancante e le operazioni di file pericolose sia nel codice che CI/CD script.

Frammento funzionale, con controllo di sicurezza:

# Secure enforcement with Xygeni - name: Enforce secure upload and path handling   run: dotnet xygeni enforce --rules uploads,path,security --fail-on-risk 

Nota didattica: Integrazione Xygeni nella vostra pipeline garantisce che le vulnerabilità di caricamento dei file e gli attacchi di attraversamento del percorso vengano rilevati automaticamente durante la convalida della build.

Colmare il divario: prevenire il prossimo attacco di attraversamento del percorso

Un bug di attraversamento di un singolo percorso in un endpoint di caricamento file può consentire agli aggressori di accedere al file system del server. Esaminare i gestori di caricamento per individuare concatenazioni non sicure, normalizzare tutti i percorsi e non fidarsi mai dei nomi di file controllati dall'utente. Aggiungi strumenti di scansione delle vulnerabilità come Xygeni Code Security alla tua DevSecOps pipeline per rilevare gli attacchi di attraversamento del percorso e le vulnerabilità di caricamento dei file prima che vengano distribuiti. Per motivi di sicurezza, ogni file salvato deve essere trattato come codice eseguito!

sca-tools-software-strumenti-di-analisi-della-composizione
Dai priorità, risolvi e proteggi i rischi del tuo software
Crea il tuo account gratuito.
Nessuna carta di credito richiesta.

Proteggi lo sviluppo e la consegna del tuo software

con la suite di prodotti Xygeni