Skip to main content

Configuración de Java: cómo prevenir errores de configuración de seguridad

Escrito por
Java engineering

26 de febrero de 2021

0 minutos de lectura

La configuración de Java está en todas partes. Con todos los frameworks de aplicaciones que ofrece el ecosistema Java, es fácil pasar por alto la configuración adecuada. Sin embargo, no prestar atención a la configuración de Java también puede convertirse en un problema de seguridad si se hace de manera incorrecta. A esto lo llamamos error de configuración. Los errores de configuración de seguridad forman parte de la infame lista OWASP Top 10 de vulnerabilidades y ocupan un lugar destacado, el puesto 6.

Configurar incorrectamente tu aplicación Java puede provocar problemas de seguridad. Para empezar, la configuración predeterminada puede ser conveniente porque permite que una biblioteca o un framework funcione de inmediato. Sin embargo, estos valores predeterminados no siempre son la configuración más segura de Java: pueden revelar información útil para la depuración, pero también interesante para los intrusos.

Problemas de configuración de Java

Uno de los ejemplos más conocidos es el error de configuración de los analizadores XML en Java. En la

guía 10 prácticas recomendadas de seguridad para Java, ya hablamos de la posibilidad de sufrir ataques XXE debido a errores de configuración. También expliqué en este video de YouTube que la configuración predeterminada de Java para todos los analizadores XML es vulnerable. Basta con aplicar la configuración correcta y deshabilitar las entidades externas para prevenir posibles ataques XXE.

Otro ejemplo es configurar correctamente el manejo de errores en Java. Por muy bien escrita que esté tu aplicación web Java, tarde o temprano se producirá una excepción. Si una excepción no se captura y, por lo tanto, no se maneja, por ejemplo, en una aplicación JSP, el comportamiento predeterminado es mostrar la excepción y el seguimiento de la pila en el navegador.

Esto no solo revela que usas Java, sino también qué tipo de paquete interno utilizas. En muchos casos, estas excepciones también pueden incluir información específica, como ID. Ninguno de estos datos le sirve al usuario; además, perjudican su experiencia. Y lo que es más importante, revelan información que podría ser valiosa para personas con malas intenciones al usar tu aplicación.

Al configurar páginas de error, como se muestra a continuación, puedes redirigir al usuario según un código de respuesta o un tipo de excepción, sin mostrar información interna.

<error-page>
   <error-code>401</error-code>
   <location>/ErrorPage401.jsp</location>
</error-page>

<error-page>
   <exception-type>java.lang.Throwable</exception-type>
   <location>/ErrorPage.jsp</location>
</error-page>

Problemas de configuración en bibliotecas y frameworks de Java

Usar bibliotecas de Java y paquetes de terceros para que hagan parte del trabajo pesado es una excelente estrategia. Sin embargo, debes tener en cuenta que configurar estas herramientas correctamente es fundamental para tu estrategia de seguridad. Por suerte, la mayoría de los responsables del mantenimiento de las bibliotecas se aseguran de que los valores predeterminados sean totalmente seguros. Cambiarlos puede parecer conveniente, pero puede causarte muchos problemas.

Veamos Jackson, por ejemplo, una conocida biblioteca que se usa ampliamente para analizar JSON y convertirlo en POJOs, y viceversa. Si configuras mal la biblioteca Jackson y permites el “tipado predeterminado”, puedes deserializar objetos arbitrarios disponibles en el classpath. Esto podría provocar vulnerabilidades de deserialización similares a las que existían en la serialización nativa de Java.

Por suerte, esta función está deshabilitada de forma predeterminada, por lo que es mucho menos probable que ocurra, por ejemplo, un problema de deserialización que permita ejecutar código. Sin embargo, si cambias esta configuración en tu aplicación Java y la habilitas, podrías introducir riesgos de seguridad no deseados. 

Problemas de configuración de Spring

Spring Framework es el framework de desarrollo de aplicaciones más popular para Java. Su característica principal es la inyección de dependencias o la inversión de control.

Spring Boot es, básicamente, una extensión de Spring Framework. Permite crear aplicaciones independientes con una configuración mínima o sin configuración. Spring Boot incluye varios componentes de inicio que agregan funciones con solo importar la dependencia correcta.

Spring Boot Actuator

