Può consentire a un'applicazione Web di spostare, copiare e / o eliminare file al di fuori della radice del server? Si tratta di un problema di sicurezza?

5

Sono nuovo nell'usare e programmare applicazioni web, quindi ho voluto fare una domanda. È sicuro eseguire comandi os come copia ed mv ed eliminare da un'app Web che è in esecuzione su un apache, o solleva problemi di sicurezza? Più specifico sto usando django e voglio una mia vista quando viene eseguita essere in grado di eseguire comandi os come copiare muovere ecc. in cartelle che risiedono al di fuori della cartella var / www. So come utilizzare il modulo os ma non ho trovato dalla mia ricerca sul Web se è sicuro farlo.

    
posta Apostolos 25.06.2014 - 12:35
fonte

3 risposte

10

Se l'input dell'utente non ha alcuna influenza sui comandi o sui loro argomenti, non dovrebbe esserci alcuna minaccia immediata.

Ma è sempre un rischio, potresti perdere qualcosa o potrebbero esserci (es. ci sono di sicuro) vulnerabilità sconosciute nel software che stai usando (ad esempio, Django).

Quello che farei per mitigare quei casi sarebbe:

  1. Verifica le tue autorizzazioni. Assicurati di utilizzare i privilegi minimi necessari per le operazioni di cui hai bisogno (forse l'utente di Apache ha privilegi troppo alti per ciò di cui hai bisogno, crea un altro utente con minori privilegi);
  2. Aggiungi alla whitelist solo i comandi di cui avrai bisogno (blocca tutto il resto);
  3. Cerca nell'impostazione di un filesystem controllato per quelle operazioni (ad es. una sorta di 'chroot');
  4. Indurisci il tuo server (guarda in Grsecurity e RBAC);
  5. Ovviamente mantieni tutto aggiornato e aggiornato.
risposta data 25.06.2014 - 13:28
fonte
2

Quando costruisci comandi che includono stringhe fornite dall'utente, c'è sempre il rischio di un'iniezione di comandi.

Esempio di codice che dovrebbe copiare un file in un nome fornito dall'utente:

$command = "cp template.png " + $filename + ".png";

Quando il nome file viene fornito dall'utente, potrebbero passare questo:

$filename = "foo.png ; rm *";

con conseguente ricezione del sistema operativo

cp template.png foo.png ; rm *.png

che in realtà sono due comandi, il secondo è malevolo (rimuovi tutti i file png dalla directory).

    
risposta data 25.06.2014 - 13:36
fonte
1

Sì, può! Questo è estremamente insicuro e considerato una delle migliori pratiche del settore della sicurezza. Ci sono molte cose che possono andare storte:

  • Puoi semplicemente consentire alle persone di digitare i comandi desiderati e non ci vorrà molto prima che scarichino il tuo server ed eseguano un binario dannoso di loro creazione.
  • Potresti subire una categoria di attacchi come descritto da @Philipp chiamato "Iniezioni di comandi OS" . Si verifica quando si eseguono i comandi sui dati forniti dall'utente e gli utenti forniscono dati in modo che aggiungano sequenze di comandi aggiuntivi. L'approccio migliore per risolvere questo problema è scrivere una funzione che riceverà il comando e i dati separati e rimuovi sempre i dati .
  • Anche se ti limiti a pochi comandi come cp e mv, gli utenti possono fornire nomi di file che puntano fuori dalla tua directory di lavoro, come "/ usr / bin / apache", che nell'esempio di @ Philipp risulterebbe nel tuo binario Apache rimosso e il tuo server non funziona più la prossima volta che lo riavvii.

Ora, non so cosa stai cercando di fare, ma se insisti a procedere, tieni a mente quanto segue:

  • Autentica i tuoi utenti e verifica che siano autorizzati a utilizzare la tua visualizzazione
  • Consenti solo i comandi all'interno di una white-list e separa comandi e dati come detto sopra
  • Disinfettare sistematicamente i dati eseguendo l'escape di caratteri speciali e verificando che appartengano a uno spazio legale (ad esempio, i nomi dei file si trovano all'interno di uno spazio legale, senza contenere alcun nome di cartella, ad esempio); guarda il modello di Clark-Wilson
  • Sandbox sul server Web e, se possibile, ottenere un server / worker specifico per eseguire questa vista speciale del tuo (vedi i moduli di SELinux per Apache, in particolare guarda come RHEL 7 usa SELinux e systemd per i servizi sandbox); Vai ancora oltre se lo stesso server esegue qualcosa di realmente sensibile e contiene il server che esegue la tua visualizzazione web in un container LXC o Docker (non completamente sicuro ma meglio di niente)
  • Ottieni il tuo codice e il tuo server controllati da un team di test di penetrazione esterno
risposta data 25.06.2014 - 17:38
fonte

Leggi altre domande sui tag