Fundamentos y base teórica
Técincas de codificación seguras
Las técnicas de codificación segura son esenciales para que los desarrolladores creen aplicaciones resistentes a los ataques y protejan los datos de los usuarios. Estas técnicas son un subconjunto de las prácticas de desarrollo seguro que se centran específicamente en escribir código de forma que se evite la introducción de vulnerabilidades de seguridad. He aquí un resumen de algunas técnicas clave de codificación segura;
- Validación de entradas: Asegúrese de que todas las entradas recibidas de usuarios, archivos, bases de datos o cualquier fuente externa se validan en cuanto a tipo, longitud, formato y rango antes de utilizarlas en la aplicación.
- Codificación de salida: Cuando muestre o transmita datos, codifíquelos adecuadamente para evitar ataques de inyección, como Cross-Site Scripting (XSS). Por ejemplo, la salida HTML debe codificarse para evitar que el navegador ejecute scripts maliciosos.
- Consultas parametrizadas: Utilice consultas parametrizadas o sentencias preparadas al acceder a bases de datos para evitar ataques de inyección SQL.
- Mínimos privilegios: Aplique el principio del mínimo privilegio ejecutando procesos y accediendo a recursos con los permisos mínimos necesarios.
- Autenticación y autorización: Implemente mecanismos de autenticación sólidos y aplique controles de autorización estrictos para garantizar que sólo los usuarios legítimos puedan acceder a funciones y datos confidenciales.
- Gestión de contraseñas: Almacene las contraseñas de forma segura utilizando algoritmos hash fuertes y adaptables como bcrypt o Argon2.
- Gestión de sesiones: Almacene los datos de sesión de forma segura y asegúrese de que los testigos de sesión se transmiten de forma segura, normalmente en cabeceras HTTP con el uso adecuado de HTTPS.
- Gestión de errores: Implementar una gestión de errores robusta que no exponga información sensible al usuario.
- Cifrado: Utilice el cifrado para proteger los datos en tránsito (con TLS/SSL) y en reposo. Asegúrese de que las implementaciones de cifrado están actualizadas y utilizan algoritmos y claves potentes.
- Firma de código: Firme su código para garantizar su integridad y origen. Esto ayuda a prevenir la manipulación y puede alertar a los usuarios de cambios no autorizados.
- Operaciones de archivo seguras: Cuando maneje archivos, asegúrese de que las operaciones de archivo se realizan de forma segura para evitar ataques de cruce de directorios y asegúrese de que los permisos de archivo se establecen adecuadamente.
- Gestión de memoria: Para los lenguajes que no gestionan automáticamente la memoria, como C y C++, sea diligente a la hora de asignar, utilizar y liberar memoria para evitar fugas de memoria y desbordamientos de búfer.
- Concurrencia y manejo de condiciones de carrera: Escriba código que sea seguro para la ejecución concurrente y maneje las condiciones de carrera para evitar problemas como los errores de tiempo de comprobación a tiempo de uso (TOCTOU)
- Saneamiento de datos: Desinfecte los datos que se pasarán a intérpretes o intérpretes de comandos para evitar ataques de inyección.
- Revisión del código y análisis estático: Realice revisiones periódicas del código centradas en la seguridad y utilice herramientas de análisis estático para detectar automáticamente posibles vulnerabilidades en el código.
- Seguridad de dependencias: Mantenga actualizadas las bibliotecas y dependencias de terceros y compruebe si existen vulnerabilidades conocidas utilizando herramientas de análisis de composición de software.

Figura-4
Fuente: https://securityboulevard.com/2022/01/7-security-coding-guidelines-to-keep-in-mind/
Modelado de amenazas y evaluación de riesgos
El modelado de amenazas y la evaluación de riesgos son procesos proactivos utilizados en ciberseguridad y desarrollo de software para identificar, priorizar y mitigar las amenazas potenciales a un sistema. Estas prácticas forman parte de un enfoque más amplio de la seguridad conocido como Seguridad por Diseño, que hace hincapié en la importancia de incorporar medidas de seguridad desde las primeras fases del desarrollo. El modelado de amenazas es un enfoque estructurado para identificar y abordar las amenazas potenciales a un sistema.

