Protección de su aplicación Node.js

De forma predeterminada, Node.js es bastante seguro por sí mismo. Aunque, definitivamente hay cosas que debes tener en cuenta. Si su aplicación web Node comienza a obtener más y más ...

De forma predeterminada, Node.js es bastante seguro por sí mismo. Aunque, definitivamente hay cosas que debes tener en cuenta. Si su aplicación web Node comienza a ser cada vez más popular, por ejemplo, deberá pensar cada vez más en la seguridad para asegurarse de mantener seguros los datos de sus usuarios.

Después de ver algunas preguntas sobre la seguridad de Node.js en la web en las últimas semanas, pensé que sería útil escribir una breve guía sobre lo que puede hacer para proteger sus aplicaciones.

Muchas, si no todas, las sugerencias aquí son realmente fáciles de seguir e implementar, y en su mayoría son específicas para Node o sus módulos. Así que no cubriré cosas como un cifrado o autenticación de usuario, que está un poco fuera del alcance de este artículo. . Muchos de los consejos aquí se centrarán en los marcos web de Node, ya que suelen ser los más vulnerables a los ataques.

No ejecutar código con Sudo

Esto sucede mucho más de lo que piensas, y es peligroso. Dado que otorga permisos de root, ejecutar código con sudo puede hacer que desaparezcan problemas molestos, como escribir en un directorio que el usuario no posee. Pero esa es solo la salida fácil, y estos atajos traen una serie de otros problemas que no debes ignorar.

En su lugar, encuentre la causa raíz del problema y descubra una manera de solucionarlo sin comprometer todo el sistema.

