¿Qué idiomas se utilizan para el software crítico para la seguridad? [cerrado]

StackOverflow https://stackoverflow.com/questions/243387

  •  04-07-2019
  •  | 
  •  

Pregunta

Estoy investigando el desarrollo de software crítico para la seguridad y, en particular, qué efectos tiene la elección del lenguaje de programación en dicho desarrollo.

Explique, en detalle, qué idiomas se usan comúnmente y por qué.

¿Fue útil?

Solución

Ada y SPARK (que es un dialecto de Ada con algunos ganchos para verificación estática) se utilizan en círculos aeroespaciales para crear software de alta confiabilidad, como los sistemas de aviónica. Hay algo de un ecosistema de herramientas de verificación de código para estos idiomas , aunque esta tecnología también existe para más idiomas de uso general también .

Erlang era diseñado desde cero para escribir código de telecomunicaciones de alta confiabilidad . Está diseñado para facilitar la separación de las preocupaciones por la recuperación de errores (es decir, el subsistema que genera el error es diferente del subsistema que maneja el error). También puede someterse a pruebas formales, aunque esta capacidad no se ha alejado mucho de los círculos de investigación.

Idiomas funcionales como Haskell puede someterse a pruebas formales mediante sistemas automatizados debido a la naturaleza declarativa del lenguaje. Esto permite que el código con efectos secundarios esté contenido en funciones monádicas. Para una prueba de corrección formal, se puede suponer que el resto del código no hace nada más que lo que se especifica.

Sin embargo, estos idiomas se recolectan en la basura y la recolección de basura es transparente al código, por lo que no se puede razonar de esta manera. Los idiomas de recolección de basura normalmente no son lo suficientemente predecibles para aplicaciones difíciles en tiempo real, aunque hay un cuerpo de investigación en curso en recolectores de basura incrementales con límite de tiempo.

Eiffel y sus descendientes tienen soporte incorporado para una técnica llamada Design By Contract que proporciona un mecanismo de tiempo de ejecución robusto para incorporar las comprobaciones previas y posteriores para invariantes. Si bien Eiffel nunca tuvo éxito, el desarrollo de software de alta confiabilidad tiende a consistir en escribir cheques y controladores para modos de fallo por adelantado antes de escribir la funcionalidad.

Aunque C y C ++ no fueron diseñados específicamente para este tipo de aplicación, se usan ampliamente para software integrado y crítico para la seguridad por varias razones. Las principales propiedades de note son el control sobre la administración de la memoria (que le permite evitar tener que recolectar basura, por ejemplo), bibliotecas de tiempo de ejecución básicas y bien depuradas y soporte de herramientas maduras. Muchas de las cadenas de herramientas de desarrollo integradas en uso hoy en día se desarrollaron por primera vez en los años 80 y 90, cuando se trataba de la tecnología actual y proceden de la cultura Unix que prevalecía en ese momento, por lo que estas herramientas siguen siendo populares para este tipo de trabajo. p>

Si bien el código de administración de memoria manual debe revisarse cuidadosamente para evitar errores, permite un grado de control sobre los tiempos de respuesta de la aplicación que no está disponible con idiomas que dependen de recolección de basura. The las bibliotecas de tiempo de ejecución principales de los lenguajes C y C ++ son relativamente simples, maduras y bien entendidas, por lo que se encuentran entre las plataformas más estables disponibles. La mayoría, si no todas, las herramientas de análisis estático utilizadas para Ada también son compatibles con C y C ++, y hay muchas otras herramientas similares disponibles para C . También hay también varias ampliamente utilizado C / C ++ based herramienta cadenas ; la mayoría de las cadenas de herramientas utilizadas para Ada también vienen en versiones que admiten C y / o C ++.

Métodos formales como Semántica axiomática (PDF), Notación Z o Comunicación de procesos secuenciales permite que la lógica del programa se verifique matemáticamente, y se usa a menudo en el diseño de seguridad software crítico donde la aplicación es lo suficientemente simple como para aplicarlos (por lo general, sistemas de control integrados). Por ejemplo, uno de mis profesores anteriores hizo una prueba formal de corrección de un sistema de señalización Para la red ferroviaria alemana.

La principal deficiencia de los métodos formales es su tendencia a crecer exponencialmente en complejidad con respecto al sistema subyacente que se está probando. Esto significa que existe un riesgo significativo de errores en la prueba, por lo que están prácticamente limitados a aplicaciones bastante simples. Los métodos formales se utilizan ampliamente para verificar la corrección del hardware, ya que los errores de hardware son muy costosos de solucionar, en particular en los productos del mercado masivo. Desde el error de Pentium FDIV , los métodos formales han ganado mucha atención y han sido utilizado para verificar la corrección de la FPU en todos los procesadores Intel desde el Pentium Pro.

