En una entrega anterior vimos las 10 vulnerabilidades de seguridad más críticas en aplicaciones web.
La lista OWASP 2025 es la siguiente:
| Número | Vulnerabilidad |
|---|---|
| A01:2025 | Broken Access Control |
| A02:2025 | Security Misconfiguration |
| A03:2025 | Software Supply Chain Failures |
| A04:2025 | Cryptographic Failures |
| A05:2025 | Injection |
| A06:2025 | Insecure Design |
| A07:2025 | Authentication Failures |
| A08:2025 | Software or Data Integrity Failures |
| A09:2025 | Security Logging and Alerting Failures |
| A10:2025 | Mishandling of Exceptional Conditions |
La tabla del OWASP Top Ten 2025 no es solo un listado teórico: como desarrollador podemos usarla como guía práctica de control de calidad y seguridad en cada etapa del ciclo de vida de tu software.
Ejemplos del OWASP Top Ten
Broken Access Control (A01)
- Implementa roles y permisos explícitos en tu código (RBAC/ABAC).
- Usa pruebas automatizadas para verificar que un usuario no pueda acceder a recursos fuera de su rol.
- Ejemplo: en APIs REST, valida siempre el userId contra el token JWT.
Inseguro:
# Cualquiera puede ver datos de otro usuario user_id = request.args.get("id") data = db.get_user(user_id)
Seguro:
# Validar que el usuario autenticado coincide if user_id == current_user.id: data = db.get_user(user_id)
Security Misconfiguration (A02)
- Mantén configuraciones seguras por defecto (no exponer puertos innecesarios, deshabilitar directory listing).
- Automatiza revisiones con herramientas como Docker Bench Security o kube-bench en Kubernetes.
Inseguro:
# Exponer listado de directorios autoindex on;
Seguro:
# Deshabilitar listado autoindex off;
Software Supply Chain Failures (A03)
- Usa dependabot o equivalentes para monitorear librerías vulnerables.
- Firma y verifica paquetes (ejemplo: npm audit, sigstore).
- Evita dependencias sin mantenimiento activo.
Inseguro:
$ npm install paquete-desconocido
Seguro:
$ npm audit $ npm install paquete-verificado@1.2.3
Cryptographic Failures (A04)
- Aplica cifrado fuerte (AES‑256, TLS 1.3).
- Nunca inventes tu propio algoritmo: usa librerías probadas.
- Rotación periódica de claves y certificados.
Inseguro:
# Cifrado débil cipher = DES.new(key)
Seguro:
# Cifrado fuerte cipher = AES.new(key, AES.MODE_GCM)
Injection (A05)
- Usa ORMs o consultas parametrizadas (LINQ, SQL prepared statements).
- Escapa entradas en plantillas HTML/JS.
- Haz pruebas de fuzzing para detectar inyecciones.
Inseguro:
cursor.execute("SELECT * FROM users WHERE name = '" + name + "'")
Seguro:
cursor.execute("SELECT * FROM users WHERE name = %s", (name,))
Insecure Design (A06)
- Aplica Threat Modeling desde el inicio (STRIDE, DFD).
- Diseña con principios de seguridad por defecto y mínimo privilegio.
- Documenta decisiones arquitectónicas con foco en seguridad.
Inseguro:
# Contraseña en texto plano user.password = "123456"
Seguro:
# Hash seguro user.password = bcrypt.hashpw(password, bcrypt.gensalt())
Authentication Failures (A07)
- Implementa MFA (Multi‑Factor Authentication).
- Usa protocolos modernos: OAuth2, OpenID Connect.
- Evita sesiones largas sin expiración.
Inseguro:
# Sesión sin expiración session['user'] = user.id
Seguro:
session['user'] = user.id session['expires'] = datetime.now() + timedelta(minutes=30)
Software or Data Integrity Failures (A08)
- Verifica integridad con hashes y firmas digitales.
- Usa pipelines CI/CD con validación de integridad.
- Protege contra ataques de deserialización insegura.
Inseguro:
# Ejecutar código sin verificar exec(downloaded_code)
Seguro:
# Verificar firma digital antes de ejecutar if verify_signature(downloaded_code, signature): exec(downloaded_code)
Security Logging and Alerting Failures (A09)
- Centraliza logs en sistemas como ELK o Azure Monitor.
- Define alertas automáticas para eventos críticos (intentos de login fallidos, escalamiento de privilegios).
- Asegura que los logs no contengan datos sensibles en texto plano.
Inseguro:
# No se registra intento de login fallido
Seguro:
logger.warning(f"Login fallido para usuario {username}")
Mishandling of Exceptional Conditions (A10)
- Maneja errores con mensajes genéricos hacia el usuario, pero detallados en logs.
- Evita exponer stack traces en producción.
- Diseña flujos de fallback seguros (ejemplo: si falla autenticación externa, no dar acceso por defecto).
Inseguro:
# Mostrar error completo al usuario except Exception as e: return str(e)
Seguro:
except Exception as e: logger.error(f"Error interno: {e}") return "Ha ocurrido un error, inténtalo más tarde."
La tabla del OWASP Top Ten es como nuestro mapa de riesgos más comunes. Si la convertimos en criterios de aceptación en nuestros proyectos, reducimos drásticamente la superficie de ataque.
Enlaces:
https://codemonkeyjunior.blogspot.com/2025/08/owasp-el-top-ten-de-las.htmlhttps://owasp.org/Top10/2025/

No hay comentarios:
Publicar un comentario