Formación en seguridad para desarrolladores: currículo y recursos
Los desarrolladores escriben el código que los atacantes explotan. Cada inyección SQL, cada vulnerabilidad XSS, cada evasión de autenticación existe porque un desarrollador escribió el código de esa manera. No es una culpa: es la realidad. Y la solución no son los equipos de seguridad revisando cada línea de código. Son los desarrolladores que entienden la seguridad y la integran desde el inicio.
Los desarrolladores con conciencia de seguridad no solo evitan vulnerabilidades. Piensan como atacantes. Cuestionan las suposiciones. Se preguntan «¿qué podría salir mal?» antes de lanzar. Construyen defensa en profundidad, no seguridad como una ocurrencia tardía.
Este artículo proporciona un currículo integral de formación en seguridad para desarrolladores: qué temas cubrir, recursos de aprendizaje para cada uno y rutas de aprendizaje estructuradas desde el nivel junior hasta el senior.
Esta es la Parte 1 de la serie de formación en seguridad para desarrolladores:
- Currículo y recursos (este artículo) — qué enseñar
- Evaluación y mapeo de competencias — cómo evaluar las habilidades
- Guía de implementación — cómo desplegar el programa
Por qué importa la formación en seguridad para desarrolladores
La economía es clara: corregir una vulnerabilidad durante el desarrollo cuesta 6 veces menos que corregirla en producción. Encontrarla durante el diseño cuesta 15 veces menos que después del lanzamiento. El conocimiento de seguridad del desarrollador es la inversión de seguridad más rentable que puede hacer.
La mayoría de las vulnerabilidades son prevenibles. El OWASP Top 10 no ha cambiado drásticamente en 20 años. La inyección SQL, el XSS, el control de acceso roto: sabemos que estas vulnerabilidades existen. Sabemos cómo prevenirlas. Sin embargo, siguen apareciendo en código nuevo porque los desarrolladores no aprenden a evitarlas.
Los equipos de seguridad no pueden escalar. Incluso si tiene especialistas en seguridad, no pueden revisar cada commit. La proporción entre desarrolladores e ingenieros de seguridad suele ser de 100:1 o peor. Los desarrolladores deben ser la primera línea de defensa.
Shift-left requiere conocimiento del desarrollador. DevSecOps significa integrar la seguridad en el desarrollo. Pero los desarrolladores no pueden corregir los hallazgos de SAST que no entienden. No pueden modelar amenazas de las funcionalidades que están construyendo sin conocimiento de seguridad.
Es un diferenciador de carrera. Los desarrolladores con habilidades de seguridad tienen alta demanda. El conocimiento de seguridad aumenta el potencial de ingresos y abre caminos hacia roles especializados (Application Security, Security Engineering).
Marco de competencias en seguridad
Antes de formar a los desarrolladores, defina qué significa «competencia en seguridad» para su organización. Aquí tiene un marco:
Niveles de competencia
| Nivel | Nombre | Descripción | Esperado de |
|---|---|---|---|
| L1 | Consciente | Entiende los conceptos básicos de seguridad, reconoce vulnerabilidades comunes | Todos los desarrolladores |
| L2 | Practicante | Escribe código seguro de forma consistente, puede revisar el código de otros en busca de seguridad | Desarrolladores senior |
| L3 | Experto | Diseña sistemas seguros, guía a otros, lidera iniciativas de seguridad | Tech leads, arquitectos |
| L4 | Campeón | Impulsa la cultura de seguridad, representa al equipo en debates de seguridad | Security Champions |
Áreas de competencia
| Área | L1: Consciente | L2: Practicante | L3: Experto |
|---|---|---|---|
| Codificación segura | Conoce el OWASP Top 10 | Previene vulnerabilidades en su propio código | Revisa el código de otros, crea patrones |
| Autenticación y autorización | Entiende los conceptos | Implementa correctamente | Diseña sistemas de autenticación |
| Protección de datos | Conoce la clasificación | Maneja los datos de forma segura | Diseña estrategias de protección de datos |
| Modelado de amenazas | Entiende el propósito | Participa en sesiones | Lidera el modelado de amenazas |
| Pruebas de seguridad | Ejecuta herramientas proporcionadas | Escribe pruebas de seguridad | Crea estrategias de pruebas |
| Respuesta a incidentes | Reporta problemas | Investiga y corrige | Lidera la respuesta a incidentes |
| Dependencias | Actualiza cuando se le indica | Monitorea y gestiona | Crea políticas de dependencias |
Requisitos por rol
| Rol | Nivel mínimo | Áreas de enfoque |
|---|---|---|
| Desarrollador junior | L1 | Conceptos básicos de codificación segura, OWASP Top 10 |
| Desarrollador de nivel medio | L1-L2 | Codificación segura, pruebas básicas de seguridad |
| Desarrollador senior | L2 | Todas las áreas, revisión de código, mentoría |
| Tech Lead | L2-L3 | Arquitectura, modelado de amenazas, prácticas del equipo |
| Ingeniero de QA | L1-L2 | Pruebas de seguridad, verificación de vulnerabilidades |
| Ingeniero de DevOps | L2 | Seguridad de infraestructura, seguridad de CI/CD |
| Security Champion | L3-L4 | Todas las áreas, liderazgo cultural |
Currículo principal para desarrolladores
1: Fundamentos de seguridad
Duración: 2-4 horas
Destinatario: Todos los desarrolladores (L1)
Temas:
- Tríada CIA (Confidencialidad, Integridad, Disponibilidad)
- Defensa en profundidad
- Principio de mínimo privilegio
- Concepto de superficie de ataque
- Equilibrio entre seguridad y comodidad
- Panorama de amenazas para aplicaciones web
Objetivos de aprendizaje:
- Explicar por qué la seguridad importa para los desarrolladores
- Identificar vectores de ataque comunes
- Comprender la terminología básica de seguridad
- Reconocer cuándo pedir ayuda de seguridad
Recursos:
| Recurso | Tipo | Coste | Enlace |
|---|---|---|---|
| OWASP Web Security Testing Guide | Guía | Gratuito | owasp.org/www-project-web-security-testing-guide |
| PortSwigger Web Security Academy | Curso interactivo | Gratuito | portswigger.net/web-security |
| Hack The Box Academy | Laboratorios prácticos | Nivel gratuito | academy.hackthebox.com |
| TryHackMe | Laboratorios para principiantes | Nivel gratuito | tryhackme.com |
2: Análisis profundo del OWASP Top 10
Duración: 4-8 horas
Destinatario: Todos los desarrolladores (L1-L2)
El OWASP Top 10 representa los riesgos de seguridad más críticos para las aplicaciones web. Cada desarrollador debe entender estas vulnerabilidades en profundidad.
OWASP Top 10 (2021):
| # | Vulnerabilidad | Qué es | Prevención |
|---|---|---|---|
| A01 | Control de acceso roto | Los usuarios pueden acceder a recursos no autorizados | Verificar la autorización en cada solicitud |
| A02 | Fallos criptográficos | Datos sensibles expuestos mediante criptografía débil | Usar cifrado fuerte, gestión adecuada de claves |
| A03 | Inyección | Datos no confiables ejecutados como código | Consultas parametrizadas, validación de entrada |
| A04 | Diseño inseguro | Fallos en la arquitectura/diseño | Modelado de amenazas, patrones de diseño seguros |
| A05 | Mala configuración de seguridad | Configuraciones predeterminadas, funciones innecesarias | Hardening, permisos mínimos |
| A06 | Componentes vulnerables | Uso de componentes con vulnerabilidades conocidas | Escaneo SCA, actualizaciones |
| A07 | Fallos de autenticación | Mecanismos de autenticación rotos | MFA, gestión segura de sesiones |
| A08 | Fallos de integridad de software y datos | Confiar en fuentes no confiables | Verificar firmas, comprobaciones de integridad |
| A09 | Fallos de registro de seguridad | Registro insuficiente para la detección | Registro de seguridad integral |
| A10 | SSRF | El servidor hace solicitudes a destinos controlados por el atacante | Validar y sanitizar URLs |
Práctica práctica:
| Plataforma | Descripción | Enlace |
|---|---|---|
| OWASP WebGoat | App deliberadamente insegura para aprender | github.com/WebGoat/WebGoat |
| OWASP Juice Shop | App vulnerable moderna | owasp.org/www-project-juice-shop |
| DVWA | Damn Vulnerable Web Application | github.com/digininja/DVWA |
| HackTheBox | Máquinas vulnerables | hackthebox.com |
| PentesterLab | Ejercicios guiados | pentesterlab.com |
3: Codificación segura por lenguaje
Duración: 4-6 horas por lenguaje
Destinatario: Desarrolladores (L1-L2)
Las prácticas de seguridad difieren por lenguaje y framework. Proporcione formación específica por lenguaje para su stack.
JavaScript/TypeScript
Áreas clave:
- Prevención de XSS (codificación de salida, CSP)
- Contaminación de prototipos
- Seguridad de dependencias npm
- Autenticación segura con JWTs
- Validación de solicitudes del lado del servidor
- Análisis seguro de JSON
Recursos:
| Recurso | Tipo | Enlace |
|---|---|---|
| OWASP Node.js Security Cheat Sheet | Guía | cheatsheetseries.owasp.org |
| Node.js Security Best Practices | Guía | nodejs.org/en/docs/guides/security |
| Snyk JavaScript Security | Blog/Aprendizaje | snyk.io/learn/javascript-security |
| Secure Coding in Node.js | Curso | pluralsight.com |
Ejemplo: Prevención de XSS
// BAD: Direct HTML insertion
element.innerHTML = userInput; // XSS vulnerability
// GOOD: Text content (auto-escapes)
element.textContent = userInput;
// GOOD: DOMPurify for rich content
import DOMPurify from 'dompurify';
element.innerHTML = DOMPurify.sanitize(userInput);
// GOOD: Template literals with encoding
const safe = encodeHTML(userInput);
element.innerHTML = `<div>${safe}</div>`;
Python
Áreas clave:
- Inyección SQL con ORMs
- Inyección de comandos (subprocess)
- Deserialización de Pickle
- SSTI (Inyección de plantillas del lado del servidor)
- Path traversal
- Hash seguro de contraseñas
Recursos:
| Recurso | Tipo | Enlace |
|---|---|---|
| OWASP Python Security | Guía | cheatsheetseries.owasp.org |
| Bandit | Herramienta SAST | bandit.readthedocs.io |
| Real Python Security | Tutoriales | realpython.com/tutorials/security |
| Python Security Best Practices | Curso | pluralsight.com |
Ejemplo: Prevención de inyección SQL
# BAD: String formatting (SQL injection)
query = f"SELECT * FROM users WHERE id = {user_id}"
cursor.execute(query)
# GOOD: Parameterized queries
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
# GOOD: ORM usage (SQLAlchemy)
user = session.query(User).filter(User.id == user_id).first()
# GOOD: Django ORM
user = User.objects.get(id=user_id)
Java
Áreas clave:
- Inyección SQL (JDBC, JPA)
- XML External Entity (XXE)
- Vulnerabilidades de deserialización
- Configuración de Spring Security
- Registro seguro
- Criptografía con JCA
Recursos:
| Recurso | Tipo | Enlace |
|---|---|---|
| OWASP Java Security | Guía | cheatsheetseries.owasp.org |
| Spring Security Reference | Documentación | docs.spring.io/spring-security |
| Find Security Bugs | Herramienta SAST | find-sec-bugs.github.io |
| Secure Coding Guidelines for Java | Guía de Oracle | oracle.com |
Go
Áreas clave:
- Validación de entrada
- Inyección SQL con database/sql
- Path traversal
- Condiciones de carrera
- Configuración segura del cliente HTTP
- Criptografía con el paquete crypto
Recursos:
| Recurso | Tipo | Enlace |
|---|---|---|
| OWASP Go Security | Guía | cheatsheetseries.owasp.org |
| Secure Go | Libro | github.com/OWASP/Go-SCP |
| gosec | Herramienta SAST | github.com/securego/gosec |
PHP
Áreas clave:
- Inyección SQL (PDO, mysqli)
- Prevención de XSS
- Vulnerabilidades de carga de archivos
- Seguridad de sesiones
- Vulnerabilidades de include/require
- Hash de contraseñas con password_hash()
Recursos:
| Recurso | Tipo | Enlace |
|---|---|---|
| OWASP PHP Security | Guía | cheatsheetseries.owasp.org |
| PHP: The Right Way - Security | Guía | phptherightway.com/#security |
| Psalm | Analizador estático | psalm.dev |
C# / .NET
Áreas clave:
- Inyección SQL con Entity Framework
- XSS en vistas Razor
- Tokens antifalsificación (CSRF)
- Deserialización segura
- Criptografía con APIs de .NET
- Autenticación con ASP.NET Identity
Recursos:
| Recurso | Tipo | Enlace |
|---|---|---|
| OWASP .NET Security | Guía | cheatsheetseries.owasp.org |
| ASP.NET Core Security | Documentación | docs.microsoft.com/en-us/aspnet/core/security |
| Security Code Scan | Herramienta SAST | security-code-scan.github.io |
4: Autenticación y autorización
Duración: 4-6 horas
Destinatario: Desarrolladores (L2)
Temas:
- Autenticación vs. autorización
- Gestión de sesiones
- Buenas prácticas y problemas de JWT
- OAuth 2.0 y OpenID Connect
- Almacenamiento de contraseñas (bcrypt, Argon2)
- Implementación de MFA
- Patrones de autenticación de API
- RBAC y ABAC
Errores comunes para enseñar:
// BAD: JWT in localStorage (XSS can steal it)
localStorage.setItem('token', jwt);
// BETTER: HttpOnly cookie (not accessible via JavaScript)
// Set via response header:
// Set-Cookie: token=jwt; HttpOnly; Secure; SameSite=Strict
// BAD: Checking JWT signature but not expiration
const decoded = jwt.verify(token, secret);
// Token could be expired!
// GOOD: Verify all claims
const decoded = jwt.verify(token, secret, {
algorithms: ['HS256'],
maxAge: '1h',
issuer: 'your-app'
});
Recursos:
| Recurso | Tipo | Enlace |
|---|---|---|
| OWASP Authentication Cheat Sheet | Guía | cheatsheetseries.owasp.org |
| OAuth 2.0 Simplified | Libro | oauth.com |
| Auth0 Blog | Artículos | auth0.com/blog |
| JWT.io | Aprendizaje | jwt.io/introduction |
5: Pruebas de seguridad para desarrolladores
Duración: 4-6 horas
Destinatario: Desarrolladores y QA (L2)
Los desarrolladores deben escribir pruebas de seguridad, no depender solo de los equipos de seguridad.
Tipos de pruebas de seguridad:
| Tipo | Qué prueba | Cuándo usar | Herramientas |
|---|---|---|---|
| Pruebas unitarias de seguridad | Funciones de seguridad individuales | Cada commit | Jest, pytest, JUnit |
| Pruebas de integración de seguridad | Flujos de autenticación, control de acceso | Cada PR | Supertest, requests |
| SAST | Patrones del código fuente | CI/CD | Semgrep, CodeQL, Bandit |
| DAST | Aplicación en ejecución | Staging | OWASP ZAP, Nuclei |
| Escaneo de dependencias | CVEs conocidos en librerías | Cada build | Snyk, Dependabot |
| Pruebas de fuzzing | Casos extremos, fallos | Periódico | AFL, libFuzzer |
Escribiendo pruebas de seguridad:
// Authentication tests
describe('Authentication', () => {
test('should reject invalid credentials', async () => {
const res = await request(app)
.post('/api/login')
.send({ username: 'user', password: 'wrong' });
expect(res.status).toBe(401);
});
test('should not leak user existence via timing', async () => {
const start1 = Date.now();
await request(app).post('/api/login').send({ username: 'exists', password: 'wrong' });
const time1 = Date.now() - start1;
const start2 = Date.now();
await request(app).post('/api/login').send({ username: 'nonexistent', password: 'wrong' });
const time2 = Date.now() - start2;
// Response times should be similar
expect(Math.abs(time1 - time2)).toBeLessThan(50);
});
});
// Authorization tests
describe('Authorization', () => {
test('should deny access to other users resources', async () => {
const user1Token = await login('user1', 'password1');
const res = await request(app)
.get('/api/users/user2/data')
.set('Authorization', `Bearer ${user1Token}`);
expect(res.status).toBe(403);
});
});
// Input validation tests
describe('Input Validation', () => {
test('should reject SQL injection attempts', async () => {
const res = await request(app)
.get('/api/users')
.query({ id: "1' OR '1'='1" });
expect(res.status).toBe(400);
});
test('should reject XSS in user input', async () => {
const res = await request(app)
.post('/api/comments')
.send({ text: '<script>alert("xss")</script>' });
// Either reject or sanitize
expect(res.body.text).not.toContain('<script>');
});
});
Recursos:
| Recurso | Tipo | Enlace |
|---|---|---|
| OWASP Testing Guide | Guía integral | owasp.org/www-project-web-security-testing-guide |
| BDD Security | Framework | github.com/iriusrisk/bdd-security |
| OWASP ZAP | Herramienta DAST | zaproxy.org |
| Nuclei | Escáner basado en plantillas | nuclei.projectdiscovery.io |
6: Modelado de amenazas
Duración: 2-4 horas
Destinatario: Desarrolladores senior, Tech leads (L2-L3)
El modelado de amenazas identifica problemas de seguridad durante el diseño, antes de que se escriba el código.
Modelo STRIDE:
| Amenaza | Descripción | Ejemplo | Mitigación |
|---|---|---|---|
| Spoofing (Suplantación) | Fingir ser otra persona | Credenciales robadas | Autenticación fuerte, MFA |
| Tampering (Manipulación) | Modificar datos | Cambiar precios en el carrito | Comprobaciones de integridad, firmas |
| Repudiation (Repudio) | Negar acciones | «Yo no hice esa compra» | Registro de auditoría |
| Information Disclosure (Divulgación de información) | Exposición de datos | Volcado de base de datos | Cifrado, control de acceso |
| Denial of Service (Denegación de servicio) | Hacer el sistema no disponible | Ataque DDoS | Limitación de tasa, escalado |
| Elevation of Privilege (Elevación de privilegios) | Obtener acceso no autorizado | Acceso de administrador sin serlo | Mínimo privilegio, RBAC |
Proceso simple de modelado de amenazas:
- ¿Qué estamos construyendo? Dibuje un diagrama de flujo de datos. Identifique componentes, almacenes de datos y límites de confianza.
- ¿Qué puede salir mal? Aplique STRIDE a cada componente. Haga una lluvia de ideas sobre escenarios de ataque.
- ¿Qué vamos a hacer al respecto? Priorice las amenazas (probabilidad × impacto). Defina mitigaciones. Cree requisitos de seguridad.
- ¿Lo hicimos bien? Revise la completitud del modelo. Verifique que las mitigaciones estén implementadas. Actualice el modelo a medida que el diseño cambie.
Recursos:
| Recurso | Tipo | Enlace |
|---|---|---|
| OWASP Threat Modeling | Guía | owasp.org/www-community/Threat_Modeling |
| Microsoft Threat Modeling Tool | Herramienta | microsoft.com/en-us/securityengineering/sdl/threatmodeling |
| Threat Modeling: Designing for Security | Libro | Adam Shostack |
| OWASP Threat Dragon | Herramienta de código abierto | owasp.org/www-project-threat-dragon |
Formación en seguridad para ingenieros de QA
Los ingenieros de QA son multiplicadores de fuerza para la seguridad. Ya piensan en casos extremos y en romper cosas: las pruebas de seguridad son una extensión natural.
Currículo de pruebas de seguridad para QA
| Módulo | Temas | Duración |
|---|---|---|
| Conceptos básicos de pruebas de seguridad | Tipos de vulnerabilidades, OWASP Top 10, mentalidad de prueba | 4 horas |
| Pruebas de seguridad manuales | Conceptos básicos de Burp Suite, interceptar solicitudes, probar autenticación | 8 horas |
| Pruebas de seguridad automatizadas | OWASP ZAP, Nuclei, integración CI | 4 horas |
| Pruebas de seguridad de API | Vulnerabilidades de API, pruebas de seguridad con Postman, fuzzing | 4 horas |
| Reporte de vulnerabilidades | Escribir buenos reportes de errores, evaluación de gravedad | 2 horas |
Herramientas para pruebas de seguridad de QA
| Herramienta | Propósito | Curva de aprendizaje | Enlace |
|---|---|---|---|
| Burp Suite Community | Proxy web, pruebas manuales | Media | portswigger.net/burp |
| OWASP ZAP | Escáner web, alternativa gratuita a Burp | Media | zaproxy.org |
| Postman | Pruebas de API con pruebas de seguridad | Baja | postman.com |
| Nuclei | Escaneo basado en plantillas | Baja | nuclei.projectdiscovery.io |
| Browser DevTools | Inspección de solicitudes, análisis de cookies | Baja | Integrado |
Lista de verificación de pruebas de seguridad de QA
## Lista de verificación de pruebas de seguridad de QA
### Autenticación
- [ ] Probar con credenciales inválidas
- [ ] Probar el bloqueo de cuenta tras intentos fallidos
- [ ] Probar el flujo de restablecimiento de contraseña para enumeración de cuentas
- [ ] Probar el tiempo de expiración de sesión
- [ ] Probar el manejo de sesiones simultáneas
- [ ] Probar la funcionalidad de «recordarme»
### Autorización
- [ ] Probar el acceso a datos de otros usuarios (IDOR)
- [ ] Probar el acceso basado en roles (¿puede el usuario acceder como administrador?)
- [ ] Probar el control de acceso a nivel de función
- [ ] Probar después del cierre de sesión (¿se puede acceder a páginas en caché?)
### Validación de entrada
- [ ] Probar con cargas de inyección SQL
- [ ] Probar con cargas XSS
- [ ] Probar con caracteres especiales
- [ ] Probar con entradas muy largas
- [ ] Probar con entradas vacías/nulas
- [ ] Probar con tipos de datos inesperados
### Lógica de negocio
- [ ] Probar condiciones de carrera (enviar dos veces rápidamente)
- [ ] Probar la omisión de flujo de trabajo (saltar pasos)
- [ ] Probar valores negativos (cantidad negativa, precio negativo)
- [ ] Probar el desbordamiento de enteros
### Archivos
- [ ] Probar la carga de archivos ejecutables
- [ ] Probar la carga de archivos sobredimensionados
- [ ] Probar el path traversal en nombres de archivos
- [ ] Probar el acceso a archivos sin autorización
### Específico de API
- [ ] Probar sin autenticación
- [ ] Probar con tokens manipulados
- [ ] Probar la limitación de tasa
- [ ] Probar la asignación masiva
- [ ] Probar la exposición excesiva de datos
Conceptos básicos de Burp Suite para QA
Configuración: Configure el proxy (127.0.0.1:8080), instale el certificado CA de Burp en el navegador, navegue por la aplicación: Burp captura todo el tráfico.
Pestañas clave:
- Proxy → Historial HTTP — vea todas las solicitudes
- Repeater — modifique y reenvíe solicitudes individuales
- Intruder — pruebas de carga automatizadas
- Scanner — escaneo automatizado de vulnerabilidades (solo versión Pro)
Pruebas comunes: cambiar el ID de usuario en la URL (IDOR) · modificar el cuerpo JSON (autorización) · eliminar cabeceras de autenticación (requisitos de autenticación) · inyectar cargas (validación de entrada)
Rutas de aprendizaje integrales
Ruta para desarrollador junior (0-2 años)
Meses 1-3: Fundamentos
- Curso de fundamentos de seguridad
- Formación en OWASP Top 10
- Conceptos básicos de codificación segura específica del lenguaje
- Evaluación: Cuestionario de seguridad (aprobar con 80 %)
Meses 4-6: Habilidades prácticas
- Completar PortSwigger Web Security Academy (básico)
- Practicar en WebGoat
- Escribir las primeras pruebas unitarias de seguridad
- Evaluación: Encontrar 3 vulnerabilidades en una app de prueba
Meses 7-12: Integración
- Aplicar codificación segura en el trabajo diario
- Participar en revisiones de código de seguridad
- Unirse a un evento CTF
- Evaluación: Ejercicio de revisión de código seguro
Objetivo al final del año: Competencia L1 en todas las áreas
Ruta para desarrollador de nivel medio (2-5 años)
Trimestre 1:
- Formación avanzada en OWASP
- Análisis profundo de autenticación y autorización
- Evaluación: Cuestionario de seguridad intermedio
Trimestre 2:
- Pruebas de seguridad con Burp Suite
- Seguridad de API
- Evaluación: Encontrar vulnerabilidades usando Burp
Trimestre 3:
- Introducción al modelado de amenazas
- Participar en sesión de modelado de amenazas
- Evaluación: Liderar el modelado de amenazas para una pequeña funcionalidad
Trimestre 4:
- Guiar a un desarrollador junior
- Contribuir a la documentación de seguridad
- Evaluación: Revisión de código con enfoque en seguridad
Objetivo al final del año: Competencia L2, listo para el rol de Security Champion
Ruta para desarrollador senior / Tech lead
Áreas de enfoque:
- Seguridad de arquitectura
- Liderar sesiones de modelado de amenazas
- Requisitos de seguridad para nuevos proyectos
- Guiar a otros
- Respuesta a incidentes de seguridad
Actividades:
- Completar el curso de modelado de amenazas
- Liderar 3+ sesiones de modelado de amenazas
- Revisar la arquitectura de seguridad para nuevos proyectos
- Presentar en una charla técnica interna sobre un tema de seguridad
- Participar en un ejercicio de respuesta a incidentes
Objetivo: Competencia L3, Security Champion o colaborando con el equipo de seguridad
Preguntas de autoevaluación
- ¿Cuáles son los cuatro niveles del marco de competencias en seguridad?
- ¿Qué vulnerabilidad del OWASP Top 10 implica ejecutar datos no confiables como código?
- ¿Por qué una consulta parametrizada es más segura que la interpolación de cadenas para SQL?
- ¿Cuál es la diferencia entre SAST y DAST?
- ¿Qué significa STRIDE?
- ¿Por qué deben aprender pruebas de seguridad los ingenieros de QA?
Enlaces y recursos
Cursos y formación
| Recurso | Tipo | Coste | Enlace |
|---|---|---|---|
| PortSwigger Web Security Academy | Interactivo | Gratuito | portswigger.net/web-security |
| OWASP WebGoat | Práctico | Gratuito | owasp.org/www-project-webgoat |
| Hack The Box Academy | Laboratorios | Nivel gratuito | academy.hackthebox.com |
| TryHackMe | Laboratorios para principiantes | Nivel gratuito | tryhackme.com |
| PentesterLab | Ejercicios | $20/mes | pentesterlab.com |
| SANS Secure Coding | Certificación | De pago | sans.org |
Hojas de referencia y guías
- OWASP Cheat Sheet Series — Guías integrales de codificación segura
- OWASP Testing Guide — Metodología de pruebas de seguridad
- CWE Top 25 — Debilidades de software más peligrosas
Herramientas SAST por lenguaje
| Lenguaje | Herramienta | Enlace |
|---|---|---|
| Multi-lenguaje | Semgrep | semgrep.dev |
| Multi-lenguaje | CodeQL | codeql.github.com |
| Python | Bandit | bandit.readthedocs.io |
| JavaScript | ESLint security plugins | github.com/eslint-community/eslint-plugin-security |
| Java | Find Security Bugs | find-sec-bugs.github.io |
| Go | gosec | github.com/securego/gosec |
| C# | Security Code Scan | security-code-scan.github.io |
Aplicaciones vulnerables para práctica
Plataformas CTF
- CTFd — Organice su propio CTF
- PicoCTF — Amigable para principiantes
- CTFtime — Calendario de eventos CTF
Conclusión
Un currículo que no se corresponde con lo que sus desarrolladores realmente construyen es un esfuerzo desperdiciado. Comience por lo que conoce: su stack, sus vulnerabilidades, sus incidentes, y construya desde ahí.
El objetivo no es convertir a cada desarrollador en un experto en seguridad. Es hacerlos lo suficientemente fluidos como para no introducir las mismas categorías de errores dos veces.
Qué sigue
Siguiente: evaluación y mapeo de competencias — cómo evaluar el estado de sus desarrolladores antes de comenzar la formación.