Se han usado muchos otros lenguajes para desarrollar software altamente confiable. Se ha realizado mucha investigación sobre el tema. Uno puede razonablemente argumentar que la metodología es más importante que la plataforma aunque hay Principios como la simplicidad y la selección y control de dependencias que podrían excluir el uso de ciertas plataformas .

Como han señalado varios de los otros, ciertas plataformas O / S tienen características para promover la confiabilidad y el comportamiento predecible, como los temporizadores de vigilancia y los tiempos de respuesta de interrupción garantizados. La simplicidad también es un fuerte factor de fiabilidad, y muchos sistemas de RT se mantienen deliberadamente muy simples y compactos. QNX (el único O / S con el que estoy familiarizado, que una vez trabajé con un sistema de procesamiento por lotes de concreto basado en él) es muy pequeño y cabe en un solo disquete. Por motivos similares, las personas que hacen OpenBSD , que es conocida por su seguridad robusta y la exhaustiva auditoría de código, también van fuera de su camino mantener el sistema simple.

EDITAR: Esta publicación tiene algunos enlaces a buenos artículos sobre software crítico para la seguridad, en particular Aquí y Aquí . Atrezzo a S.Lott y Adam Davis por la fuente. La historia de THERAC-25 es un trabajo clásico en este campo.

Otros consejos

Para C ++, el estándar de codificación C ++ de Joint Strike Fighter (F-35) es una buena lectura:

http://www.stroustrup.com/JSF-AV-rules.pdf

Creo que Ada todavía está en uso en algunos proyectos gubernamentales que son de seguridad y / o misión crítica. Nunca he usado el idioma, pero está en mi lista de " para aprender " ;, junto con Eiffel. Eiffel ofrece Design By Contract, que se supone mejora la confiabilidad y la seguridad.

En primer lugar, el software de seguridad crítica se adhiere a los mismos principios que vería en los campos clásicos de la ingeniería mecánica y eléctrica. Redundancia, tolerancia a fallos y seguridad ante fallos.

Como nota aparte, y como se aludió al póster anterior (y por alguna razón se rechazó), el factor más importante para poder lograr esto es que su equipo tenga una comprensión sólida de todo lo que es continuando No hace falta decir que un buen diseño de software de tu parte es clave. Pero también implica un lenguaje que es accesible, maduro, bien soportado, para el cual hay mucho conocimiento comunitario y desarrolladores con experiencia disponibles.

Muchos carteles ya han comentado que el sistema operativo es un elemento clave a este respecto, lo cual es muy cierto porque debe ser determinista (ver QNX o VxWorks). Esto descarta la mayoría de los idiomas interpretados que hacen cosas detrás de escena por usted.

ADA es una posibilidad, pero hay menos herramientas y apoyo, y lo que es más importante, las personas estelares no están tan fácilmente disponibles.

C ++ es una posibilidad, pero solo si aplica estrictamente un subconjunto. En este sentido, es la herramienta del diablo, que promete hacer nuestra vida más fácil, pero a menudo haciendo demasiado,

C es ideal. Es muy maduro, rápido, tiene un conjunto diverso de herramientas y soporte, muchos desarrolladores experimentados, multiplataforma y extremadamente flexible, pueden trabajar cerca del hardware.

He desarrollado en todo, desde smalltalk a ruby, y aprecio y disfruto todo lo que los idiomas superiores tienen para ofrecer. Pero cuando estoy haciendo desarrollo de sistemas críticos, muerdo la bala y me quedo con C. En mi experiencia (defensa y muchos dispositivos médicos de clase II y III) menos es más.

Recogería haskell si es seguridad sobre todo lo demás. Propongo haskell porque tiene una verificación de tipos estática muy rígida y promueve la programación en la que se construyen partes de tal manera que son muy fáciles de probar.

Pero entonces no me importaría mucho el lenguaje. Puede obtener una seguridad mucho mayor sin comprometer tanto si su proyecto está en condiciones y trabaja sin plazos. En general como en tener toda la gestión básica del proyecto en su lugar. Quizás me concentraría en las pruebas exhaustivas para garantizar que todo funcione como debería, pruebas que cubren todos los casos de esquina + más.

El lenguaje y el sistema operativo son importantes, pero también lo es el diseño. Intenta mantenerlo simple, sencillo.

Comenzaría por tener el mínimo de información de estado (datos en tiempo de ejecución), para minimizar la posibilidad de que sea inconsistente. Luego, si desea tener redundancia con el propósito de la tolerancia a fallas, asegúrese de tener maneras infalibles de recuperarse de la inconsistencia de los datos. La redundancia sin una manera de recuperarse de la inconsistencia es solo pedir problemas.

