Problemas de seguridad del servidor http personalizado

3

Estoy usando un marco llamado VERTX para crear un servidor HTTP. Esto es diferente de un servidor web tradicional como APACHE o NGINX. Aquí simplemente usaré el código JAVA para crear un servidor HTTP que reciba las solicitudes en el PORT 80 y envíe las respuestas de vuelta, nada sofisticado, una implementación muy simple. Esto simplemente se compila en un JAR y se ejecuta dentro de la línea de comandos donde luego escuchará las solicitudes, eso es todo.

Estaré ejecutando este nodo de servidor HTTP (CentOS 7 o Ubuntu 14.04) en Google Cloud, por lo que habrá un equilibrador de carga en el frente donde puedo especificar las reglas del firewall (solo permitiré el acceso al puerto 80). El código real solo recibe una solicitud HTTP y envía "hola mundo" (no se abre ningún archivo local ni nada). Entonces, mi pregunta es: si cierro todos los puertos excepto el puerto 80, ejecuto el servidor HTTP como otro usuario además de root, ¿hay algún ataque común (incluso poco común) además de un ataque de denegación de servicio que pueda realizarse en este servidor? Si es así, ¿cuál sería una forma de protegerse contra estos ataques?

    
pregunta user2924127 10.09.2015 - 20:34
fuente

2 respuestas

4

Una lista parcial de cosas para pensar:

¿Soporta múltiples conexiones al mismo tiempo? ¿Qué sucede cuando recibe una nueva solicitud de conexión mientras otra está pendiente? ¿Qué pasa si obtienes más conexiones de las que esperas? Si usted (o VERTX o Java, sin su conocimiento) reserva dinámicamente la memoria, ¿se puede reservar demasiado (aplastamiento de la pila: ejecutar código arbitrario)? ¿Qué sucede si un cliente interrumpe la conexión antes de que respondas? ¿Limpias correctamente?

¿Qué sucede si el cliente le proporciona demasiada información inesperada? Si tiene una Cadena de 1024 bytes para mantener el URI solicitado, pero el cliente solicita un URI de 1200 bytes, ¿a dónde van esos caracteres adicionales (desbordamiento de búfer) (no solo el URI sino cualquier datos del cliente? te da, como agente de usuario)? ¿Qué sucede si el cliente solicita ../../../etc/passwd (recorrido de ruta; sé que no pretende abrir archivos, pero ...) o caracteres no ASCII (reservaste 3 bytes porque la cadena tiene una longitud de 3 caracteres, pero todos son caracteres Unicode de 2 bytes)?

¿Hay algún tipo de entrada que las bibliotecas que manejan de una forma que no pueda esperar (por ejemplo, tal vez VERTX vea una solicitud de URL para file:///etc / passwd y decida manejarlo por usted)? O el problema opuesto: ¿estás lo suficientemente cerca de la capa física que necesitas para manejar cosas como paquetes fragmentados?

¿Qué sucede si se falsifica la dirección IP del cliente para que envíe las respuestas a la computadora incorrecta (ataque de retransmisión)?

¿Qué sucede cuando decide que ninguno de estos problemas le afecta ahora? Luego, el año próximo usará esta plataforma como base para otra función, pero olvide volver a ejecutar su análisis de seguridad primero.

Estirando un poco su pregunta: ¿qué les ocurre a sus usuarios si el dispositivo es hackeado por otros medios y su servidor HTTP es reemplazado por algo que sirve malware? ¿Necesita ser compatible con HTTPS para proteger a sus usuarios? Es de suponer que tiene ssh habilitado para que pueda administrar el servidor (instalar nuevas versiones de su servidor, etc.): ¿está (o la consola o cualquier otro método que utilice para el mantenimiento) debidamente asegurado?

Se necesita un poco de trabajo para escuchar en puertos privilegiados (debajo del puerto 1024) sin ser root. Podría hacer su vida un poco más fácil si puede escuchar en el puerto 8000 (tal vez tenga su equilibrador de carga redirigiendo los puertos 80 a 8000 para usted).

Protección: codificación defensiva (como verificar la longitud de los datos entrantes antes de copiarlos), saber qué sucede en las bibliotecas a las que está llamando, reutilizar código ya depurado, revisiones de código, análisis de fuentes estáticas, pruebas.

    
respondido por el drewbenn 11.09.2015 - 00:22
fuente
1

En términos generales, cuanto más simple sea el software, menor será la superficie de ataque. Cuanto menos código tenga, menos espacio tendrá para los errores. Por lo tanto, su pequeño y pequeño servidor web puede ser incluso más seguro que una aplicación compleja como apache en nginx.

... podría ...

Los errores de seguridad críticos pueden acechar incluso en el código más simple. ¿Tienes un error? Tal vez ... Imposible saberlo sin revisar su código, e incluso entonces nunca hay una certeza del 100%. Solo puedes probar la existencia de errores, no la ausencia. También puede haber vulnerabilidades de seguridad desconocidas en el marco de Vert.x o incluso en la VM de Java que se pueden explotar a través de su aplicación.

Entonces, ¿cómo proteges contra las vulnerabilidades de estos errores?

No puedes. No hay forma de protegerse contra un escenario de ataque que no conoce.

    
respondido por el Philipp 10.09.2015 - 23:07
fuente

Lea otras preguntas en las etiquetas