Seguridad de aplicaciones Java: top 10 vulnerabilidades — parte 2
En la primera parte analizamos las primeras cinco vulnerabilidades críticas de las aplicaciones Java. Hoy continuamos el aprendizaje y examinamos las cinco amenazas restantes que todo desarrollador debe conocer. Java para principiantes y programadores experimentados: esta información les ayudará a escribir código más seguro. En el mundo de la programación, la seguridad no es una opción, sino una necesidad.
6. Entidades XML externas (XXE)
Los ataques XXE ocurren cuando la aplicación procesa documentos XML que contienen referencias a entidades externas. Un atacante puede leer archivos locales, ejecutar un ataque SSRF o provocar una denegación de servicio.
Código vulnerable
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xmlData)));
Protección
- Deshabilite las entidades externas y DTD
- Utilice analizadores seguros
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
factory.setFeature("http://xml.org/sax/features/external-general-entities", false);
factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
7. Deserialización insegura
La deserialización de datos no confiables puede llevar a la ejecución de código arbitrario. Esta es una de las vulnerabilidades más peligrosas en Java, ya que a menudo permite comprometer completamente el servidor.
Ejemplo de ataque
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.ser"));
Object obj = ois.readObject(); // ¡peligroso!
Métodos de protección
- No deserialice datos de fuentes no confiables
- Utilice listas blancas de clases
- Aplique formatos alternativos (JSON, Protocol Buffers)
8. Inyección SQL
Aunque es un clásico de la programación, las inyecciones SQL todavía se encuentran en aplicaciones Java. Utilice siempre consultas parametrizadas.
Incorrecto (vulnerable)
String query = "SELECT * FROM users WHERE name = '" + userName + "'";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
Correcto (seguro)
String query = "SELECT * FROM users WHERE name = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, userName);
ResultSet rs = pstmt.executeQuery();
Para Java para principiantes, esta regla debe convertirse en un axioma: nunca concatenen cadenas para consultas SQL.
9. Deficiencias en la autenticación y gestión de sesiones
La autenticación débil, las sesiones vulnerables y la gestión incorrecta de contraseñas son un problema común en aplicaciones web Java.
Recomendaciones
- Utilice algoritmos modernos de hash de contraseñas (bcrypt, Argon2)
- Configure un tiempo de vida de sesión correcto
- Aplique cookies seguras (HttpOnly, Secure, SameSite)
- Implemente autenticación multifactor
10. Uso de componentes con vulnerabilidades conocidas
El ecosistema Java es rico en bibliotecas, pero muchos proyectos utilizan versiones obsoletas con CVE públicas. Este es uno de los problemas de seguridad más comunes.
Cómo protegerse
- Actualice las dependencias regularmente
- Utilice herramientas de análisis (OWASP Dependency-Check, Snyk)
- Suscríbase a notificaciones de seguridad para las bibliotecas utilizadas
- Automatice