Siempre tiene un respaldo para cuando las acciones solicitadas no se completen en un tiempo razonable. Como dicen en el control de tráfico aéreo, una autorización no reconocida no es una autorización.

No tengas miedo de los métodos de votación. Son simples y confiables, incluso si pueden desperdiciar algunos ciclos. Evite el procesamiento que se basa únicamente en eventos o notificaciones, ya que pueden eliminarse, duplicarse o desordenarse fácilmente. Como complemento del sondeo, están bien.

Un amigo mío en el proyecto APOLLO comentó una vez que sabía que se estaban poniendo serios cuando decidieron confiar en las encuestas, en lugar de en los eventos, a pesar de que la computadora era tremendamente lenta.

P.S. Acabo de leer los estándares de C ++ Air Vehicle. Están bien, pero parecen asumir que habrá muchas clases, datos, punteros y asignación de memoria dinámica. Eso es exactamente lo que no debería ser más que absolutamente necesario. Debería haber un zar de estructura de datos con una guadaña grande.

El sistema operativo es más importante que el lenguaje. Use un kernel en tiempo real como VxWorks o QNX. Miramos a ambos para controlar robots industriales y decidimos ir con VxWorks. Usamos C para el control real del robot.

Para el software verdaderamente crítico, como los sistemas de aterrizaje automático de aeronaves, desea que múltiples procesadores que se ejecutan de forma independiente verifiquen los resultados.

Los entornos en tiempo real por lo general tienen " críticos para la seguridad " requisitos Para ese tipo de cosas, puede consultar VxWorks , Un popular sistema operativo en tiempo real. Actualmente se utiliza en muchos ámbitos diversos, como aviones Boeing, BMW iDrive internos, controladores RAID y varias naves espaciales. ( Echa un vistazo .)

El desarrollo para la plataforma VxWorks se puede realizar con varias herramientas, entre ellas Eclipse , Workbench , SCORE y otros. C, C ++, Ada y Fortran (sí, Fortran) son compatibles, así como algunos otros.

Como no da una plataforma, tendría que decir C / C ++. En la mayoría de las plataformas en tiempo real, de todas formas tienes opciones relativamente limitadas.

Los inconvenientes de la tendencia de C a dejar que te dispares a ti mismo en el pie se compensan con el número de herramientas para validar el código y la estabilidad y el mapeo directo del código a las capacidades de hardware de la plataforma. Además, para algo crítico, no podrá confiar en software de terceros que no se haya revisado exhaustivamente, esto incluye la mayoría de las bibliotecas, incluso muchas de las que proporcionan los proveedores de hardware.

Ya que todo será responsabilidad tuya, quieres un compilador estable, un comportamiento predecible y un mapeo cercano al hardware.

Aquí hay algunas actualizaciones de algunas herramientas que aún no había visto, pero que he estado jugando últimamente, que son bastante buenas.

Infraestructura del compilador de LLVM , una breve reseña en su página principal (incluye los front-ends para C y C ++. Portada -los fines de desarrollo de Java, Scheme y otros lenguajes están en desarrollo);

  

Una infraestructura de compilación: LLVM es también una colección de código fuente que   implementa el lenguaje y   estrategia de compilación. El primario   Componentes de la infraestructura LLVM.   son un C & amp; C ++ front-end, un   marco de optimización de tiempo de enlace con   un conjunto creciente de global y   análisis interprocedimiento y   Transformaciones, back-ends estáticos para.   el X86, X86-64, PowerPC 32/64, ARM,   Pulgar, IA-64, Alpha, SPARC, MIPS y   Las arquitecturas de CellSPU, un back-end.   que emite código C portátil, y un   Compilador Just-In-Time para X86, X86-64,   Procesadores PowerPC 32/64, y un   emisor para MSIL.

VCC ;

  

VCC es una herramienta que prueba la corrección   de programas C anotados concurrentes o   Encuentra problemas en ellos. VCC extiende C   Con características de diseño por contrato, como   Pre y postcondición, así como el tipo   invariantes Los programas anotados son   traducido a fórmulas lógicas utilizando   La herramienta Boogie, que los pasa a   un solver SM3 automatizado Z3 para comprobar   su validez.

VCC utiliza la Infraestructura del compilador común .

Ambas herramientas, LLVM o VCC están diseñadas para ser compatibles con múltiples idiomas y arquitecturas, creo que hay un aumento en la codificación por contrato y otras prácticas de verificación formal.

WPF (no el marco MS) :), es un buen lugar para comenzar si está intentando Evaluar algunas de las investigaciones y herramientas recientes en el espacio de validación del programa.

