La seguridad del software (a veces denominada seguridad de los sistemas de software) es una disciplina de ingeniería que busca garantizar que el software utilizado en sistemas relacionados con la seguridad (es decir, software de seguridad) no contribuya a los riesgos que dichos sistemas puedan presentar. Existen numerosas normas que rigen el desarrollo y la garantía del software de seguridad en diversos ámbitos. La mayoría de ellas clasifican el software según su criticidad y proponen técnicas y medidas que deben emplearse durante su desarrollo y garantía.
- Software para sistemas electrónicos genéricos relacionados con la seguridad: IEC 61508 [ 1 ] (parte 3 de la norma)
- Software para automoción: ISO 26262 [ 2 ] (parte 6 de la norma)
- Software ferroviario: EN 50716 [ 3 ]
- Software aerotransportado: DO-178C/ED-12C ) [ 4 ]
- Software de gestión del tráfico aéreo: DO-278A/ED-109A [ 5 ]
- Dispositivos médicos: IEC 62304 [ 6 ]
- Centrales nucleares: IEC 60880 [ 7 ]
Terminología
La seguridad del sistema es la disciplina general que busca lograr la seguridad reduciendo los riesgos en los sistemas técnicos a un nivel aceptable. Según la norma de seguridad del sistema IEC 61508 , ampliamente adoptada , [ 1 ] la seguridad es la “ausencia de riesgo inaceptable de daño”. Dado que el software por sí solo —que puede considerarse información pura— no puede causar daño alguno, el término seguridad del software a veces se descarta y se reemplaza por “seguridad del sistema de software” (por ejemplo, el Manual Conjunto de Ingeniería de Seguridad de Sistemas de Software [ 8 ] y MIL-STD-882E [ 9 ] utilizan esta terminología). Esto enfatiza que el software solo puede causar daño en el contexto de un sistema técnico (véase la Guía de Seguridad del Software de la NASA, [ 10 ] capítulo 2.1.2), que tiene algún efecto en su entorno.
El objetivo de la seguridad del software es garantizar que este no cause ni contribuya a ningún riesgo en el sistema donde se utiliza, y que se pueda asegurar y demostrar que así es. Esto se logra generalmente asignando un "nivel de seguridad" al software y seleccionando los procesos adecuados para su desarrollo y garantía.
Asignación de niveles de seguridad
Uno de los primeros pasos al crear software relacionado con la seguridad es clasificar el software según su criticidad de seguridad. Diversas normas sugieren diferentes niveles, por ejemplo, los niveles de software AE en DO-178C , [ 4 ] SIL ( Safety Integrity Level ) 1-4 en IEC 61508, [ 1 ] ASIL ( Automotive Safety Integrity Level ) AD en ISO 26262. [ 2 ] La asignación se realiza normalmente en el contexto de un sistema general, donde se investigan las peores consecuencias de los fallos del software. Por ejemplo, la norma automotriz ISO 26262 requiere la realización de una Evaluación de Peligros y Riesgos ("HARA") a nivel de vehículo para derivar el ASIL del software ejecutado en un componente.
Cumplimiento y garantía del proceso
Es esencial utilizar un proceso de desarrollo y aseguramiento adecuado, con métodos y técnicas apropiadas, acorde con la criticidad de seguridad del software. Las normas de seguridad del software recomiendan y, en ocasiones, prohíben el uso de dichos métodos y técnicas, según el nivel de seguridad. La mayoría de las normas sugieren un modelo de ciclo de vida (por ejemplo, EN 50716, [ 3 ] SIL (Nivel de Integridad de Seguridad) 1-4 en IEC 61508 [ 1 ] sugiere, entre otros, un modelo en V) y prescriben las actividades requeridas que deben ejecutarse durante las distintas fases del software. Por ejemplo, IEC 61508 exige que el software se especifique adecuadamente (por ejemplo, mediante el uso de métodos formales o semiformales), que el diseño del software sea modular y comprobable, que se utilicen lenguajes de programación adecuados, que se realicen revisiones de código documentadas y que las pruebas se realicen en varias capas para lograr una cobertura de pruebas suficientemente alta. El enfoque en el proceso de desarrollo y aseguramiento del software se debe a que la calidad del software (y por lo tanto la seguridad) está fuertemente influenciada por el proceso del software, como sugiere la norma IEC 25010. [ 11 ] Se afirma que el proceso influye en los atributos internos de calidad del software (por ejemplo, la calidad del código) y estos, a su vez, influyen en los atributos externos de calidad del software (por ejemplo, la funcionalidad y la confiabilidad).
Las siguientes actividades y temas abordados en el proceso de desarrollo contribuyen a la seguridad del software.
Documentación
La documentación exhaustiva del proceso completo de desarrollo y aseguramiento es un requisito prácticamente indispensable para todas las normas de seguridad de software. Por lo general, esta documentación es revisada y avalada por terceros, siendo un requisito previo para la aprobación del software relacionado con la seguridad. La documentación abarca diversos documentos de planificación, especificaciones de requisitos, documentación de arquitectura y diseño de software, casos de prueba en distintos niveles de abstracción, informes de cualificación de herramientas, evidencia de revisión, resultados de verificación y validación, etc. La figura C.2 de la norma EN 50716 [ 3 ] enumera 32 documentos que deben crearse a lo largo del ciclo de vida del desarrollo.
Trazabilidad
La trazabilidad es la práctica de establecer relaciones entre diferentes tipos de requisitos y entre los requisitos y los artefactos de diseño, implementación y prueba. Según la norma EN 50716, [ 3 ] el objetivo es “garantizar que se pueda demostrar que todos los requisitos se han cumplido correctamente y que no se ha introducido ningún material no trazable”. Al documentar y mantener la trazabilidad, es posible seguir, por ejemplo, un requisito de seguridad en el diseño de un sistema (para verificar si se ha considerado adecuadamente), más adelante en el código fuente del software (para verificar si el código cumple el requisito) y hasta un caso de prueba apropiado y su ejecución (para verificar si el requisito de seguridad se ha probado adecuadamente).
Implementación de software
Las normas de seguridad pueden tener requisitos que afectan directamente a la implementación del software en el código fuente, como por ejemplo la selección de un lenguaje de programación adecuado, el tamaño y la complejidad de las funciones, el uso de ciertas construcciones de programación y la necesidad de estándares de codificación. La parte 3 de la norma IEC 61508 contiene los siguientes requisitos y recomendaciones:
- Uso de un lenguaje de programación fuertemente tipado. Algunos lenguajes son más adecuados que otros para sistemas relacionados con la seguridad. Los lenguajes que admiten tipado fuerte pueden detectar más fallos durante el proceso de compilación que, de otro modo, solo se detectarían en tiempo de ejecución. Por lo tanto, generalmente se desaconseja el uso de lenguaje ensamblador, mientras que se recomiendan lenguajes de alto nivel especialmente orientados al mercado de la seguridad (por ejemplo, ADA ).
- Utilizar un estándar de codificación apropiado que defina un subconjunto de lenguaje "seguro", por ejemplo, MISRA-C . MISRA-C es un estándar de codificación para el lenguaje de programación C que busca mejorar la calidad y la seguridad del código al prohibir construcciones propensas a errores o características que dependen del compilador (y cuyo comportamiento, por lo tanto, no está definido).
- Limitar el uso de recursión, punteros e interrupciones (ya que son propensos a errores).
- Prohibir el “flujo de control no estructurado en los programas”, es decir, evitar saltos de forma no estructurada, por ejemplo, mediante el uso de instrucciones tipo “ goto ”.
Cobertura de pruebas
Es necesario demostrar una cobertura de pruebas adecuada, es decir, dependiendo del nivel de seguridad, se deben aplicar esquemas de prueba más rigurosos. Un requisito bien conocido con respecto a la cobertura de pruebas según el nivel de software se establece en DO-178C: [ 4 ]
- Nivel C: Se requiere cobertura de sentencias, es decir, "cada sentencia del programa se ha invocado al menos una vez" durante las pruebas.
- Nivel B: Se requiere cobertura de sucursales, es decir, "cada punto de entrada y salida del programa se ha invocado al menos una vez y cada decisión del programa se ha tomado considerando todos los resultados posibles al menos una vez".
- Nivel A: Cobertura de condiciones/decisiones modificada: una extensión de la cobertura de ramas, con el requisito de que "se haya demostrado que cada condición en una decisión afecta de forma independiente el resultado de esa decisión".
Independencia
Los estándares de seguridad de software generalmente requieren que algunas actividades se ejecuten de forma independiente, es decir, por una persona diferente, por una persona con líneas jerárquicas diferentes, o incluso por una organización independiente. Esto garantiza que se eviten los conflictos de intereses y aumenta las posibilidades de que se identifiquen fallos (por ejemplo, en el diseño del software). Por ejemplo, la figura 2 de EN 50716 [ 3 ] requiere que los roles de "implementador", "probador" y "verificador" sean desempeñados por personas diferentes, el rol de "validador" por una persona con una línea jerárquica diferente y el rol de "evaluador" por una persona de una unidad organizativa diferente. DO-178C [ 4 ] y DO-278A [ 5 ] requieren que varias actividades (por ejemplo, verificación de cobertura de pruebas, actividades de aseguramiento) se ejecuten "de forma independiente", entendiendo la independencia como "separación de responsabilidades que garantiza el logro de una evaluación objetiva".
Preguntas y problemas abiertos
Tasas de fallos del software
En la ingeniería de seguridad de sistemas, es común establecer límites superiores para las tasas de fallo de subsistemas o componentes. Posteriormente, debe demostrarse que estos subsistemas o componentes no superan dichas tasas de fallo; de lo contrario, se deben emplear mecanismos de redundancia u otros mecanismos de tolerancia a fallos. Este enfoque no es práctico para el software, ya que las tasas de fallo no pueden predecirse con precisión. Aunque se han realizado investigaciones significativas en el campo de la confiabilidad del software (véase, por ejemplo, Lyu (1996), [ 12 ] las normas de seguridad de software actuales no requieren que se utilice ninguno de estos métodos o incluso desaconsejan su uso, por ejemplo, DO178C [ 4 ] (p. 73) afirma: “Se han publicado muchos métodos para predecir la confiabilidad del software basados en métricas de desarrollo, por ejemplo, estructura del software, tasa de detección de defectos, etc. Este documento no proporciona orientación para ese tipo de métodos, porque en el momento de su redacción, los métodos disponibles actualmente no proporcionaban resultados en los que se pudiera confiar”. ARP 4761 [ 13 ] cláusula 4.1.2 establece que los errores de diseño de software “no son lo mismo que las fallas de hardware. A diferencia de las fallas de hardware, las probabilidades de tales errores no se pueden cuantificar”.
Seguridad y protección
En algunos casos , la seguridad del software y la protección del mismo pueden tener intereses contrapuestos. Por un lado, el software relacionado con la seguridad que no es seguro puede suponer un riesgo para la seguridad; por otro lado, algunas prácticas de seguridad (por ejemplo, la aplicación frecuente y oportuna de parches) contradicen las prácticas de protección establecidas (pruebas y verificaciones rigurosas antes de realizar cualquier cambio en un sistema operativo).
Inteligencia artificial
El software que emplea técnicas de inteligencia artificial, como el aprendizaje automático, sigue un ciclo de vida radicalmente diferente. Además, su comportamiento es más difícil de predecir que el de un sistema desarrollado tradicionalmente. Por lo tanto, la cuestión de si estas tecnologías pueden utilizarse y cómo, se encuentra actualmente en investigación. En la actualidad, las normas generalmente no avalan su uso. Por ejemplo, la norma EN 50716 (Tabla A.3) establece que la inteligencia artificial y el aprendizaje automático no se recomiendan para ningún nivel de integridad de seguridad.
Métodos de desarrollo ágil
El desarrollo ágil de software , que normalmente incluye muchas iteraciones, a veces todavía se estigmatiza como demasiado caótico para el desarrollo de software relacionado con la seguridad. Esto podría deberse en parte a afirmaciones como "software funcional por encima de documentación exhaustiva", que se encuentra en el manifiesto para el desarrollo ágil. [ 14 ] Aunque la mayoría de los estándares de seguridad de software presentan el ciclo de vida del software en la secuencia tradicional tipo cascada , algunos contienen afirmaciones que permiten ciclos de vida más flexibles. DO-178C establece que "Los procesos de un ciclo de vida de software pueden ser iterativos, es decir, entrar y volver a entrar". EN 50716 contiene el Anexo C que muestra cómo se pueden utilizar los ciclos de vida de desarrollo iterativos de acuerdo con los requisitos del estándar.
Objetivos
- La seguridad funcional se logra mediante el desarrollo de ingeniería para garantizar la correcta ejecución y el comportamiento de las funciones del software según lo previsto.
- La seguridad, en consonancia con los requisitos de la misión, se incorpora al software de forma oportuna y rentable.
- En sistemas complejos que implican muchas interacciones, la funcionalidad crítica para la seguridad debe identificarse y analizarse exhaustivamente antes de derivar los riesgos y diseñar medidas de protección para su mitigación.
- Las listas de funciones críticas para la seguridad y las listas preliminares de riesgos deben determinarse de forma proactiva e influir en los requisitos que se implementarán en el software.
- Durante todo el ciclo de vida, se identifican, evalúan y eliminan los factores que contribuyen a los fallos y los riesgos resultantes asociados al sistema y su software, o bien se reduce el riesgo a un nivel aceptable.
- Se minimiza la dependencia de los procedimientos administrativos para el control de riesgos.
- Se minimiza el número y la complejidad de las interfaces críticas para la seguridad.
- Se minimiza el número y la complejidad de los componentes de software informáticos críticos para la seguridad.
- Se aplican principios sólidos de ingeniería humana al diseño de la interfaz de usuario del software para minimizar la probabilidad de error humano.
- En el diseño del software se abordan los modos de fallo, incluidos los de hardware, software, humanos y del sistema.
- En el desarrollo del software se utilizan buenas prácticas de ingeniería de software y una documentación adecuada.
- Las cuestiones y los atributos de seguridad se abordan como parte del proceso de pruebas de software en todos los niveles.
- El software está diseñado para la interfaz hombre-máquina, la facilidad de mantenimiento y modificación o mejora.
- El software con funcionalidades críticas para la seguridad debe verificarse exhaustivamente mediante análisis objetivos y, preferiblemente, pruebas que demuestren que se han cumplido todos los requisitos de seguridad según los criterios establecidos.
Véase también
- Garantía de software
- IEC 61508 - Seguridad funcional de sistemas eléctricos, electrónicos y electrónicos programables relacionados con la seguridad.
- ISO 26262 - Vehículos de carretera – Seguridad funcional
- Seguridad funcional
- Calidad del software
- Accidente del sistema
Notas
Referencias
- 1 2 3 4 IEC (2010). IEC 61508 - Seguridad funcional de sistemas eléctricos/electrónicos/electrónicos programables relacionados con la seguridad . Comisión Electrotécnica Internacional.
- 1 2 ISO (2018). ISO 26262 - Vehículos de carretera — Seguridad funcional . Organización Internacional de Normalización.
- 1 2 3 4 5 CENELEC (2023). EN 50716 - Aplicaciones ferroviarias - Requisitos para el desarrollo de software . CENELEC.
- 1 2 3 4 5 RTCA (2012). DO-178C - Consideraciones de software en la certificación de sistemas y equipos aerotransportados . RTCA (también publicado como ED-12C por Eurocae ).
- 1 2 RTCA (2011). DO-278A - Consideraciones sobre la garantía de integridad del software para sistemas de comunicación, navegación, vigilancia y gestión del tráfico aéreo (CNS/ATM) . RTCA (también publicado como ED-109A por Eurocae ).
- ↑ IEC (2006). Software para dispositivos médicos: procesos del ciclo de vida del software . Comisión Electrotécnica Internacional.
- ↑ IEC (2006). Centrales nucleares: instrumentación y sistemas de control importantes para la seguridad: aspectos de software para sistemas informáticos que realizan funciones de categoría A. Comisión Electrotécnica Internacional.
- ↑ US DoD (2010). Manual de ingeniería de seguridad de sistemas de software conjuntos . Departamento de Defensa de EE. UU.
- ↑ US DoD (2012). MIL-STD-882E - Seguridad del sistema . Departamento de Defensa de EE. UU.
- ^ NASA (2004). Guía de seguridad del software de la NASA . NASA.
- ↑ ISO (2011). ISO 25010 - Ingeniería de sistemas y software — Requisitos y evaluación de la calidad de sistemas y software (SQuaRE) — Modelos de calidad de sistemas y software . Organización Internacional de Normalización.
- ↑ Michael R. Lyu (1996). Manual de ingeniería de confiabilidad de software . IEEE Computer Society Press y McGraw-Hill Book Company.
- ↑ SAE ARP (2023). ARP 4761 - Directrices para llevar a cabo el proceso de evaluación de seguridad en aeronaves, sistemas y equipos civiles . Práctica recomendada aeroespacial de la SAE (también publicada como ED-135 por Eurocae).
- ↑ "Manifiesto para el desarrollo ágil de software" . agilemanifesto.org . Consultado el 25 de diciembre de 2024 .
Este artículo incorpora material de dominio público del Manual de software del Ejército de los Estados Unidos .
- Calidad del software
- Ingeniería de seguridad