En Italia, en el último año los ataques informáticos han aumentado un 15% (Clusit). La superficie de ataque ha crecido exponencialmente con el tiempo, los datos han adquirido un valor estratégico y los atacantes se han vuelto cada vez más rápidos y organizados. Por ello, la defensa no puede basarse en enfoques tradicionales ebe integrarse en todo el ciclo de desarrollo del software. Es aquí donde entra en juego el concepto de Secure Code.
Los componentes clave de la seguridad de las aplicaciones
Es evidente que la seguridad no puede ser un pensamiento accesorio o algo que se gestione al finalizar un proyecto de software. Al contrario, debe ser parte integrante de todo el Software Development LifeCycle (SDLC) y, preferiblemente, basarse en metodologías modernas como DevSecOps, que buscan integrar la seguridad en cada fase del desarrollo, desde el diseño hasta el despliegue.
¿Existe un software seguro al 100%?
Para abordar correctamente este tema, primero debemos aclarar qué se entiende por la expresión Secure Code. En un sentido absoluto, un código libre de cualquier vulnerabilidad presente o futura es poco más que una utopía, ya que el software vive en un ecosistema en continua evolución. Cada día se descubren nuevas vulnerabilidades, el software debe actualizarse (operación que podría introducir nuevas amenazas), los requisitos normativos cambian y los atacantes son cada vez más competentes y astutos.
Además, en un proyecto de desarrollo de software, es necesario considerar el equilibrio entre seguridad, rendimiento y costes. Aplicar todas las medidas de seguridad posibles al código haría que muchas aplicaciones fueran lentas, demasiado costosas o imposibles de lanzar en los tiempos que exige el negocio. En otros términos, un enfoque "all-in" para la seguridad del código no es sostenible.
Lo que hace seguro al software es el proceso
Hablar de Secure Code significa construir aplicaciones seguras de manera razonada; es decir, en función del contexto en el que el software va a operar. Una aplicación interna o con datos de baja sensibilidad, por ejemplo, tendrá necesidades de protección muy distintas a las de un sistema de gestión sanitaria o una plataforma de pagos online.
Integrar medidas de seguridad en el código de la aplicación es, por tanto, parte de un proceso más amplio que podríamos sintetizar de la siguiente manera:
- Análisis de los requisitos de seguridad tanto funcionales (autenticación, cifrado, validación de entradas...) como no funcionales (rendimiento, usabilidad bajo restricciones de seguridad...).
- Threat modeling (Modelado de amenazas): identificar las amenazas a las que está sujeta la aplicación, teniendo en cuenta usuarios, entornos, actores hostiles y posibles vectores de ataque. Esta fase es fundamental para definir prioridades y evitar dedicar el mismo tiempo y recursos a todas las amenazas.
- Selección de medidas de seguridad: basándose en los riesgos identificados, se eligen las medidas concretas y se define dónde aplicarlas: validación de inputs, gestión segura de sesiones, logging seguro, etc.
- Escritura del código: el código se escribe incluyendo las protecciones necesarias, siguiendo guías compartidas y políticas de seguridad coherentes.
- Testing del código a través de análisis estáticos (SAST), dinámicos (DAST) y, cada vez más a menudo, pruebas de penetración (penetration tests) para detectar vulnerabilidades antes del lanzamiento.
Cuando este proceso se integra sin fricciones en los flujos de trabajo (con herramientas, políticas y una cultura compartida), se obtiene un modelo virtuoso y un aplicativo que se puede definir como seguro.
Integrar la seguridad en el código: método y referencias compartidas
Una vez completados el análisis de requisitos, el modelado de amenazas y la selección de medidas, llega el momento de traducir las decisiones en código. Aquí no basta con el sentido común del desarrollador, sus competencias o la sensibilidad del equipo: hace falta un método compartido, estructurado y coherente en el tiempo.
La centralidad de las mejores prácticas compartidas
Para integrar las medidas de seguridad en el código, cada equipo (interno o externo) debe seguir una base de mejores prácticas comunes. Esto no solo ayuda a evitar vulnerabilidades conocidas, sino que garantiza la uniformidad entre los proyectos de la empresa.
Sin referencias precisas, cada aplicación corre el riesgo de ser un caso aislado. Si surgieran nuevas amenazas (como una dependencia común comprometida), la empresa no tendría una visión clara de qué software está expuesto. Cada verificación se convertiría en una investigación independiente, con el consiguiente gasto de tiempo y recursos.
Referencias internacionales: de ISO 27001 a OWASP
Afortunadamente, las empresas no están obligadas a desarrollar su propio marco de secure coding. Con el tiempo, han surgido diversas referencias internacionales:
- CERT Secure Coding Standards: desarrollados por el Software Engineering Institute de la Universidad Carnegie Mellon, cubren lenguajes como C, C++, Java y Perl.
- NIST SSDF (Secure Software Development Framework): un marco adaptable a diversas metodologías inspirado en el concepto de security by design.
- ISO/IEC 27034: estándar internacional para la Seguridad de Aplicaciones, que proporciona una plataforma para integrar la seguridad en la gestión de sistemas de software.
- OWASP Secure Coding Practices: una guía orientada a la acción para ayudar a escribir código seguro en aplicaciones web y otros escenarios. Está organizada por áreas temáticas (validación de entradas, autenticación, control de accesos, gestión de errores...) y ofrece indicaciones prácticas para los flujos de desarrollo modernos. Está pensada para ser una referencia operativa, que se debe tener a mano tanto durante el desarrollo propiamente dicho como después de haber identificado qué aplicar y de qué manera.
Del punto de referencia a la acción concreta
Contar con una guía o un estándar de referencia es fundamental, pero traducir los principios en actividades concretas requiere adaptarlos a la realidad de la empresa, es decir, a sus procesos, funciones y herramientas. En términos prácticos, esto significa:
- Formalizar políticas de secure coding corporativas, basadas en referencias consolidadas (como OWASP), pero adaptadas al contexto específico de la organización y a su manera de "producir" software.
- Integrar controles automáticos en el ciclo de desarrollo mediante herramientas SAST (Static Application Security Testing) y escaneo de dependencias, asegurando su correcta integración en las canalizaciones de CI/CD.
- Crear listas de verificación (checklist) y plantillas de proyecto, para ayudar a los equipos a no olvidar aspectos críticos como la gestión de errores, el hardening de las configuraciones o la validación de entradas (inputs).
- Prever momentos de formación continua, porque la seguridad no es estática y las amenazas evolucionan con gran rapidez.
Si deseáis transformar los principios del secure coding en prácticas operativas, nuestro equipo está listo para acompañaros con servicios de desarrollo de software seguro e integración DevSecOps: contactad con nosotros para evaluar juntos la mejor solución para vuestra realidad.
