Problemi di sicurezza del server http personalizzato

3

Sto usando un framework chiamato VERTX per creare un server HTTP. Questo è diverso da un server web tradizionale come APACHE o NGINX. Qui userò semplicemente il codice JAVA per creare un server HTTP che riceve richieste su PORT 80 e restituisce risposte, niente fantasia, implementazione molto semplice. Questo è semplicemente compilato in un JAR ed eseguito all'interno della riga di comando dove sarà quindi in ascolto per le richieste, cioè.

Gestirò questo nodo server HTTP (CentOS 7 o Ubuntu 14.04) su Google Cloud, quindi ci sarà un servizio di bilanciamento del carico in-front dove posso specificare le regole del firewall (accedo solo alla porta 80 per l'accesso). Il codice effettivo riceve solo una richiesta HTTP e restituisce "Hello World" (nessuna apertura di file locali o altro). La mia domanda allora è, se chiudo tutte le porte eccetto la porta 80, eseguo il server HTTP come un altro utente oltre a root, ci sono dei comuni (anche rari) oltre ad un attacco denial of service che può essere fatto su questo server? Se sì, quale sarebbe un modo per proteggersi da questi attacchi?

    
posta user2924127 10.09.2015 - 20:34
fonte

2 risposte

4

Un elenco parziale di cose a cui pensare:

Supporta più connessioni contemporaneamente? Cosa succede quando ricevi una nuova richiesta di connessione mentre un'altra è in sospeso? Cosa succede se ottieni più connessioni di quelle che ti aspetti? Se tu (o VERTX o Java, a tua insaputa) puoi riservare la memoria in modo dinamico, puoi essere troppo riservato (smashing: esecuzione di codice arbitrario)? Cosa succede se un client interrompe la connessione prima di rispondere: pulisci correttamente?

Cosa succede se il cliente ti dà un input eccessivo o inaspettato? Se si dispone di una stringa di 1024 byte per contenere l'URI richiesto ma il client richiede un URI di 1200 byte, dove vanno questi caratteri aggiuntivi (buffer overflow) (non solo l'URI ma qualsiasi dati del client ti dà, come utente agente)? Cosa succede se il client richiede ../../../etc/passwd (path traversal, so che non intende per aprire i file, ma ...) o caratteri non ASCII (hai riservato 3 byte perché la stringa ha lunghezza 3 caratteri, ma sono tutti caratteri unicode a 2 byte)?

C'è qualche tipo di input che potrebbe essere gestito dalle librerie che usi in un modo che non ti aspetti (ad esempio, forse VERTX vede una richiesta di URL per file:///etc / passwd e decide di gestirlo per te)? O il problema opposto: sei abbastanza vicino al livello fisico di cui hai bisogno per gestire cose come pacchetti frammentati?

Cosa succede se l'indirizzo IP del client è falsificato per farti inviare risposte al computer sbagliato (attacco relay)?

Che cosa accade quando decidi che nessuno di questi problemi ti riguarda, quindi l'anno prossimo utilizzi questa piattaforma come base per un'altra funzione, ma dimentica di rieseguire prima le analisi di sicurezza?

Aumenta leggermente la tua domanda: cosa succede ai tuoi utenti se l'appliance viene compromessa con altri mezzi e il tuo server HTTP viene sostituito da qualcosa che serve malware? Devi supportare HTTPS per proteggere i tuoi utenti? Presumibilmente hai ssh abilitato in modo da poter gestire il server (installare nuove versioni del tuo server, ecc.): È quello (o la console o qualunque altro metodo tu usi per la manutenzione) correttamente protetto?

Ci vuole un po 'di lavoro per ascoltare le porte privilegiate (sotto la porta 1024) senza essere root. Potresti semplificarti la vita se riesci ad ascoltare sulla porta 8000 (forse il tuo bilanciatore di carico reindirizza la porta da 80 a 8000 per te).

Protezione: codifica difensiva (come la verifica della lunghezza dei dati in arrivo prima di copiarli), sapere cosa sta succedendo nelle librerie che stai chiamando, riutilizzare codice già sottoposto a debug, revisioni del codice, analisi delle sorgenti statiche, test.

    
risposta data 11.09.2015 - 00:22
fonte
1

In generale, più semplice è il software, minore è la superficie di attacco. Meno codice hai, meno spazio hai per i bug. Quindi il tuo piccolo server web potrebbe essere persino più sicuro di un'applicazione complessa come apache su nginx.

... potrebbe ...

I bug di sicurezza critici possono nascondersi anche nel codice più semplice. Hai un tale bug? Forse ... Impossibile dire senza rivedere il tuo codice, e anche allora non c'è mai certezza al 100%. Puoi solo provare l'esistenza di bug, non l'assenza. Potrebbero esserci anche vulnerabilità di sicurezza sconosciute nel framework Vert.x o anche in Java VM che sono sfruttabili attraverso l'applicazione.

Quindi, come proteggi dagli exploit di questi bug?

Non puoi. Non c'è modo di proteggersi da uno scenario di attacco che non conosci.

    
risposta data 10.09.2015 - 23:07
fonte

Leggi altre domande sui tag