Come proteggere il codice delle applicazioni Windows contro il path traversal?

3

Sto scrivendo un semplice server HTTP in Lua e mentre posso trovare facilmente le risorse su come proteggermi dall'incrocio tra directory di Unix, ho già trovato alcuni accorgimenti nella versione di Windows. Mentre sto già cercando C:\ all'inizio (C sta per "qualsiasi lettera" qui), ../ e /.. (con barra rovesciata come il delimitatore di directory) e \ all'inizio. Il codice verrà passato ad ANSI C fopen() , compilato in Microsoft Visual C ++ v10 (non ha idea di quale sia la chiamata di sistema a cui compila questa chiamata). Ci sono altre trappole che dovrei cercare in questo caso?

Mi interessano solo le soluzioni che implicano la modifica del mio codice, più preferibilmente controllando il nome del file rispetto ai pattern.

    
posta d33tah 12.09.2013 - 15:26
fonte

1 risposta

7

I percorsi in Windows sono relativamente complessi . In particolare, Microsoft ha l'abitudine di inventare nuove funzionalità, quindi anche se il tuo server HTTP è veramente protetto dal path traversal oggi , potrebbe diventare vulnerabile alla prossima versione di Windows, possibilmente anche un piccolo aggiornamento.

In questo momento stai usando il "pensiero della lista nera": stai tentando di enumerare tutte le costruzioni "cattive" e in particolare di rilevarle. Le liste nere sono note per essere fragili perché è molto difficile essere esaurienti e quindi rimanere esaurienti. Dovresti usare la whitelist-thinking , cioè definire una sintassi per percorsi consentiti ed escludere tutto il resto.

Ad esempio, definisci che un percorso consentito consiste in una sequenza di componenti separati da caratteri della barra ("/", non "\"), con le seguenti regole:

  • Un componente contiene solo lettere, cifre, trattini ("-"), caratteri di sottolineatura ("_") o punti (".").
  • Un punto potrebbe non apparire come primo o ultimo carattere in un componente.
  • Non ci devono essere due punti consecutivi in un componente.
  • Un componente contiene almeno un carattere e al massimo 64 caratteri (limite arbitrario).
  • Non possono essere visualizzate due barre consecutive in un percorso.
  • Un percorso non inizia con una barra.
  • Un percorso non è vuoto.
  • La lunghezza totale di un percorso non deve superare i 250 caratteri.

Tutte queste regole sono facili da applicare a livello di codice. E garantiscono un "percorso locale pulito" che puoi inviare a fopen() . Nota che la maggior parte delle funzioni di Windows sono perfettamente soddisfatte del "/" come separatore, ma potresti comunque voler sostituire tutte le barre con barre retroverse ( dopo controllando tutte le regole sopra, ovviamente).

    
risposta data 12.09.2013 - 15:38
fonte

Leggi altre domande sui tag