Al agregar la dependencia spring-boot-starter-actuator a tu manifiesto, Spring Boot Actuator te ofrece varios endpoints útiles para desarrolladores y responsables del mantenimiento.

Puedes considerar el endpoint env, que muestra propiedades del entorno, como el contenido del classpath, los beans (todos los beans de Spring en la aplicación), el endpoint threaddump, y el endpoint shutdown. Consulta la lista completa en la documentación.

De forma predeterminada, todos estos endpoints están habilitados, pero, por suerte, no todos se exponen a través de HTTP. Aun así, es fácil configurar estos endpoints predeterminados y habilitarlos para la web o JMX. También es fácil desactivarlos al pasar a producción. Si agregas la siguiente línea a tus propiedades, expondrás todos los endpoints a la web, excepto el endpoint shutdown:

management.endpoints.web.exposure.include=*

Ten cuidado de habilitar y exponer en producción solo los endpoints que realmente necesitas. Lo ideal es bloquearlos todos, excepto unos pocos, en lugar de hacer lo contrario.

management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=true
management.endpoints.jmx.exposure.include=health,info
management.endpoints.web.exposure.include=env,beans

Además, asegúrate de que solo los sistemas y las personas autorizados puedan acceder a los endpoints; para ello, incluye y configura correctamente Spring Security.

Herramientas para desarrolladores de Spring Boot

Como su nombre lo indica, este componente de Spring Boot es un conjunto adicional de herramientas que resulta útil durante el desarrollo y facilita un poco la experiencia de crear aplicaciones. Funciones como los reinicios automáticos, la depuración remota y las actualizaciones remotas hacen que este conjunto de herramientas sea muy útil durante el desarrollo.

Según la documentación de Spring, este es el comportamiento predeterminado: "Las herramientas para desarrolladores se deshabilitan automáticamente cuando se ejecuta una aplicación empaquetada por completo. Si la aplicación se inicia desde java -jar o desde un cargador de clases especial, se considera una “aplicación de producción”.

Sin embargo, puedes sobrescribir el comportamiento seguro predeterminado al configurar la propiedad `spring.devtools.restart.enabled`.

Conclusión

En general, debemos tener en cuenta que configurar tu aplicación Java es tan importante como escribir el código. Al usar frameworks y bibliotecas, debes conocer su configuración predeterminada y saber si ciertos cambios tienen implicaciones de seguridad.

Revelar demasiada información al dejar habilitados los registros de depuración o los endpoints y las funciones destinados al desarrollo perjudicará tu aplicación y tu empresa.

Esto aplica tanto a los frameworks de aplicaciones y las bibliotecas como a la configuración de tu servidor web. Recuerda que revelar información quizá no parezca perjudicial a primera vista, pero al combinar todos esos datos podrías darle a un atacante suficientes recursos para hacer algo potencialmente malicioso.

Usar bibliotecas, frameworks e incluso servidores de aplicaciones es muy útil, pero debes entender cómo funcionan. La configuración de Java y sus errores son asuntos serios. Asegúrate de no dar acceso accidental a tu aplicación porque olvidaste configurar una propiedad específica.

Leer más

blog feature ai lilac
Blog

Convierte tu backlog de vulnerabilidades en pull requests con la remediación agéntica

Evo Remediation Agent ya está disponible en Open Preview e incorpora la resolución automatizada de dependencias a Evo Agentic AppSec. Ahora, los equipos de AppSec pueden ejecutar campañas de remediación continuas

AI Background min crop
Blog

La IA activa todos los riesgos que has aceptado: siete ideas del panel de seguridad de IA sin filtros

La IA hace que los ataques sean más baratos y rápidos, y deja al descubierto riesgos que las organizaciones ya enfrentan. Cuatro líderes de seguridad explican por qué la defensa a velocidad de máquina y la corrección más rápida son esenciales.

blog feature snyk container custom base recommendations
Blog

Presentamos Evo Agentic AppSec: seguridad que sigue el ritmo del desarrollo con IA

El desarrollo impulsado por IA avanza más rápido que los flujos de trabajo de seguridad tradicionales. Agentic AppSec de Snyk usa agentes de seguridad para encontrar, corregir y verificar vulnerabilidades de forma continua, mientras las personas establecen el nivel.