2. DANIEL ECHEVERRI M.
Nickname: Adastra (@jdaanial)
Blog: thehackerway.com
Autor de varios libros de la editorial 0xWORD
Information Security Researcher.
THW Academy (academy.thehackerway.com)
THW (thehackerway.es)
¿WHOAMI?
3. Principales características de node.js
OpenSource, independiente de plataforma.
Desarrollado sobre CJR v8 (Chrome JavaScript Runtime).
Diseñado para ser rápido y escalable.
1
2
3
4
Rápida introducción a node.js
Liviano y eficiente.5
Permite la ejecución de Javascript en el backend.
4. Principales características de node.js
Módelo asíncrono basado en eventos y en la ejecución de
funciones de "callback".
Pensado para ejecutar operaciones en un "event-loop".
Enfoque "single-thread" para mejorar el desempeño y
escalabilidad de aplicaciones web.
6
7
8
9
Rápida introducción a node.js
No más “one thread per requests”. Un modelo
completamente distinto, enfocado al desarrollo de
aplicaciones escalables.
5. Principales características de node.js
Rápida introducción a node.js
"Event-loop model" vs "thread per requests".
Un modelo “Event-Loop” es ideal para aplicaciones en donde
la velocidad de respuesta de las peticiones es más importante
que las operaciones I/O. p.e: Un proxy inverso/transparente.
Un modelo “thread per requests” es más adecuado para
procesamientos intensivos con con un número bajo de
procesos concurrentes. p.e. Aplicaciones cuyas funciones
realizan múltiples operaciones de negocio, conexiones a
bases de datos u otros sistemas remotos.
6. Principales características de node.js
Rápida introducción a node.js
Componentes a desarrollar con node.js
Es necesario desarrollar el componente “servidor”,
típicamente utilizando el modulo “express” y además, la lógica
propiamente dicha de la aplicación.
Dado que todo se ejecuta desde un único hilo de ejecución, la
gestión inadecuada de excepciones puede interrupir por
completo el normal funcionamiento del servidor. Es
recomendable tener rutinas de chequeo que se encarguen de
verificar en todo momento, el correcto funcionamiento del
servidor y la disponibilidad del proceso en el sistema.
7. Las vulnerabilidades descritas en el OWASP-Top10
también aplican a las aplicaciones desarrolladas en
node.js, pero además también se pueden producir otras
vulnerabilidades relacionadas con el funcionamiento de
node.js y que hay que tener en cuenta.
Rápida introducción a node.js
8. Vulnerabilidades
especificas en Node.js
Vulnerabilidades especificas en Node.js
[-] Global Namespace Pollution.
[-] HTTP Parameter Pollution (HPP).
[-] Uso inseguro de “eval” y otras variantes. (Command
Execution).
[-] Entradas de usuario inseguras. (parámetros y cabeceras
HTTP).
[-] Regex DoS.
Entre otras...
9. Global Namespace Pollution
[-] Las variables que se declaran en el componente servidor
(normalmente usando “express”) tienen alcance global.
[-] Cuando en dichas variables se almacena información
sensible y/o crítica para el correcto funcionamiento del
sistema, se puede producir un problema de Global
NameSpace Pollution.
[-] Un atacante podría alterar o acceder a los valores de
dichas variables y tener cierto control y/o modificar el
comportamiento de la aplicación con otros usuarios del
sistema.
10. HTTP Parameter Pollution
[-] Se producen ante la gestión inadecuada de parámetros
duplicados en las peticiones HTTP.
[-] En NodeJS, la duplicidad de los parámetros no es
gestionada de forma automática, siendo una tarea que se
delega al programador. Si no se gestionan correctamente
dichos parámetros, se pueden producir excepciones que
pueden desencadenar una condición de DoS o producir
comportamientos inesperados.
11. OS Commanding
[-] Los parámetros de entrada suministrados por los usuarios
deben ser correctamente validados cuando partiendo de
ellos, se deben ejecutar comandos contra el sistema o
cualquier tipo de operación sensible.
[-] El módulo “child_process” en nodejs es el encargado
permitir la ejecución de comandos sobre el servidor.
Todos los comandos ejecutados lo hacen con los privilegios
que tenga el usuario que ha iniciado el componente servidor
de node.js.
12. Vulnerabilidades de inyección
[-] Tal como se indica en la guía de OWASP Top 10, las
vulnerabilidades de inyección son las más habituales en las
aplicaciones web.
[-] Existen varios tipos de vulnerabilidades de inyección, tales
como: SQL Injection, NoSQL Injection, HTML Injection y XSS
Injection.
[-] Dichas vulnerabilidades pueden afectar también a
cualquier aplicación desarrollada con node.js si no se aplican los
filtros y validaciones adecuadas sobre la aplicación web.
13. Directory transversal
[-] Los módulo “fs” y “path” en nodejs permiten operar con el
sistema de ficheros del sistema.
[-] El uso inadecuado de dichas funciones, junto a una
incorrecta o inexistente validación de datos de entrada, puede
representar una brecha de seguridad que le permitirá a un
atacante acceder a información sensible del sistema.
14. DoS por medio de expresiones regulares.
Regex DoS (ReDoS)
[-] Vulnerabilidad que afecta muy especialmente a rutinas en
node.js debido a su modo de funcionamiento (event loop).
[-] Las expresiones regulares aplicadas a las entradas
suministradas por los usuarios pueden desencadenar un
bloqueo del hilo de ejecución de node.js e interrumpir por
completo la actividad del servidor.
[-] Validar, validar, validar.
15. Serialización y transporte inseguro de
datos sensibles.
[-] Uso de canales de transporte inseguro para el envío de
información con datos sensibles.
[-] Uso inadecuado del módulo "node-serialize" a la hora de
deserializar objetos provenientes de fuentes desconocidas y/o
poco fiables.
16. Ejecución remota de código (RCE)
[-] En la medida de lo posible, no utilizar la función “eval” o
instrucciones similares.
setInterval(código, 1)
setTimeout(código, 1)
new Function(código)
eval(código) Donde “código” puede ser:
while(1); process.exit(); process.kill(process.pid);
[-] Validar absolutamente todos los parámetros
suministrados por parte del cliente y aplicar los filtros que
sean necesarios.
17. NodeGoat es una aplicación vulnerable por diseño,
desarrollada con node.js y disponible al público con el
fin de probar las principales vulnerabilidades que
afectan a las aplicaciones desarrolladas con node.js
NodeGoat by OWASP
NodeGoat by OWASP
18. Herramientas para la detección de
vulnerabilidades en node.js
[-] Retire.js: es una librería enfocada al descubrimiento de
componentes desactualizados y con vulnerabilidades
conocidas en aplicaciones con NodeJS, BackboneJS, Dojo,
AngularJS, entre otros.
[-] NPM: Herramienta que permite detectar el uso de
módulos desactualizados y con vulnerabilidades conocidas.
Utiliza Node Security Platform para realizar todas las
comprobaciones. npm --check
[-] NodeJSScan: Herramienta para el análisis estático de
código, búsqueda y descubrimiento de vulnerabilidades.