WG23 es el recurso principal, sin embargo, para los detalles más importantes y específicos del lenguaje de desarrollo de sistemas . Abarcan todo, desde Ada, C, C ++, Java, C #, secuencias de comandos, etc ... y tienen al menos un conjunto de referencias y orientación decente para la dirección para actualizar la información sobre fallas y vulnerabilidades específicas del idioma.

Hay muchas buenas referencias en http://www.dwheeler.com (" alto- software de aseguramiento ").

Para cosas automotrices, vea el estándar MISRA C. C, pero no puedes usar más de dos niveles de punteros y otras cosas como esa.

adahome.com tiene buena información sobre Ada. Me gustó este tutorial de C ++ a Ada: http://adahome.com/Ammo/cpp2ada.html

En tiempo real difícil, Tom Hawkins ha hecho algunas cosas interesantes de Haskell. Consulte: ImProve (el lenguaje incorpora un solucionador de SMT para verificar las condiciones de verificación) y Atom (EDSL para programación concurrente en tiempo real sin utilizar subprocesos o tareas reales).

Un lenguaje que impone patrones cuidadosos puede ayudar, pero puede imponer patrones cuidadosos utilizando cualquier lenguaje, incluso el ensamblador. Cada suposición sobre cada valor necesita un código que pruebe la asunción. Por ejemplo, siempre pruebe el divisor a cero antes de dividir.

Cuanto más pueda confiar en los componentes reutilizables, más fácil será la tarea, pero los componentes reutilizables rara vez se certifican para uso crítico y no lo guiarán a través de los procesos de seguridad reglamentarios. Debe usar un pequeño kernel del sistema operativo y luego construir pequeños módulos que se prueban por unidad con entrada aleatoria. Un lenguaje como Eiffel podría ayudar, pero no hay una bala de plata.

Cualquier producto de software puede pasar el proceso de certificación DO-178b utilizando cualquier herramienta, pero la pregunta es qué tan difícil sería. Si el compilador no está certificado, es posible que deba demostrar que su código es rastreable en el nivel de ensamblaje. Por lo tanto, es útil que su compilador esté certificado. Usamos C en nuestros proyectos, pero tuvimos que verificar a nivel de ensamblaje y usar un código estándar que incluía apagar el optimizador, uso limitado de la pila, uso limitado de interrupciones, bibliotecas transparentes certificables, etc. ADA no es polvo de duendes pero hace que Plan de PSAC parece más alcanzable.

A medida que las aplicaciones se hacen más grandes, el código de ensamblaje se convierte en una opción menos viable. El procesador ARM simplemente invita a C ++, pero si le pregunta a empresas como Kiel si su herramienta está certificada, regresarán con un " ¿eh? & Quot; Y no olvide que las herramientas de verificación también deben estar certificadas. Intente verificar un programa de prueba de LabView.

Actualmente se está desarrollando un nuevo estándar crítico para la seguridad de Java - JSR 302: Tecnología Java de seguridad crítica .

El Java crítico para la seguridad (SCJ) se basa en un subconjunto de RTSJ. El objetivo es tener un marco adecuado para el desarrollo y análisis de programas de seguridad críticos para la certificación de seguridad crítica (DO-178B, Nivel A y otros estándares de seguridad críticos).

SCJ, por ejemplo, elimina el montón, que todavía está presente en RTSJ, también define 3 niveles de cumplimiento que pueden cumplir tanto la aplicación como la implementación de VM, los niveles de cumplimiento se definen para facilitar la certificación de aplicaciones de complejidad diversa.

Recursos :

No sé qué idioma usaría, pero sí sé qué idioma no:

NOTA SOBRE EL SOPORTE DE JAVA. EL PRODUCTO DE SOFTWARE PUEDE CONTENER SOPORTE PARA PROGRAMAS ESCRITOS EN JAVA. LA TECNOLOGÍA JAVA NO ES TOLERANTE POR FALLA Y NO ESTÁ DISEÑADA, FABRICADA O INDICADA PARA EL USO O LA REVENTA DE EQUIPOS DE CONTROL EN LÍNEA EN AMBIENTES PELIGROSOS QUE REQUIEREN RENDIMIENTOS DE SEGURIDAD EN EL ARCHIVO DE NAVEGACIÓN DE BOCINA CONTROL DE TRÁFICO, MÁQUINAS DE APOYO DIRECTO A LA VIDA, O SISTEMAS DE ARMAS, EN LOS QUE LA FALLA DE LA TECNOLOGÍA DE JAVA PODRÍA LLEVAR DIRECTAMENTE A LA MUERTE, LESIONES PERSONALES, O DAÑOS FÍSICOS O AMBIENTALES.

HAL / S se utiliza para el transbordador espacial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top