Entonces, por ejemplo, si necesita abrir el puerto 80 para un servicio web, pero no puede porque no está ejecutando una aplicación raíz, debe usar un proxy como [Nginx] (https://en.wikipedia. org/wiki/Nginx) para reenviar las solicitudes desde el puerto 80 a cualquier otro puerto en el que se esté ejecutando su servicio.

Si se ejecuta bajo la raíz y los atacantes se apoderan de su aplicación, pueden hacer lo que quieran con su sistema y sus datos. Este es el peor de los casos del que está tratando de protegerse.

Evitar eval a toda costa

Está bien, lo admito, a veces puede ser tentador hacer que tu código sea más dinámico permitiéndole ejecutar JavaScript arbitrario usando eval, pero créeme, esta es una mala idea.

Algunas personas incluso intentan usarlo cuando se vuelven perezosos al analizar la entrada del usuario. Después de todo, el motor de JavaScript V8 es realmente bueno para analizar cosas como operaciones matemáticas simples, por lo que sería tentador usar eso para su beneficio:

1
2
var result = eval('(13 + (2 * 23.249) / 0.981)');
// result = 60.398572884811415

Hay demasiadas formas en que esto puede volver a morderte. A menos que seas un experto y sepas cómo protegerte de todos los diferentes tipos de JavaScript malicioso, solo mantente alejado de este .

Aquí hay un ejemplo simple del exploit:

1
2
var userInput = req.body.userInput;    // User entered 'process.exit()'
var answer = eval(userInput);          // App quits here

La ejecución de este código cerrará su aplicación, lo que provocará una denegación de servicio (DOS) para sus usuarios.

Agregar o quitar encabezados HTTP

Hay bastantes encabezados HTTP que pueden ayudarte y hacerte daño. Usar los correctos de la manera correcta es la parte difícil.

Express, de forma predeterminada, agrega el encabezado X-Powered-By: Express, que en realidad no hace más que informar a los atacantes potenciales qué marco web está utilizando y, por lo tanto, cómo explotarlo en función de las vulnerabilidades conocidas públicamente. Cuanta más información tengan sobre su pila de tecnología, más formas en que podrán atacarla.

Ahí es donde entra en juego casco. Helmet es un pequeño módulo para Node que ayuda a proteger las aplicaciones Express/Connect agregando/eliminando varios encabezados HTTP.

Puede hacer cualquier cosa, desde habilitar HSTS hasta prevenir ataques de secuestro de clics. Estas son cosas que requieren poco o ningún trabajo de su parte, pero pueden marcar una gran diferencia. Entonces, si está creando una aplicación Express, esto debería ser una obviedad (y realmente, para cualquier servicio web debe hacer esto).

Usar utilidades de escaneo como Retire.js

No todos los programadores son expertos en seguridad, y si bien debe hacer todo lo posible para mantenerse actualizado sobre vulnerabilidades comunes como XSS o SQL injection, es difícil conocerlas todas.

Para compensar esto, debe intentar usar herramientas como Retire.js, que escanea su aplicación Node en busca de dependencias que contengan vulnerabilidades.

Por ejemplo, Ember.js tiene una vulnerabilidad XSS específica en algunas versiones diferentes (CVE-2014-0046), todas de los cuales son verificados por Retire.js. Cuando ejecuta retire en el directorio de su proyecto, comparará los paquetes en node_modules con un repositorio público de vulnerabilidades y le informará cuáles de sus dependencias son inseguras.

Hay demasiadas vulnerabilidades en muchos de estos paquetes para que las compruebe usted mismo, por lo que es mejor que deje que una herramienta como esta lo haga por usted.

Puede hacer que esto sea parte de su flujo de trabajo fácilmente al integrarlo con Grunt o Gulp, gracias a los complementos provistos. Los detalles están en el LÉAME.

Otra opción es simplemente ejecutarlo en un comando prepublish, que se ejecutaría antes de que npm envíe su paquete al repositorio. Simplemente agregue algo como esto a su package.json:

1
2
3
4
5
6
7
{
  "name": "myProject",
  "version": "0.0.1",
  "scripts": {
    "prepublish": "retire",
  }
}

Tenga cuidado con el módulo child_process

Al igual que eval, usar spawn y exec del módulo child_process puede ser realmente útil, pero también realmente peligroso. Cualquier entrada de usuario que se cuela en estos comandos podría significar que su sistema se ve comprometido con bastante rapidez (¡especialmente si está ejecutando su aplicación con sudo!).

Por ejemplo, Magia de imagen es una herramienta de línea de comandos muy popular para mostrar, convertir y editar imágenes. Con tantas aplicaciones web que usan imágenes en estos días, Image Magick a menudo se usa en segundo plano para cosas como recortar y cambiar el tamaño. Para usar esta herramienta con Node, es posible que vea un código como este:

1
2
3
child = child_process.exec('convert ' + imageFilename + ' ' + imageFilename + '.bmp', ['-depth', '24'], function(err, stdout, stderr) {
    console.log('Done');
});

Esto puede parecer inofensivo, pero con un imageFilename cuidadosamente diseñado, puede ejecutar cualquier código que desee en el shell.

exec solo debe usarse si no depende de la entrada del usuario o si los argumentos están muy desinfectados. Aún mejor, busque en npm una biblioteca que envuelva la herramienta de línea de comandos. Por lo general, se construyen con este tipo de seguridad en mente, o al menos tienen más ojos en el código para verificar si hay problemas. Para Image Magick, hay algunos módulos disponibles, como gm.

Comprender las vulnerabilidades

Muchas vulnerabilidades en las aplicaciones web se aplican a todos los servicios, independientemente del lenguaje de programación y el marco utilizado. Aunque, cómo atacar esos servicios puede diferir según la pila de tecnología que esté utilizando. Para defenderse mejor, realmente necesita aprender cómo funcionan estos exploits.

Por suerte para usted, OWASP publica una lista de los 10 principales riesgos para las aplicaciones web. Revíselos y luego haga un análisis exhaustivo de su sitio web para ver si alguno de estos se aplica a usted.

Aún mejor, consulte NodoCabra, que es un sitio web desplegable creado por OWASP destinado a enseñarle cómo identificar estos riesgos en las aplicaciones Node específicamente. No hay mejor manera de aprender estos conceptos que haciéndolo usted mismo.

El tutorial proporcionado lo guiará a través de todos los riesgos, mostrando ejemplos específicos de cómo explotar y defenderse contra las vulnerabilidades. Por ejemplo, aquí hay un video proporcionado por OWASP que muestra cómo inyectar JavaScript usando un formulario web:

Ocurrió un error. {#ocurrió un error. .mensaje}

Intenta ver este video en www.youtube.com{target="_blank"}, o habilita JavaScript si está deshabilitado en tu navegador.

Más información

La seguridad de los nodos es un gran tema, por lo que no sería razonable tratar de cubrirlo todo aquí. Si está interesado en obtener más detalles, le sugiero que lea algunos recursos más, como estos:

Conclusión

Con demasiada frecuencia, la seguridad de una aplicación es una idea de último momento para el desarrollo y el diseño. Ya es bastante difícil hacer que su código funcione correctamente, y mucho menos hacerlo seguro para que lo usen sus usuarios.

Afortunadamente, no eres el único que está pasando por estos problemas, lo que significa que hay muchas herramientas y recursos creados por otros para ayudarte a proteger tus aplicaciones de forma rápida y sencilla. Simplemente tómese el tiempo para buscar NPM, hacer preguntas en los foros o incluso contratar a un experto. ¡Definitivamente vale la pena el tiempo y el dinero!

¿De qué otras formas protege sus aplicaciones de Node? ¡Cuéntanos en los comentarios!