Figura-5
Fuente: https://www.security-analyst.org/threat-analysis-and-risk-assessment/
Buenas prácticas para la modelización de amenazas y la evaluación de riesgos
Empezar pronto: Comienza el modelado de amenazas y la evaluación de riesgos en la fase de diseño y repítelo a lo largo del ciclo de vida de desarrollo.
Implicar a equipos multidisciplinares: Incluye a miembros con perspectivas diversas, como desarrolladores, profesionales de la seguridad, personal de operaciones y analistas empresariales.
Utilizar marcos y metodologías estándar: Aplica marcos establecidos (como NIST, ISO u OCTAVE) y metodologías (como STRIDE o PASTA) para guiar el proceso.
Mantener actualizada la documentación: Asegúrate de que todas las conclusiones y acciones estén bien documentadas y sean fácilmente accesibles.
Integración en el proceso de desarrollo: Integra el modelado de amenazas y la evaluación de riesgos en el ciclo de vida de desarrollo de software (SDLC) y haz que forme parte de las prácticas de desarrollo habituales.
Educar y formar: Ofrece formación a todas las partes implicadas en el proceso para garantizar que comprenden la importancia y los métodos del modelado de amenazas y la evaluación de riesgos.
Reevaluar periódicamente: La seguridad no es un esfuerzo aislado. Reevalúa periódicamente las amenazas y los riesgos en respuesta a nuevas vulnerabilidades, cambios en el sistema o amenazas emergentes.
Pruebas de seguridad
Las pruebas de seguridad son un componente crítico del ciclo de vida del desarrollo de software y de la estrategia general de ciberseguridad. Consiste en evaluar las características de seguridad de un sistema para garantizar que protegen los datos y mantienen la funcionalidad prevista. A continuación se ofrece una visión general de los distintos tipos de pruebas de seguridad y de cómo suelen realizarse:
a) Exploración de vulnerabilidades: Las herramientas automatizadas escanean sistemas, redes y aplicaciones en busca de vulnerabilidades conocidas.
b) Pruebas de penetración (Pen Testing): Las pruebas de penetración simulan un ciberataque para identificar y explotar vulnerabilidades en sistemas, redes y aplicaciones. Suelen realizarlas hackers éticos que utilizan las mismas técnicas que los atacantes malintencionados, pero lo hacen de forma controlada y autorizada.
c) Auditoría de seguridad: Se trata de una evaluación sistemática de los controles y procesos de seguridad para garantizar que se aplican de forma correcta y eficaz.
d) Evaluación de la seguridad: Una evaluación más amplia que abarca el escaneo de vulnerabilidades, las pruebas de penetración, la auditoría de seguridad y la evaluación de riesgos. Proporciona una imagen completa de la postura de seguridad de una organización.
e) Evaluación de riesgos: Este proceso implica la identificación, cuantificación y priorización de los riesgos para los activos de la organización.
f) Hacking ético: Similar a las pruebas de penetración, el hacking ético implica atacar deliberadamente los sistemas de una organización para encontrar vulnerabilidades desde la perspectiva de un atacante.
g) Revisión del código: Las revisiones de código pueden realizarse manualmente o utilizando herramientas automatizadas y son una parte esencial de la seguridad del proceso de desarrollo de software.
h) Revisión de la gestión de la configuración: Garantizar que los sistemas y aplicaciones están configurados de forma segura es crucial.
i) Auditoría de conformidad: Verificar que los sistemas y procesos cumplen las normas y reglamentos de seguridad pertinentes (como GDPR, HIPAA, PCI DSS, etc.).
j) Red Teaming: Una simulación de ataque multicapa que pone a prueba la capacidad de las personas, las redes, las aplicaciones y los controles de seguridad física de una organización para resistir un ataque de un adversario de la vida real.
k) Pruebas de ingeniería social: Comprobación de la susceptibilidad del personal de una organización a las tácticas de ingeniería social, como phishing, pretexting, baiting o tailgating.
l) Evaluación de la postura: Consiste en analizar y comprender el estado de seguridad de los sistemas informáticos, redes y otros activos de información para identificar vulnerabilidades de seguridad.

Figura-6
