El 82% de los incidentes de seguridad en empresas argentinas durante 2025 tuvo como vector inicial una vulnerabilidad en el software: aplicaciones web mal desarrolladas, APIs sin autenticación adecuada, dependencias desactualizadas o credenciales hardcodeadas en el código. La seguridad ya no puede ser un paso final del desarrollo — debe estar integrada desde el primer día.
En este artículo repasamos las prácticas esenciales de seguridad en el desarrollo de software que cualquier equipo técnico debería implementar, independientemente del lenguaje o framework que utilice.
¿Por qué el software inseguro sigue siendo el principal problema?
El desarrollo bajo presión de tiempos, la falta de formación específica en seguridad y la ausencia de procesos de revisión de código generan software con vulnerabilidades conocidas que los atacantes explotan con herramientas automatizadas. No hace falta un ataque sofisticado: la mayoría de las brechas aprovechan errores básicos y repetidos.
El costo de corregir una vulnerabilidad en producción es entre 30 y 100 veces mayor que corregirla durante el diseño. Invertir en desarrollo seguro no es un gasto — es la forma más eficiente de reducir el riesgo.
OWASP Top 10: los errores más frecuentes
La fundación OWASP (Open Web Application Security Project) publica la lista de las diez vulnerabilidades más críticas en aplicaciones web. En 2026, el ranking sigue dominado por problemas clásicos:
- Inyección (SQL, NoSQL, LDAP, OS): el atacante inserta comandos maliciosos a través de entradas no validadas. Prevención: consultas parametrizadas, ORMs correctamente configurados, validación de entrada en servidor.
- Fallas de autenticación: contraseñas débiles, sesiones sin expiración, ausencia de MFA, tokens predecibles. Prevención: bibliotecas de autenticación probadas, MFA obligatorio para accesos administrativos.
- Exposición de datos sensibles: datos en texto plano, cifrado débil (MD5, SHA-1), certificados inválidos. Prevención: TLS 1.3, bcrypt/Argon2 para contraseñas, cifrado AES-256 para datos en reposo.
- Control de acceso roto: usuarios que acceden a recursos de otros usuarios o escalan privilegios. Prevención: modelo de autorización explícita, principio de mínimo privilegio, pruebas de control de acceso.
- Configuración de seguridad incorrecta: headers HTTP faltantes, mensajes de error que revelan información del stack, permisos por defecto permisivos. Prevención: hardening de configuración, revisión periódica de settings.
- Componentes vulnerables: dependencias desactualizadas con CVEs conocidos. Prevención: análisis automatizado de dependencias (SCA), actualizaciones periódicas.
- Fallas en registro y monitoreo: sin logs no hay detección. Prevención: logging centralizado, alertas ante patrones anómalos, retención mínima de 90 días.
Autenticación y autorización: la primera línea de defensa
La autenticación verifica quién es el usuario; la autorización determina qué puede hacer. Confundirlas — o implementarlas sin rigor — es uno de los errores más costosos.
- No implementar autenticación propia: usar proveedores probados (OAuth 2.0, OpenID Connect) en lugar de sistemas caseros reduce el riesgo drásticamente.
- MFA (autenticación multifactor): obligatorio para accesos administrativos y aplicaciones con datos sensibles. TOTP (Google Authenticator) o llaves hardware (FIDO2) son las opciones más seguras.
- Tokens JWT con firma correcta: verificar siempre la firma, definir expiración corta (15-60 minutos), rotar refresh tokens.
- RBAC (Control de acceso basado en roles): definir roles con el mínimo privilegio necesario. Un usuario de ventas no debe poder acceder a la configuración del sistema.
- Auditoría de accesos: registrar quién accedió a qué recurso, desde dónde y cuándo. Es el primer dato que se necesita ante un incidente.
Cifrado: proteger los datos en tránsito y en reposo
El cifrado no es opcional. Toda aplicación que maneje datos de usuarios o información sensible debe cifrar tanto la comunicación como el almacenamiento.
- TLS 1.3 en todas las conexiones: deshabilitar TLS 1.0 y 1.1, que tienen vulnerabilidades conocidas. Usar certificados válidos y renovados (Let's Encrypt es una opción gratuita y confiable).
- Contraseñas con hash adaptativo: nunca almacenar contraseñas en texto plano ni con MD5/SHA-1. Usar bcrypt, Argon2 o PBKDF2 con un factor de costo adecuado.
- Cifrado de datos sensibles en base de datos: columnas con datos personales, números de documento, información médica o financiera deben estar cifradas con AES-256.
- Gestión de secretos: ninguna credencial, API key o certificado debe estar hardcodeado en el código fuente. Usar variables de entorno, HashiCorp Vault o servicios equivalentes.
Gestión de dependencias y vulnerabilidades
El 60% de las aplicaciones modernas está compuesto por código de terceros: bibliotecas, frameworks, componentes. Cada dependencia es una superficie de ataque potencial.
- Software Composition Analysis (SCA): herramientas como OWASP Dependency-Check, Snyk o Dependabot escanean automáticamente las dependencias en busca de CVEs conocidos.
- Política de actualización: definir una ventana de tiempo máxima para aplicar parches de seguridad en dependencias (por ejemplo, 72 horas para vulnerabilidades críticas).
- Lockfiles y versiones fijas: usar package-lock.json, composer.lock, requirements.txt con versiones exactas para evitar sorpresas en los builds.
- Revisión de licencias: algunas licencias open-source tienen restricciones que pueden afectar productos comerciales. Incluir la revisión de licencias en el proceso de incorporación de dependencias.
DevSecOps: integrar la seguridad en el ciclo de desarrollo
DevSecOps integra las prácticas de seguridad directamente en el pipeline de CI/CD, convirtiendo cada build en una oportunidad de detectar vulnerabilidades antes de que lleguen a producción.
- SAST (Static Application Security Testing): análisis estático del código fuente en busca de patrones vulnerables. Se ejecuta en cada commit. Herramientas: SonarQube, Semgrep, Checkmarx.
- DAST (Dynamic Application Security Testing): análisis de la aplicación en ejecución, simulando ataques reales. Se ejecuta sobre entornos de staging. Herramientas: OWASP ZAP, Burp Suite.
- Secret scanning: detectar credenciales o tokens accidentalmente incluidos en el código. GitHub Advanced Security, GitLeaks o TruffleHog pueden integrarse en el pipeline.
- Revisión de código con foco en seguridad: incluir criterios de seguridad en los pull request reviews. Al menos un revisor debe verificar el manejo de entradas, permisos y cifrado.
- Pentesting periódico: complementar las herramientas automáticas con pruebas manuales realizadas por especialistas al menos una vez al año, o antes de lanzar versiones mayores.
Headers de seguridad HTTP: protección rápida y gratuita
Los headers HTTP de seguridad son configuraciones del servidor que el navegador interpreta para proteger al usuario. Son simples de implementar y tienen un impacto significativo:
- Content-Security-Policy (CSP): define qué recursos puede cargar el navegador, previniendo XSS e inyección de scripts maliciosos.
- X-Frame-Options / CSP frame-ancestors: previene que la aplicación sea incrustada en iframes de terceros (clickjacking).
- Strict-Transport-Security (HSTS): fuerza que todas las conexiones usen HTTPS, incluso si el usuario escribe http://.
- X-Content-Type-Options: nosniff: impide que el navegador interprete archivos con un tipo MIME diferente al declarado.
- Referrer-Policy: controla qué información de origen se envía en las solicitudes, protegiendo URLs internas.
Errores críticos que se repiten en el mercado argentino
En nuestra experiencia implementando y auditando sistemas para empresas, municipios y organismos de salud, los errores más frecuentes son:
- Aplicaciones de gestión interna con autenticación HTTP Basic sin TLS.
- APIs REST sin autenticación, accesibles desde internet por error de configuración.
- Contraseñas de administrador hardcodeadas en scripts de deploy que terminan en repositorios.
- Software desarrollado hace 10 años con frameworks sin mantenimiento activo y sin plan de actualización.
- Ausencia total de logs de auditoría: cuando ocurre un incidente, no hay forma de saber qué pasó.
Conclusión
La seguridad en el software no es un proyecto con fecha de fin — es un proceso continuo. Incorporar prácticas de desarrollo seguro desde el diseño, automatizar la detección de vulnerabilidades en el CI/CD y mantener las dependencias actualizadas son los tres pilares que reducen el riesgo de forma sostenible. El costo de no hacerlo, tarde o temprano, siempre supera el de hacerlo.
Need technical advice?
Our team can assess your infrastructure and design the best solution for your organization.
Request a technical consultation