Seguridad Inyeccion de Codigo A Java
Seguridad Inyeccion de Codigo A Java
Director (a):
[Link] Jhon Velandia
CONTENIDO
Pág.
LISTA DE ILUSTRACIONES........................................................................................... VI
RESUMEN ....................................................................................................................... IX
ABSTRACT ...................................................................................................................... X
INTRODUCCIÓN .............................................................................................................14
1. GENERALIDADES ...................................................................................................17
1.1 ANTECEDENTES ............................................................................................. 17
1.2 PLANTEAMIENTO DEL PROBLEMA ................................................................ 18
1.2.1 Descripción del Problema .............................................................................. 18
1.2.2 Formulación del Problema ............................................................................. 18
1.3 OBJETIVOS ...................................................................................................... 19
1.3.1 Objetivo General ............................................................................................ 19
1.3.2 Objetivos Específicos ..................................................................................... 19
1.4 JUSTIFICACIÓN ............................................................................................... 19
1.5 DELIMITACIÓN ................................................................................................. 20
1.5.1 Espacio .......................................................................................................... 20
1.5.2 Tiempo ........................................................................................................... 20
1.5.3 Contenido ...................................................................................................... 20
1.5.4 Alcance .......................................................................................................... 20
1.6 MARCO REFERENCIAL ................................................................................... 21
1.6.1 Marco teórico ................................................................................................. 21
1.6.2 Marco Conceptual .......................................................................................... 25
1.7 METODOLOGÍA ................................................................................................ 32
1.7.1 Tipo de Estudio .............................................................................................. 32
9. CONCLUSIONES ...................................................................................................101
LISTA DE ILUSTRACIONES
Pág.
Ilustración 1: Cifrado SSL ................................................................................................ 23
Ilustración 2: Diagrama de casos de uso ......................................................................... 44
Ilustración 3: Diagrama de contexto ................................................................................. 45
Ilustración 4: Diagrama de despliegue ............................................................................. 46
Ilustración 5: Diagrama de componentes ......................................................................... 46
Ilustración 6: Diagrama de clases .................................................................................... 47
Ilustración 7 Interfaz PAIC ............................................................................................... 48
Ilustración 9: Despliegue implementaciones .................................................................... 88
Seguridad de JAX-RS frente a ataques por inyección de código VII
LISTA DE TABLAS
Pág.
Tabla 1: Selección según criterio de factibilidad de éxito ................................................. 34
Tabla 2: Resumen de resultados de la búsqueda de documentos ................................... 35
Tabla 3: Selección según criterio de documentación ....................................................... 36
Tabla 4: Selección según criterio de posicionamiento en OWASP ................................... 37
Tabla 5: Selección según criterio de probabilidad de ser explotado según la CWE ......... 37
Tabla 6: Selección de los algoritmos a implementar ........................................................ 38
Tabla 7: Librerías Persistencia......................................................................................... 65
Tabla 8: Librerías DAO .................................................................................................... 66
Tabla 9: librerias service rest ........................................................................................... 86
5. Tabla 10: Vulnerabilidades bajo el parámetro de productos afectados ..................... 90
Tabla 11: Vulnerabilidades bajo el parámetro de ubicación ............................................. 91
Tabla 12: Vulnerabilidades bajo el parámetro de causa ................................................... 92
Tabla 13: Vulnerabilidades bajo el parámetro de impacto ................................................ 93
Tabla 14: Nivel de vulnerabilidad bajo el parámetro de producto afectado ...................... 93
Tabla 15: Nivel de vulnerabilidad bajo el parámetro de ubicación .................................... 94
Tabla 16: Nivel de vulnerabilidad bajo el parámetro de causa ......................................... 95
Tabla 17: Nivel de vulnerabilidad bajo el parámetro de impacto ...................................... 96
Tabla 18: Nivel de vulnerabilidad final.............................................................................. 97
VIII Título de la tesis o trabajo de investigación
Inicialmente se realiza una introducción a los servicios RESTful con JAX-RS, se definen
sus principales características y algunas implementaciones usadas en la industria, las
utilidades de seguridad que define ORACLE y un contexto de seguridad de los servicios
RESTful en general, posteriormente se describen los algoritmos de ataque por inyección
de código definidos por OWASP[1].
Por último se define una sección de evaluación de resultados, en la que se indican los
niveles de vulnerabilidad encontrados en cada una de las implementaciones
seleccionadas, frente a los tres tipos de ataque por inyección de código realizados por el
prototipo desarrollado, se finaliza con un análisis de los resultados encontrados y algunas
conclusiones de la investigación.
X Título de la tesis o trabajo de investigación
ABSTRACT
RESTful services are immersed in daily activities like using an app to make payments or to
renew a subscription to a magazine through Internet. For this reason it is really important
for those services to be safe before cyber-attacks. According to the OWASP Project (Open
Web Application Security Project), which has a top ten web applications main threats, it
underlines firstly the code injection attacks.
The Java business edition includes the specification for the API JAX-RS, which gives
utilities to implement RESTful services throughout annotations. This project has the
objective to develop a prototype that makes code injection attacks to RESTful services
developed in four JAX-RS implementations, with the purpose of measuring their
vulnerability before this kind of attacks.
Initially an introduction with JAX-RS to the RESTful services is done. Then it is defined
their main characteristics and some implementations used in the industry, the safety
utilities defined by ORACLE and a security context of the RESTful services in general.
Afterwards the attack algorithms by code injection defined by OWASP are described.
This project implements three algorithms from those described in the document. To select
them, it is used a quantitative method based on four criterions here proposed. Taking into
account the algorithms to implement, the requirements to design and develop the
prototype are described. Besides, it is described the architecture and the development of
the application and the test scenarios where it can be found the RESTful services to be
attacked.
Abreviatura Término
Abreviatura Término
A
algoritmos
Conjunto ordenado de operaciones sistemáticas que permite hacer un cálculo y hallar la solución de un tipo de
problemas, X
anotaciones
Las anotaciones son observaciones, notas, explciaciones u otros tipos de comentarios externos que pueden
adjuntarse a un documento Web o an una parte de un documento., 20
arquitectura
Técnica y estilo con los que se diseña, proyecta y construye, 20
Autenticación
Procedimiento informático que permite asegurar que un usuario de un sitio web u otro servicio similar es auténtico o
quien dice ser, 30
C
certificados
El certificado es un tipo de texto administrativo empleado para constatar un determinado hecho., 25
computación
12 Seguridad de JAX-RS frente a ataques por inyección de código
E
evaluación
Atribución o determinación del valor de algo, X
H
herramientas
Conjunto de instrumentos que se utilizan para desempeñar un oficio o un trabajo determinado, 19
I
implementación
Poner en funcionamiento o llevar a cabo una cosa determinada, 23
Internet
Red informática de nivel mundial que utiliza la línea telefónica para transmitir la información, 25
O
OWASP
es un proyecto de código abierto dedicado a determinar y combatir las causas que hacen que el software sea
inseguro, X
P
parámetros
Los parámetros son medidas descriptivas de toda una población que se utilizan como las entradas para una función
de distribución de probabilidad (PDF) con el fin de generar curvas de distribución., 23
pentest
Es un ataque a un sistema informático con la intención de encontrar las debilidades de seguridad y todo lo que podría
tener acceso a ella, su funcionalidad y datos., 19
protocolo
Conjunto de reglas de formalidad que rigen los actos y ceremonias diplomáticos y oficiales, 20
proxy
Es un ordenador intermedio que se usa en la comunicación de otros dos, 19
pruebas
Seguridad de JAX-RS frente a ataques por inyección de código 13
Acción de probar a alguien o algo para conocer sus cualidades, verificar su eficacia, saber cómo funciona o reacciona,
o qué resultado produce, 19
S
seguridad
Sensación de total confianza que se tiene en algo, X
servidor
Que está al servicio de algo o de alguien, 19
software
Conjunto de programas y rutinas que permiten a la computadora realizar determinadas tareas, 27
T
tecnologías
Conjunto de instrumentos, recursos técnicos o procedimientos empleados en un determinado campo o sector, 23
V
vulnerabilidad
Es algo que esta en contra de una ley o norma, X
W
Web
Conjunto de información que se encuentra en una dirección determinada de internet, 13
14 Seguridad de JAX-RS frente a ataques por inyección de código
INTRODUCCIÓN
La computación distribuida ha traído consigo avances significativos en el mundo del
software y la comunicación en red, ya que desde la creación y desarrollo del lenguaje de
etiquetado de la Web HTML se vienen generando estándares y tecnologías
subsecuentes, cada una basada en la anterior y reforzando los baches que presentaba su
antecesora, o simplemente tomando lo mejor de cada una para llegar a los grandes
avances de la Web actual[2].
Aunque en un inicio no se pensaba que estas tecnologías llegarían a converger en la
World Wide Web y en la gran cantidad de aplicaciones distribuidas que existen hoy en día
ya se planteaban soluciones a problemas específicos, como por ejemplo que dos
aplicaciones puedan compartir datos y recursos, para esto las primeras técnicas
desarrolladas solucionaban en cierta medida este problema, entre estos se encuentran
CORBA y DCOM, Middleware[3] que permitían comunicar aplicaciones y datos
distribuidos aunque con la limitación de que el lenguaje de desarrollo debe ser el mismo
en ambos nodos, además de que dichos nodos deben estar configurados para soportar
estas tecnologías, algunas de las limitaciones que estos presentaban se solucionaron con
otras tecnologías como RMI de Java, que expone objetos que se pueden manipular de
forma remota, logrando así minimizar tiempos de desarrollo y respuesta al usuario final,
pero aun así no resuelve los problemas de fondo (Condicionamiento a plataforma y a
tecnologías especificas).
Es en la década del 90 cuando se reconocen las grandes ventajas que tiene la World
Wide Web para el desarrollo de la computación distribuida y ubicua[3], es entonces
cuando se idean los Web Services, que no son más que servicios que se pueden
consumir por medio de las tecnologías y estándares de Internet, inicialmente se
establecieron algunas definiciones restrictivas de los servicios Web, entre esas la que
indica que un servicio debe basarse en un documento WSDL (Web Service Definition
Languaje)(Barry & Associates, 2000).
El documento WSDL es la base de la especificación del protocolo de servicios SOAP, que
usa XML para compartir datos entre aplicaciones, esta arquitectura difiere de las
tecnologías mencionadas anteriormente como RMI o CORBA, en que como su nombre lo
indica, estas son tecnologías (desarrolladas e implementadas por una empresa o
Seguridad de JAX-RS frente a ataques por inyección de código 15
persona) por tanto generan restricciones inherentes a los medios y técnicas de desarrollo
utilizados en estas; mientras que SOAP es un protocolo, no enteramente de definición
como HTTP pero si independiente de la tecnología e infraestructura que se utilice para su
implementación[3].
SOAP hace uso de los metadatos para publicar servicios a sus clientes, estos descritos
mediante el lenguaje extensible de marcado XML, que puede ser interpretado
independiente de la plataforma y lenguaje de la aplicación, tiene una estructura definida
por la W3C por medio de la cual se generan, envían y reciben mensajes entre
aplicaciones en la red. Este nuevo estándar trajo consigo una multitud de expectativas
con respecto a la orientación a servicios (Arquitectura SOA) como el logro definitivo del
internet de las cosas y la computación Ubicua, sin embargo estas no fueron satisfechas
en la medida que se esperaba, según conocedores y expertos debido a la complejidad
que presenta su implementación, además de la falta de conocimiento y correcto enfoque
por parte de quienes implementas este tipo de sistemas[4].
Es por esto que en el año 2000, en una tesis doctoral, Roy Fielding propone una nueva e
innovadora forma de implementar servicios Web, la Transferencia de Estado
Representacional REST, que básicamente es usar la arquitectura de la Web para
compartir datos y recursos; aunque REST no es una tecnología ni un protocolo es una
solución efectiva, al ser una arquitectura (que va de la mano con SOA pero no deben
confundirse) es totalmente independiente de cualquier tecnología y plataforma, que
combina las ventajas de la comunicación mediante XML con la simplicidad de las
transacciones HTTP[5].
REST se basa en los estándares de la World Wide Web para generar servicios Web, en el
famoso principio de no reinventar la rueda, según Fielding no debemos buscar métodos
de comunicación y procesamiento de transacciones nuevos, ya que el protocolo HTTP los
tiene completamente definidos; son estos verbos (GET, POST, PUT, DELETE) los que
nos permiten llevar a cabo cualquier procesamiento sobre un recurso. Para REST todo es
un recurso, que puede identificarse y accederse por medio de su URI (Identificador de
recursos uniforme) por tanto estos pueden manipularse por medio de las operaciones
anteriormente mencionadas.
16 Seguridad de JAX-RS frente a ataques por inyección de código
1. GENERALIDADES
Para desarrollar un prototipo que cumpla con el objetivo de este proyecto se deben tener
claros los conceptos que impactarán en él, es por esto que en los siguientes puntos se
abordarán todos los temas referentes a los conceptos introductorios y teóricos, con el fin
de tener un contexto de trabajo amplio y una base sólida para esta investigación. Además
de ser una ayuda al lector que no tenga conocimientos a fondo sobre estos temas.
1.1 ANTECEDENTES
Las pruebas de penetración o “pentest” son ataques a sistemas informáticos con la
intención de encontrar vulnerabilidades de seguridad que puedan ser usadas por entes
internos o externos para tener acceso al sistema y/o afectarlo deliberadamente. Estas han
sido mejoradas a lo largo de los años, ya que la seguridad informática siempre ha sido
uno de los principales objetivos de los gobiernos y organizaciones tecnológicas[7].
En junio de 1965, se celebró una conferencia sobre seguridad informática, organizada por
un contratista del gobierno de [Link]. Durante la conferencia, se encontró que un
empleado había evadido las protecciones de acceso a un importante sistema, los
asistentes pidieron que se realizaran estudios sobre como romper la seguridad en
sistemas informáticos, se puede decir que los participantes de la conferencia realizaron
una de las primeras peticiones formales para usar pentest para el estudio de la
seguridad[8].
Actualmente no solo existen procesos y estándares para realizar pruebas de penetración
sino además herramientas de software que permiten automatizar estos procesos, realizan
ataques en tiempo real y dan la posibilidad de encontrar fallas y vulnerabilidades de
acuerdo a los resultados de dichos ataques. Una herramienta de este tipo es la aplicación
desarrollada por OWASP[1] llamada ZAP por sus siglas en inglés “Zed Attack Proxy”[9].
Es un escáner de código abierto que está desarrollado para ser utilizado tanto por novatos
como por profesionales de seguridad informática, para realizar pruebas de penetración.
Cuando se utiliza como un servidor proxy permite al usuario manipular todo el tráfico que
pasa a través de él, incluyendo el tráfico mediante HTTPS. También puede funcionar en
un modo de 'demonio', que está controlado por medio de una interfaz REST, es
multiplataforma, está escrito en Java y está disponible en los principales sistemas
operativos, incluyendo Microsoft Windows, Linux y Mac OS X[9].
Así como ZAP, existen otras herramientas de penetración o “pentesting tools” que varían
en funcionalidades y objetivos, desde ataques específicos hasta control de flujo de datos
en las redes analizadas, algunas de estas son: SqlMap[10], AMNESIA[11] y SQLrand[12].
18 Seguridad de JAX-RS frente a ataques por inyección de código
1.3 OBJETIVOS
1.4 JUSTIFICACIÓN
Las preguntas que se pueden realizar entonces son ¿proveen estos framework utilidades
de seguridad para los servicios RESTful? y ¿Qué tan vulnerables son los servicios
desarrollados con estos framework? Para responder a estas preguntas es importante
realizar un análisis de seguridad sobre algunas de las implementaciones que son usadas
actualmente en la industria, con el fin de encontrar las vulnerabilidades que estos puedan
tener.
Con esta investigación se buscan resultados útiles no solo para la industria sino también
para comunidad académica y científica, puesto que en este punto del desarrollo
20 Seguridad de JAX-RS frente a ataques por inyección de código
1.5 DELIMITACIÓN
1.5.1 Espacio
El prototipo desarrollado puede ser usado en cualquier servicio RESTful desarrollado en
alguna de las cuatro implementaciones de JAX-RS definidas en este proyecto.
1.5.2 Tiempo
La entrega final del prototipo y del documento del proyecto que se definió es el día lunes
24 de Octubre del 2016, la cual contará con los elementos descritos en el siguiente punto.
1.5.3 Contenido
El proyecto está conformado por una aplicación prototipo denominada PAIC en
funcionamiento, los servicios RESTful de prueba, desarrollados en las cuatro
implementaciones definidas y el documento con las especificaciones tanto del prototipo
como de las técnicas de ataque y los resultados obtenidos.
1.5.4 Alcance
Este proyecto define el principio y funcionamiento del estilo de arquitectura REST. En este
caso el proyecto se centra en la implementación de algoritmos de inyección de código,
para demostrar la confiabilidad, fiabilidad y vulnerabilidad que presenta la API JAX-RS,
esto incluye:
JAX-RS
Es una API del lenguaje Java que proporciona soporte para la creación de servicios Web
basados en el estilo arquitectónico REST [16]. Esta usa anotaciones para simplificar el
despliegue de los clientes, estas ayudan a mapear una clase recurso (POJO) como un
recurso en la Web, algunas de estas son:
Además de otras anotaciones para los parámetros de los métodos, para extraer
información de la solicitud [14].
Apache CXF: Es un marco de servicios web de código abierto fácil de usar, estructurado
por un modelo de programación basado en estándares para el desarrollo de servicios
web. Estos servicios web pueden ser implementados por protocolos como XML,JSON y
HTTP [17].
Restlet: Es una API que nos permite implementar los Servlets de Java siguiendo el estilo
REST. La principal ventaja de Restlets es que permite programar Servicios Web de
carácter general, no está diseñado para un Servicio en particular ejemplo como ocurre
con las API de Amazon o eBay [19].
Restlet: Es un marco de referencia que lleva el concepto de servlet para generar servicios
web. Restlet hace simple el desarrollo de web services[6].
Jersey: Es un marco de referencia que ofrece su propia API la cual extienden el conjunto
de herramientas JAX-RS con las características y utilidades adicionales para simplificar
aún más el servicio REST y desarrollo de clientes[14].
servicios pueden hablar una gran variedad de protocolos como SOAP, XML/HTTP, HTTP
RESTful, o CORBA, y pueden trabajar sobre transportes como HTTP, JMS o JBI[14].
SSL es un protocolo criptográfico para comunicaciones seguras por una red, comúnmente
Internet, se basa en el intercambio de registros, estos poseen un campo que especifica el
protocolo que se está usando; cuando se inicia la conexión el cliente envía un mensaje
ClientHello especificando la versión del protocolo SSL, además puede incluir el
identificador de la sesión. Después, recibe un registro ServerHello, en el que el servidor
elige los parámetros de conexión. Cuando los parámetros de la conexión son conocidos,
cliente y servidor ellos intercambian certificados dependiendo de las claves públicas de
cifrado seleccionadas. Cliente y servidor negocian una clave secreta simétrica cifrando
una clave secreta con una clave pública que es descifrada con la clave privada de cada
uno (Ver Ilustración 1: Cifrado SSL). Para el intercambio de claves existen una serie de
algoritmos, entre estos se encuentra RSA [21].
RSA es un algoritmo asimétrico cifrado de bloques, que utiliza una clave pública, la cual
se distribuye (en forma autenticada preferentemente), y otra privada, la cual es guardada
en secreto por su propietario [21].
Utilizando las mismas herramientas que se utiliza para crear servicios REST se realizan
definiciones y se añaden restricciones de seguridad. Las restricciones se configuran en el
descriptor de despliegue Web[14].
Los recursos se protegen a través de JAX-RS API Java para servicios Web RESTful
utilizando anotaciones que especifiquen valores de seguridad. Se Utilizan las siguientes
anotaciones para añadir autorización a los recursos de la aplicación JAX-RS [22]:
@PermitAll: especifica que se permite a todos los roles de seguridad acceder a los
recursos JAX-RS
@DenyAll: especifica que no se permite a ningún rol de seguridad acceder a los
recursos JAX-RS
@RolesAllowed: especifica los roles de seguridad a los que se permite acceder a
los recursos JAX-RS
Elegir anotaciones a nivel de clase o a nivel de método. Las anotaciones en el nivel de
método tienen prioridad sobre las anotaciones en el nivel de clase.
Significa que cada recurso sólo se rige como máximo por una de las anotaciones de
seguridad. El ejemplo siguiente no es válido porque se especifica tanto @PermitAll como
@RolesAllowed. De acuerdo al Código fuente N° 2: Exclusión de Anotaciones de
seguridad en JAX-RS, la anotación @RolesAllowed tiene prioridad y la anotación
@PermitAll se ignora. Tal como si se utiliza tanto la anotación @RolesAllowed como la
anotación @DenyAll, la anotación @DenyAll tiene prioridad.
1. @DenyAll
2. @RolesAllowed
3. @PermitAll
¿Y QUE ES RESTFUL?
La Web está basada en varios de los principios de REST, por tanto se ha llegado a la
idea, en la comunidad de desarrollo de REST que se debe hacer una distinción de todos
los recursos basados en HTTP-XML de los servicios REST, dándoles a los últimos el
nombre RESTful, es decir son todos aquellos que cumplen fielmente los principios y
estándares presentados por Fielding, en conclusión no es más que un concepto que
cobija a todos los servicios Web que siguen al pie de la letra los fundamentos de la
arquitectura REST [23].
Las URI deben mantener la estructura de los recursos que representa, generalmente en
una estructura de árbol, que es la que usan los directorios de los Sistemas Operativos, así
es posible tener raíces de las cuales se desprendan los recursos como hojas del árbol, un
ejemplo bastante familiar puede ser el path del explorador de archivos de Windows, en el
que podemos recorrer las carpetas y ver la estructura descendiente que estas manejan.
Las URI de los servicios web REST deben ser intuitivas, hasta el punto de que sean
fáciles de adivinar. Podemos ver una URI como una interfaz auto-descriptiva que necesita
de muy poca o ninguna referencia para que un desarrollador pueda comprender a lo que
apunta, y a los recursos derivados relacionados [15].
La representación de un recurso se puede ver como una foto del recurso en el momento
que se solicita dicha representación, refleja el valor actual del recurso. Este valor se
puede representar por medio de etiquetas XML o por medio de cadenas atributo-valor en
formato JSON, esto es básicamente lo que el servicio REST le comunica al cliente.
Esto permite que el servicio sea utilizado por distintos clientes escritos en diferentes
lenguajes, corriendo en distintas plataformas y equipos. El uso de los tipos MIME y del
encabezado HTTP Accept es un mecanismo conocido como negociación de contenido, el
cual le permite a los clientes elegir qué formato de datos puedan leer, y por tanto
mantiene bajo acoplamiento de datos entre el servicio y las aplicaciones que lo consumen
[15].
La forma básica de este defecto consiste en la inyección de los datos de control de plano
en el plano de datos con el fin de alterar el flujo de control del proceso.
Consecuencias:
1. Inyección XPATH:
Los ataques de inyección XPATH ocurren cuando una aplicación Web utiliza la
información que ingresa el usuario para construir una consulta XPATH para datos XML.
Un atacante puede descubrir cómo están conformados los datos XML de una aplicación
Web con el envío de sentencias formadas para tal fin, puede llegar a acceder a todos los
datos de la misma. En algunos casos el atacante puede aumentar los privilegios en la
aplicación Web si los datos se usan para la autenticación, como un archivo de usuario
basado en XML[27].
2. Inyección SQL:
Una inyección SQL se basa en insertar, como su nombre lo indica, código SQL dentro del
código ya programado en la aplicación Web, con el fin de modificar el funcionamiento
normal de esta y lograr que se ejecute en la base de datos el fragmento de código
incrustado. Normalmente este tipo de ataque es realizado con sencillas técnicas como
escapar caracteres y generando condiciones que siempre son verdaderas[28].
3. Inyección LDAP:
4. Inyección de comandos
5. Inyección JavaScript
Estas inyecciones son procesos en los cuales se pueden insertar y usar los propios
códigos JavaScript en una aplicación Web, ya sea introduciendo el código en la barra de
direcciones, o encontrando la vulnerabilidad XSS en la aplicación Web. Mediante el
lenguaje Javascript se pueden dar órdenes a una aplicación Web sin que el administrador
lo autorice para provocar daños en la aplicación, acceder a información confidencial o
tomar el control total de este[31]. Es importante aclarar que mediante ataques por
inyección de JavaScript se puede realizar un tipo de ataque derivado de este conocido
como DOM injection, o inyección de etiquetas HTML con el fin de modificar la estructura
del mismo.
6. Inyección SMTP
El Simple Mail Transfer Protocol o protocolo para transferencia simple de correo, es como
su nombre lo indica un protocolo de red utilizado para el intercambio de mensajes de
correo electrónico entre dispositivos, fue definido en el RFC 2821 y es un estándar oficial
de Internet. Una sesión SMTP consiste en comandos enviados por un cliente SMTP y las
respuestas correspondientes del SMTP del servidor para que la sesión se abra y se
intercambian los parámetros de la sesión, una sesión puede incluir cero o más
transacciones SMTP. Una transacción de SMTP se compone de tres secuencias de
comando/respuesta: MAIL, RCPT, DATA [32]. Es por medio de estos comandos que se
logra realizar el ataque, un ejemplo de inyección de comandos SMTP es:
7. Inyección HQL
Hibernate Query Language por sus siglas en inglés es una derivación de SQL que
implementa el Framework ORM Hibernate para la capa de persistencia en aplicaciones
Java, si una aplicación confía ciegamente en el framework utilizado puede resultar en
consultas que aún son vulnerables. Un pequeño ejemplo de un ataque de este tipo lo
podemos ver en el siguiente código[1]:
8. Inyección JSON
Al igual que con los ataques por inyección XPATH, los cuales inyectan código XML para
acceder a recursos de datos, también se pueden realizar inyecciones de código en
Seguridad de JAX-RS frente a ataques por inyección de código 31
formato JSON JavaScript Object Notation, con el fin de vulnerar aplicaciones que usan
tanto intercambio de mensajes como recursos de datos basados en este estándar. Un
ejemplo de un recurso de datos implementado en formato JSON es el motor de bases de
datos no relacionales MongoBD, el cual se basa en colecciones de documentos en este
formato[26].
CSS: Es un lenguaje de Diseño Web que permite crear una página web más interactiva y
más exacta para la visualización del usuario final, CSS es el acrónimo de “Cascading
Style Sheets” que significa Hojas de estilo en cascada, este lenguaje puede estar definido
dentro de la página HTML pero para buenas practicas es mejor implementarlo en un
archivo externo [34]. En la Código fuente N° 18: Estructura CSS se podrá encontrar una
porción del código que da el estilo a la página HTML.
1.7 METODOLOGÍA
Esta es la sección del documento que detalla el proceso mediante el cual se realizará la
implementación del sistema y las pruebas de seguridad que son claves para llegar a las
conclusiones objetivo de este proyecto.
2. SELECCIÓN DE ALGORITMOS
La selección de los algoritmos que finalmente se desarrollarán en la aplicación Web se
realizará de acuerdo a cuatro criterios que son claves para determinar la factibilidad de
implementación. La metodología para la selección de los algoritmos que se
implementarán está basada en un método cuantitativo, en el que se asignará un peso
numérico de 1 a 25, donde 1 representa el menor y 25 el mayor peso, por último se
sumará los pesos de cada fila y se seleccionarán los 3 algoritmos con mayor peso y por
tanto más probables de ser implementados.
Factibilidad de éxito
Documentación
Posicionamiento OWASP
Probabilidad de ser explotado según la CWE
Estos criterios fueron seleccionados con base en las necesidades puntuales de este
proyecto, que son el desarrollo del prototipo de ataques y la ejecución en cuatro librerías
de JAX-RS, especificación usada en el desarrollo de servicios RESTful en aplicaciones
Java. La magnitud de los pesos se define a continuación para cada uno de los criterios en
particular.
Para definir los pesos que tendrán los algoritmos de acuerdo a este criterio se tendrán en
cuenta la cantidad de mecanismos de protección que se definen para cada uno de estos
en las secciones de mitigación que ofrece la CWE para cada vulnerabilidad, esta
información está disponible en su sitio oficial y es fuente primaria de información de
prevención de ataques en empresas que manejan información confidencial importante
como EFT. Esto indica que algunos algoritmos de ataque tienen más técnicas de defensa
34 Seguridad de JAX-RS frente a ataques por inyección de código
en su contra y por tanto son menos factibles de ser exitosos que otros que tengan pocas o
ninguna.
De acuerdo a este método, se asignará un valor de 25 al algoritmo que cuente con menor
número de técnicas de mitigación en la sección de la CWE en la que se indican estas,
siendo este el que tenga el peso más alto, posteriormente se restarán 3 puntos por cada
técnica de defensa que supere este número inicial, la fórmula de selección es la siguiente:
N° de técnicas de
Técnica de ataque Peso
mitigación según la CWE
Inyección XPATH 4 16
Inyección de comandos SO 5 13
Inyección SQL 8 4
Inyección Script 5 13
Inyección LDAP 2 22
Inyección SMTP 1 25
Inyección HQL 1 25
Inyección JSON 1 25
2.2. DOCUMENTACIÓN
Es de vital importancia contar con la información necesaria para implementar los
algoritmos de ataque en el prototipo, ya que estas técnicas han sido utilizadas por alguien
más y no es objetivo de este proyecto desarrollar una nueva técnica sino implementar una
existente, por tanto se definió este criterio de acuerdo a una recolección y análisis de
información indexada sobre dichas implementaciones.
N° N°
N° Docs N°
Algoritmo Docs Docs
ELSEVIER Total
IEEE ACM
Inyección SQL 14 13 3 30
Inyección XPATH 10 5 0 15
Inyección de comandos SO 10 6 0 16
Inyección Script 9 8 3 20
Inyección LDAP 3 1 0 4
Inyección HQL 0 0 0 0
Inyección JSON 1 0 0 1
Inyección SMTP 0 1 0 1
14
12
10
8
6
4
2
0
Como punto de partida, se asignará un valor de 25 para el algoritmo con mayor cantidad
de documentos indexados encontrados, dicha cantidad será el 100% correspondiente a
esos 25 puntos, a los demás se les asignará un porcentaje sobre ese número de
documentos, de acuerdo la cantidad que se encuentren de cada uno de ellos. Por ejemplo
si de un algoritmo se encuentran 100 documentos y ese es el mayor número, a este le
corresponderá el 100%, otro algoritmo del que se encuentren 70 documentos le
36 Seguridad de JAX-RS frente a ataques por inyección de código
N°
Técnica de ataque Porcentaje Peso
Documentos
Inyección SQL 30 100% 25
Inyección XPATH 15 50% 13
Inyección de comandos SO 16 53% 13
Inyección Script 20 67% 17
Inyección LDAP 4 13% 3
Inyección HQL 0 0% 0
Inyección JSON 1 3% 1
Inyección SMTP 1 3% 1
De igual forma que la selección del algoritmo frente al criterio de factibilidad de éxito, se
asignará el valor de 25 a la técnica que ocupe el primer lugar en el posicionamiento de
OWASP y se restarán 3 a la siguiente hasta la última posición:
Los niveles que ofrece la CWE son: Bajo, Medio, Alto y Muy alto respectivamente; para
realizar la selección se usará la misma técnica de selección frente al criterio de
documentación, asignando un número para cada nivel, respectivamente así: Bajo = 1,
Medio = 2, Alto = 3 y Muy alto = 4; además de aproximar el valor al entero más próximo.
Inyección SQL
Inyección XPATH
Inyección de comandos
2.5. VALIDACION
En esta sección se describe el uso de la herramienta Vantage Point, este software cuenta
con la capacidad de acceder a cada documento completamente a través de sus términos,
los cuales son tratados como datos que aportan información relevante para los
investigadores de un tema en específico.
Algoritmo
Autores
Título de documento
Fecha
Fuente
Repositorio de descarga
Al realizar la búsqueda de las tres primeras bases de datos indexadas encontramos las
referenciadas en la Illustration Vantage Point 4 Data base documents.
Con el fin de tener la información actualizada, se usó como criterio de búsqueda el año de
publicación de dicho documento, teniendo en cuenta los resultados de la Illustration
Vantage Point 6 Data documents, se tomaron como referencia los documentos
correspondientes a los años, 2014,2015 y 2016
3. DEFINICIÓN DE REQUISITOS
En esta sección se definirán los requisitos que serán la base para el diseño e
implementación de la aplicación que proporcione diversas funcionalidades para realizar
ataques a servicios Web implementados en JAX-RS de acuerdo a los algoritmos
seleccionados, con el fin de realizar un análisis de vulnerabilidades de estos servicios. La
aplicación debe realizar ataques por inyección código y proporcionar resultados de la
detección de las vulnerabilidades existentes en los servicios Web implementados en JAX-
RS y desplegados en estos servidores, que se identifiquen en estos ataques.
4.1 ACTORES
Con base en la definición de requisitos se identifica un único actor en la aplicación, que
podría ser el desarrollador del servicio o un profesional de seguridad informática que
tenga acceso a los servicios Web.
Request POST: El
El método GET implementa el Código fuente N° 6: Attack GET, el cual usa el método
shellAtack de la clase AlgoritmAttack que contiene la inyección de comandos de SO para
ejecutar en el Web Service.
El objeto attack es una instancia de la clase AlgoritmAttack, esta clase contiene los métodos
de inyección de parámetros de las peticiones para realizar el ataque, el
El Código fuente N° 10: SQL Attack será el encargado de inyectar una sentencia SQL que
rompa la cadena de inserción en una tabla y concatena la sentencia delete from table con
el fin de eliminar los registros de una tabla, adicionalmente insertara un registro que para
ambiente de pruebas ratificara que el ataque fue exitoso.
Este ataque se implementó con el fin de afectar el principio de integridad definido por la
seguridad informática, el cual indica que los datos se deben de mantener libres de
modificaciones no autorizadas.
El Código fuente N° 11: Shell Attack será el encargado de concatenar la codificación del
carácter %20% que es un espacio en blanco y el carácter %7C que es el símbolo pipe |
seguido a esto el comando start combinado con el servicio iexplore, la ejecución de esta
sentencia tiene como finalidad iniciar el servicio de internet explorer 5 veces por cada
solicitud, ese es un servicio que consume un amplio recurso de memoria que ejecutado
múltiples veces colapsara el servidor generando denegación del servicio.
6.3. CLIENTE
Este prototipo está completamente escrito en lenguaje de programación Java, el
desarrollo fue elaborado bajo Java Platform 7 y codificado con el IDE eclipse. Como ya se
mencionó anteriormente se utilizó Swing para el desarrollo de la interfaz de usuario.
En el ¡Error! No se encuentra el origen de la referencia. se describe secuencialmente el orden de las actividades ejecutadas
y los algoritmos inyectados, con el fin de afectar la integridad y autenticidad del REST Service.
58 Seguridad de JAX-RS frente a ataques por inyección de código
En el Flujo 2 Request GET se describe secuencialmente el orden de las actividades ejecutadas y el algoritmo inyectado, con el
fin de afectar la disponibilidad del REST Service.
7. ESCENARIO DE PRUEBAS
En esta sección se define el escenario de aplicación del prototipo PAIC (Prototipo de
Ataque por Inyección de Código) teniendo en cuenta que se deben de cumplir los
siguientes objetivos:
El entorno en que se desarrollan las pruebas está compuesto por un equipo personal
donde se ejecuta el prototipo de ataque y una plataforma de servicios de nube como
Amazon Web Services. Esta plataforma de servicios ofrece potencia de cómputo,
almacenamiento de bases de datos, entrega de contenido y otra funcionalidad para
ayudar a las empresas a escalar y crecer. Se usa esta plataforma debido a que se basa
en la esencia de REST. Posee una base de datos con todos los detalles de los productos
que vende. Cuando un usuario quiere realizar una búsqueda o acceder a la información
de determinados productos en particular, accede directamente a los recursos solicitados y
no a métodos remotos[39][19].
aprovecha esta ventaja y se hace uso de Windows Server 2012 como sistema operativo,
esto debido a que es un software comercial que soporta amplias estructuras de escritorios
virtuales lo cual trae beneficios como la centralización que aloja los entornos de escritorio
como sistema operativo, aplicaciones y datos de los usuarios en servidores remotos, esto
limita las arduos recursos como espacio, desplazamiento, personal técnico entre otros
[41].
Se desarrollan cuatro Web Services los cuales presentan la misma interfaz gráfica y usan
las anotaciones propias de JAX-RS, este es un marco de referencia que tiene como
objetivo declarar un Servicio Web a través de simples anotaciones propias de este
framework usando mapeo de objetos creados en Java implementado el protocolo HTTP
[42]. Cada servicio se desarrolla con base en de cada una de las implementaciones
definidas en el apartado [Link]. Implementaciones de JAX-RS.
En la
64 Seguridad de JAX-RS frente a ataques
Código fuente N° 12: Modelo XML se define la estructura que tiene el archivo de
autenticación de usuarios compuesto por: nombre, apellido, nombre de usuario,
contraseña y tipo de usuario creado. También se utilizará una base de datos para
almacenar registros de la IP y navegador desde donde ingresaron a la plataforma.
.
Seguridad de JAX-RS frente a ataques por inyección de código
Método Descripción
Entity Se usa para indicar que esta clase es una entidad
Id Se usa para especificar un atributo como clave primaria
Para el acceso a datos se establece una clase externa que define como se almacenan los
datos y como tener acceso a los mismos. Primero se definen dos variables estáticas una
llamada emf la cual es de tipo EntityManagerFactory quien se encarga de gestionar todas
las entidades, la otra variable se define como em de tipo EntityManager quien es el
encargado de gestionar el un grupo de entidades.
Las variables se declaran estáticas con el fin de instanciarlas una sola vez, esto se debe a
que cada vez que se instancie un EntityManager será cargado un contexto diferente, si
esto no es controlado cada contexto generara una sobrecarga en la memoria del
dispositivo.
Método Descripción
para guardar esta información en un log de auditoria. Otro método usa el método GET
para tomar los datos que viajan a través de la URL para realizar la prueba de
comunicación usando [Link].
En todas las aplicaciones se desarrolla una clase principal que contiene un método
público, el cual retornara un String cuyo parámetro es una cadena de texto que contiene
el nombre del host.
El inicio del método contiene el método la anotación @GET la cual indica que solo recibe
parámetros inyectados a través de la URL, la segunda línea de código usa la anotación
@Path(“”) cuyos parámetros de filtro es aceptar todo lo que venga por GET y que la ruta
finalice con la combinación de caracteres definida en la anotación @Path(“”) separada por
el símbolo ‘/’ concatenada con la secuencia de caracteres que conformaran la IP o
nombre del Host a comunicar, la tercera línea de código es @Produces la cual indica que
tipo de formato de archivo retorna, en este caso será texto plano. Dentro del método se
usa la anotación @PathParam(“host”) para las implementaciones de Jersey y RESTEasy
ya que en Restlet no funciona este método y por ende se usa la función
getRequest().getAttributes().get() cuyo parámetro final es la posición de la variable
definida previamente anotación @PatParam. Estas funciones tienen la misma operación
su objetivo es tomar el fragmento de la URL que se encuentra en la posición definida en
la anotación @PatParam con el nombre del solicitante.
Estas librerías trabajan bajo el soporte de la versión HTTP 1.1 por ello se usa la palabra
reservada switch validando que en caso de ser 1 ejecute las operaciones, de lo contrario
retorne un mensaje indicando que la versión http no es soportada. Si la versión es
soportada se usara la palabra reservada try, catch cuya funcionalidad es ejecutar todo lo
que este dentro del try, en caso de que suceda un error de ejecución saltara
automáticamente al catch donde controlara el error sucedido dentro del try. Dentro del try
se ejecutara a través de [Link] el comando ping y se concatenara con la variable
inyectada en la posición de {host} definida en la anotación @Path al ejecutar ese comand
to se realizara la conversión de tipos de datos retornados para poder devolver el mensaje
a la aplicación del cliente que tomara los datos y los mostrara al usuario
Esta clase también se compone de un método público que retorna un String cuyos
parámetros son nombre de usuario y contraseña para realizar el login.
El inicio del método contiene la anotación @POST con la cual se define que solo acepta
peticiones que vengan por el verbo POST y codificadas con el formato “application/x-
www-form-urlencoded”, seguido de esto se define la siguiente línea con la anotación
@Path() la cual indica la ruta que debe de tener la petición para que el método sea
disparado, la tercera línea de código es @Produces la cual indica que tipo de formato de
archivo retorna, en este caso será texto plano.
Seguridad de JAX-RS frente a ataques por inyección de código
Dentro de la ejecución del método se usa la palabra reservada switch esto con el fin de
validar si existe o no soporte para la versión del protocolo HTTP. Si todas las validaciones
resultaron correctas se ejecutan las siguientes líneas de código. En la primera línea de
código se cargara el archivo XML donde se encuentran los datos de los usuarios
permitidos.
[Link](ipAddress,userAgent);
En la tercera línea llamamos un método para método obtener una nueva instancia de un
DocumentBuilderFactory del nombre de la clase.
En la cuarta línea llamamos un método para analizar el contenido del archivo en cuestión
como un documento XML y devuelve un nuevo objeto DOM de documentos.
En la quinta linea se instancia un objeto para poder seleccionar uno o más nodos de un
documento XML.
72 Seguridad de JAX-RS frente a ataques
En la séptima línea se evalúa la expresión retornando Falso o Verdadero según los datos
de entrada
[Link]. Jersey
Partimos con la configuración del Servlet en el archivo denominado como [Link] el cual
contiene la estructura definido en la Código fuente N° 21: [Link] Jersey.
Servidor por defecto al ingresar la IP del Host o el nombre de dominio seguido del nombre
de la aplicación
Jersey GET
La estructura del método GET se puede ver en Código fuente N° 22: Get Jersey
Jersey POST
La estructura del método POST se puede ver en Código fuente N° 23: Post Jersey 1 e
Código fuente N° 24: Post Jersey 2.
[Link]. RESTEasy
Partimos con la configuración del Servlet en el archivo denominado como [Link] el cual
contiene la estructura definido en la Código fuente N° 25: [Link] .
76 Seguridad de JAX-RS frente a ataques
RESTEasy GET
La estructura del método GET se puede ver en la Código fuente N° 26: Get .
RESTEasy POST
Código fuente N° 27: Post RESTEasy 1
La estructura del método POST se puede ver en la Código fuente N° 27: Post RESTEasy
1 e Código fuente N° 28: Post RESTEasy 2
[Link]. Restlet
Se inicia con la configuración del Servlet en el archivo denominado como [Link] el cual
contiene la estructura definido a continuación:
indicamos la clase del proyecto que tendrá configurada las rutas permitidas y las clases a
las cuales pertenece para consumir este servicio. Esta estructura se encuentra en la
Código fuente N° 30: Restlet Route Attach, en esta clase usamos la el método
[Link] el cual se usa para enlazar la ruta de una petición a una clase del proyecto
que es la que contendrá implementados los servicios a consumir.
Restlet GET
La estructura del método GET se puede ver en Código fuente N° 31: Get Restlet.
Restlet POST
La estructura del método POST se puede ver en la Código fuente N° 32: Post Restlet 1 y
la Código fuente N° 33: Post Restlet 2.
Método Descripción
[Link] Usado para crear la configuración en el servidor
[Link] Usado para iniciar la configuración del servidor
[Link] Se usa para crear los puntos finales del servido
Se para retornar la misma instancia de recursos
[Link]
para cada petición
CXF GET
CXF POST
La estructura del método POST se puede ver en la Código fuente N° 39: CXF POST 1 y la
Código fuente N° 40: CXF POST 2.
8. EVALUACIÓN DE VULNERABILIDADES
Las vulnerabilidades son el origen de los fallos de seguridad de una aplicación. Una
vulnerabilidad en una aplicación puede ser simplemente un error, un problema en su
código o en su configuración. Es probable que las aplicaciones contengan errores, puesto
que han sido creados por seres humanos, esto es especialmente frecuente en el caso de
las aplicaciones muy complejas, como por ejemplo los sistemas empresariales, ya que
tienden a contener errores de manera exponencial. La característica que convierte un
simple fallo en una vulnerabilidad es la posibilidad de que el abuso deliberado de este
defecto pudiera llevar a un riesgo de seguridad que comprometa el sistema sobre el que
se ejecuta esa aplicación.
8.1. VULNERABILIDADES
Una vulnerabilidad es un fallo específico en la seguridad de una aplicación, puesto que no
todos los errores de programación se convierten en fallos de seguridad. Un error en un
programa puede llevar a que este no funcione correctamente o que su comportamiento no
sea el esperado, pero no todos estos tipos de problemas pueden considerarse fallos de
seguridad. La vulnerabilidad puede ser más o menos grave dependiendo de la capacidad
de un atacante de aprovecharse de estos defectos [7].
Apache
Tipo de ataque Jersey RESTEasy Restlet
CXF
service service service service
SQL Injection component component component component
application application application application
service service service service
XPATH Injection component component component component
application application application application
service service service NA
component component component NA
Command Injection
application application application NA
server server server NA
Seguridad de JAX-RS frente a ataques por inyección de código
8.1.2. Ubicación
Una vulnerabilidad se localiza habitualmente en un componente o módulo del sistema,
debido a que, por lo general las aplicaciones se componen de varios módulos que se
comunican entre sí. Una vulnerabilidad puede encontrarse en un módulo concreto del
programa o en la configuración del entorno de despliegue, puede existir una
vulnerabilidad en un módulo de lectura de archivos PDF sin afectar a otro que procesa
otro tipo de archivos, o también si el fallo se encuentra en un componente intrínseco del
sistema, por ejemplo, puede ocurrir por si hay un fallo en el sistema operativo. Los
servicios RESTful JAX-RS también tienen componentes, ya sea una clase que
implemente el servicio o un componente de la implementación.
Bajo este parámetro se definieron como ubicaciones las diferentes partes que componen
el sistema, siendo estas los productos nombrados en el punto anterior.
Apache
Tipo de ataque Jersey RESTEasy Restlet
CXF
SQL Injection service service service service
XPATH Injection service service service service
Command Injection service service service NA
8.1.3. Causa
Este punto se refiere específicamente a los problemas ocasionados por componentes de
código de la aplicación, como se mencionó anteriormente a lo largo del documento, hay
técnicas de ataque basadas en errores de programación, ya sea que no se validen los
valores de una variable, los límites de la memoria, o que se olvide establecer permisos
adecuados a un recurso de datos, como también ataques basados en fallas de los
componentes externos o de la configuración del servidor. Las consecuencias de estos
fallos pueden ser de varios tipos, desde la caída del servicio por desbordamiento de
memoria hasta el acceso a información confidencial.
8.1.4. Impacto
Es lo que puede ocurrir al sistema en caso de que un atacante se aproveche de la
vulnerabilidad, por ejemplo, en el caso de que este logre realizar un acceso sin
autorización al sistema, se deben validar las acciones que este puede lograr allí, ya sea
robo de información confidencial o elevar permisos para realizar una modificación de la
información. El impacto puede ayudar a definir en gran medida la gravedad de la
vulnerabilidad. La ejecución de código por parte del atacante es grave, ya que el atacante
podrá podría realizar acciones sobre los componentes del sistema quedando esté en
manos de un extraño.
1. Integridad.
2. Confidencialidad.
3. Disponibilidad.
Seguridad de JAX-RS frente a ataques por inyección de código
8.2. RESULTADOS
De acuerdo a lo anterior, los niveles de vulnerabilidad encontrados para cada una de las
implementaciones frente los tres tipos de ataque definidos, bajo los diferentes parámetros
son:
Apache
Tipo de ataque Jersey RESTEasy Restlet
CXF
SQL Injection 75% 75% 75% 75%
XPATH Injection 75% 75% 75% 75%
Command Injection 100% 100% 100% 0%
94 Seguridad de JAX-RS frente a ataques
Restlet
Apache CXF
RESTEasy
Jersey
100%
80%
60%
40% Command Injection
20% XPATH Injection
SQL Injection
0%
Jersey RESTEasy Apache Restlet
CXF
8.2.2. Ubicación
Tabla 15: Nivel de vulnerabilidad bajo el parámetro de ubicación
Apache
Tipo de ataque Jersey RESTEasy Restlet
CXF
SQL Injection 25% 25% 25% 25%
XPATH Injection 25% 25% 25% 25%
Command Injection 25% 25% 25% 0%
Seguridad de JAX-RS frente a ataques por inyección de código
Restlet
Apache CXF
RESTEasy
Jersey
25%
20%
15%
10%
Command Injection
5% XPATH Injection
SQL Injection
0%
Jersey RESTEasy Apache CXF Restlet
8.2.3. Causa
Tabla 16: Nivel de vulnerabilidad bajo el parámetro de causa
Restlet
Apache CXF
RESTEasy
Jersey
50%
40%
30%
20% Command Injection
10% XPATH Injection
SQL Injection
0%
Jersey RESTEasy Apache Restlet
CXF
8.2.4. Impacto
Tabla 17: Nivel de vulnerabilidad bajo el parámetro de impacto
Restlet
Apache CXF
RESTEasy
Jersey
80%
60%
40% Command Injection
20% XPATH Injection
SQL Injection
0%
Jersey RESTEasy Apache Restlet
CXF
8.2.5. Consolidado
Por último, se crea la tabla final con los niveles de vulnerabilidad promediados por cada
una de las cuatro implementaciones frente a los ataques previamente establecidos:
Apache
Tipo de ataque Jersey RESTEasy Restlet
CXF
SQL Injection 40% 40% 40% 40%
XPATH Injection 48% 48% 48% 48%
Command Injection 52% 52% 52% 0%
98 Seguridad de JAX-RS frente a ataques
160%
140%
120%
100%
80%
60%
40%
20%
0%
Jersey RESTEasy Apache CXF Restlet
Niveles de vulnerabilidad
60%
50%
40%
30%
20%
10%
0%
Jersey RESTEasy Apache CXF Restlet
60%
50%
40%
30%
20%
10% Command Injection
0% XPATH Injection
Jersey SQL Injection
RESTEasy
Apache CXF
Restlet
En la
En cuanto a la ubicación de la vulnerabilidad, cabe destacar que para todos los tipos de
ataque la vulnerabilidad aparece en el servicio RESTful, esto es importante debido a que
estos son el objetivo de este proyecto y además son las interfaces que otorgan las
aplicaciones Web a sistemas externos, siendo un punto de acceso al sistema que puede
ser aprovechado por los atacantes para lograr sus objetivos. Esto lo podemos observar en
la Tabla 15: Nivel de vulnerabilidad bajo el parámetro de ubicación.
100 Seguridad de JAX-RS frente a ataques
El impacto es tal vez uno de los criterios más importantes para medir el nivel de
vulnerabilidad, puesto que es el que indica el daño real que sufre el sistema atacado. En
este caso se observa en la Tabla 17: Nivel de vulnerabilidad bajo el parámetro de impacto
que los ataques por inyección XPATH son los que generan un mayor nivel de
vulnerabilidad, esto debido a que al ser usados en sistemas de autenticación, pueden
afectar tanto la confidencialidad de la información como la integridad del sistema ya que
un usuario indebidamente autenticado puede lograr privilegios de administración y realizar
un gran daño a todo el sistema.
En cuanto al consolidado de los resultados, se observa como a pesar de que las distintas
implementaciones tengan un comportamiento similar respecto a los ataques, Restlet
ofrece un nivel de vulnerabilidad menor frente a command injection, esto debido a que los
scripts inyectados se formatean para que hagan parte de la URI, logrando así que el
sistema interprete este código como una ruta de un recurso, denegando la solicitud y por
tanto rechazando el ataque.
Es importante resaltar esta utilidad implícita que tiene Restlet, puesto que como se
observa en la Tabla 18: Nivel de vulnerabilidad final, command injection es el ataque bajo
el que presentan menor seguridad los servicios RESTful JAX-RS. Es interesante teniendo
en cuenta que la implementación de referencia de ORACLE es Jersey.
Por último vale la pena resaltar la poca diferencia que se observa por cada uno de los
tipos de ataque por inyección de código, ya que a pesar de que la fuente puede ser la
misma, la probabilidad de éxito y el objetivo del atacante pueden variar de manera
Seguridad de JAX-RS frente a ataques por inyección de código
9. CONCLUSIONES
Actualmente no se cuenta con un software que realice análisis de vulnerabilidades a Rest
Services implementados con JAX-RS, la aproximación a este tipo de soluciones son
herramientas que realizan pruebas de penetración de seguridad a plataformas Web.
Las evaluaciones realizadas con estas herramientas no resultan ser totalmente efectivas
ya que no están enfocadas a una implementación específica y toda evaluación se realiza
por igual sin importar su lenguaje de programación, implementaciones o framework
utilizados, por lo que en ocasiones sus resultados no son específicos o no detectan algún
nivel de vulnerabilidad.
Otro factor que está ligado a la mala codificación del servicio, es la falta de controles
específicos como son los filtros, validaciones y las malas prácticas de programación, las
cuales logran revelar y exponer los detalles del servicio, estos son indicios que informan
al atacante las vulnerabilidades presentadas en los REST Services.
Por otro parte los niveles de vulnerabilidad que se presentan sobre las implementaciones
JAX-RS se deben también a su objetivo principal, el cual es respetar el estilo de
arquitectura REST que está basado sobre el protocolo HTTP.
De esta manera un atacante puede tener control sobre cada bit de una petición realizada
al REST Service, logrando así poder modificar el estado del recurso solicitado.
través del cliente, ya que como mencionamos anteriormente, él es quien tiene control total
sobre recurso, desde la petición hasta la respuesta.
Los textos de representación XML y JSON son otra entrada de vulnerabilidad, ya que por
defecto los analizadores comunes XML y JSON de Java, contienen una configuración
insegura que no contempla protección sobre estas representaciones, permitiendo al
atacante inyectar valores que alteren la representación y flujo de los recursos.
Por otra parte se pudo determinar que la implementación Restlet genera un buen nivel de
seguridad. Esto se debe gracias a la forma propia en la cual se codifica, captura y
procesan los datos de las peticiones, logrando que no sea tan factible la inyección de
parámetros HTTP.
Seguridad de JAX-RS frente a ataques por inyección de código
10. REFERENCIAS
[1] OWASP, “OWASP,” [Link], 2015. .
[2] E. J and C. Linksource, “SOA, Web Services, And RESTful Systems.,” World, 2007.
[3] E. J. Bruno, “SOA, Web Services, and RESTful Systems,” Dr. Dobb’s J. - ProQuest
Sci. Journals, vol. 1, p. 5, 2007.
[4] C. Davis, “What if the Web Were not RESTful?,” EMC Corp., vol. 1, p. 8, 2011.
[8] Edward Hunt, “US Government Computer Penetration Programs and the
gImplications for Cyberwar,” IEEE Ann. Hist. Comput., vol. 34, no. undefined, pp. 4–
21, 2012.
[9] OWASP, “OWASP Zed Attack Proxy Project,” OWASP Zed Attack Proxy Proj.,
2016.
[11] W. G. J. Halfond and A. Orso, “AMNESIA: Analysis and Monitoring for NEutralizing
SQL-injection Attacks,” in Proceedings of the 20th IEEE/ACM International
Conference on Automated Software Engineering, 2005, pp. 174–183.
[14] O. and/or its Affiliates, “Building RESTful Web Services with JAX-RS,” Oracle and/or
its affiliates, 2013. .
[15] J. Evdemon, “understanding services,” in SOA in the real World, 1st ed., 2011, p.
195.
[16] H. Li, “RESTful Web Service Frameworks in Java,” Informatiz. Off. Shanghai Lixin
104 Seguridad de JAX-RS frente a ataques
[17] N. Balani and R. Hathi, Apache CXF Web Service Development. 2009.
[23] C. Pautasso and E. Wilde, “RESTful Web Services: Principles, Patterns, Emerging
Technologies,” Raleigh • NC • USA, vol. 1, p. 2, 2010.
[26] Cwe, “CWE - 2011 cwe/sans top 25 most dangerous software errors,” SANS Inst.,
p. 41, 2011.
[32] K.-J. Lin, “SMTP-1: The First Functionalized Metalloporphyrin Molecular Sieves with
Large Channels,” Angew. Chemie Int. Ed., vol. 38, no. 18, pp. 2730–2732, 1999.
[35] E. Janot and P. Zavarsky, “Preventing SQL Injections in Online Applications : Study
, Recommendations and Java Solution Prototype Based on the SQL DOM,” 2008.
Seguridad de JAX-RS frente a ataques por inyección de código
[36] C. Commons, “OWASP Top 10 2013 Los Diez Riesgos Más Críticos en
Aplicaciones Web,” p. 22, 2013.
[40] J. Yances and S. Murillo, “Software Requirements Specification,” pp. 1–31, 2008.
[41] F. De Ciencias and D. Administración, “Universidad del Azuay,” no. Vdi, 2015.