stringtranslate.com

Inyección de fallas

En informática , la inyección de fallas es una técnica de prueba para comprender cómo se comportan los sistemas informáticos cuando se estresan de manera inusual. Esto se puede lograr utilizando medios físicos o basados ​​en software, o mediante un enfoque híbrido. [1] Las inyecciones de fallas físicas ampliamente estudiadas incluyen la aplicación de altos voltajes, temperaturas extremas y pulsos electromagnéticos en componentes electrónicos, como la memoria de la computadora y las unidades centrales de procesamiento . [2] [3] Al exponer los componentes a condiciones más allá de sus límites operativos previstos, los sistemas informáticos pueden verse obligados a ejecutar incorrectamente instrucciones y corromper datos críticos.

En las pruebas de software , la inyección de fallas es una técnica para mejorar la cobertura de una prueba mediante la introducción de fallas en las rutas del código de prueba; en particular, rutas de código de manejo de errores , que de otro modo rara vez se seguirían. A menudo se utiliza con pruebas de estrés y se considera ampliamente como una parte importante del desarrollo de software sólido . [4] Las pruebas de robustez [5] (también conocidas como pruebas de sintaxis, fuzzing o pruebas de fuzz ) son un tipo de inyección de fallas comúnmente utilizada para probar vulnerabilidades en interfaces de comunicación como protocolos, parámetros de línea de comando o API.

La propagación de una falla hasta una falla observable sigue un ciclo bien definido. Cuando se ejecuta, una falla puede causar un error, que es un estado no válido dentro de los límites del sistema. Un error puede causar más errores dentro de los límites del sistema; por lo tanto, cada nuevo error actúa como una falla o puede propagarse hasta los límites del sistema y ser observable. Cuando se observan estados de error en los límites del sistema, se denominan fallas. Este mecanismo se denomina ciclo falla-error-falla [6] y es un mecanismo clave en la confiabilidad .

Historia

La técnica de inyección de fallos se remonta a la década de 1970 [7], cuando se utilizó por primera vez para inducir fallos a nivel de hardware. Este tipo de inyección de fallas se llama inyección de fallas implementadas por hardware (HWIFI) e intenta simular fallas de hardware dentro de un sistema. Los primeros experimentos con fallos de hardware no implicaron más que cortocircuitar conexiones en placas de circuitos y observar el efecto en el sistema (fallos de puente). Se utilizó principalmente como prueba de la confiabilidad del sistema de hardware. Posteriormente se desarrolló hardware especializado para ampliar esta técnica, como dispositivos para bombardear áreas específicas de una placa de circuito con radiación intensa. Pronto se descubrió que las técnicas de software podían inducir fallos y que algunos aspectos de esta técnica podían ser útiles para evaluar sistemas de software. En conjunto, estas técnicas se conocen como inyección de fallas implementadas por software (SWIFI).

Inyección de fallas implementada por software

Las técnicas SWIFI se pueden clasificar en dos tipos: inyección en tiempo de compilación e inyección en tiempo de ejecución.

La inyección en tiempo de compilación es una técnica de inyección en la que se modifica el código fuente para inyectar fallas simuladas en un sistema. Un método se llama prueba de mutación y cambia las líneas de código existentes para que contengan fallas. Un ejemplo simple de esta técnica podría ser cambiar a = a + 1aa = a – 1

La mutación del código produce fallas que son muy similares a las que los programadores agregan involuntariamente.

Un refinamiento de la mutación de código es la inyección de error de inserción de código , que agrega código, en lugar de modificar el código existente. Esto generalmente se hace mediante el uso de funciones de perturbación, que son funciones simples que toman un valor existente y lo perturban mediante alguna lógica para convertirlo en otro valor, por ejemplo.

 int pFunc ( valor int ) { valor de retorno + 20 ; }         int main ( int argc , char * argv []) { int a = pFunc ( aFunction ( atoi ( argv [ 1 ]))); if ( a > 20 ) { /* hacer algo */ } else { /* hacer algo más */ } }                      

En este caso, pFunc es la función de perturbación y se aplica al valor de retorno de la función que se ha llamado introduciendo una falla en el sistema.

Las técnicas de inyección en tiempo de ejecución utilizan un activador de software para inyectar una falla en un sistema de software en ejecución. Las fallas se pueden inyectar a través de varios métodos físicos y los activadores se pueden implementar de varias maneras, tales como: Activadores basados ​​en tiempo (cuando el temporizador alcanza un tiempo específico, se genera una interrupción y el controlador de interrupciones asociado con el temporizador puede inyectar el falla. ); Activadores basados ​​en interrupciones (las excepciones de hardware y los mecanismos de captura de software se utilizan para generar una interrupción en un lugar específico del código del sistema o en un evento particular dentro del sistema, por ejemplo, el acceso a una ubicación de memoria específica).

Las técnicas de inyección en tiempo de ejecución pueden utilizar varias técnicas diferentes para insertar fallas en un sistema a través de un disparador.

Estas técnicas a menudo se basan en las funciones de depuración proporcionadas por las arquitecturas de procesadores de computadoras.

Inyección de fallos de software de protocolo

Los sistemas de software complejos, especialmente los sistemas distribuidos de múltiples proveedores basados ​​en estándares abiertos, realizan operaciones de entrada/salida para intercambiar datos a través de intercambios estructurados y con estado conocidos como " protocolos ". Un tipo de inyección de fallas que es particularmente útil para probar implementaciones de protocolos (un tipo de código de software que tiene la característica inusual de que no puede predecir ni controlar su entrada) es el fuzzing . Fuzzing es una forma especialmente útil de prueba de caja negra, ya que las diversas entradas no válidas que se envían al sistema de software no dependen de los detalles del código que se ejecuta dentro del sistema y no se crean en función del conocimiento de ellos.

Inyección de fallas implementada por hardware

Esta técnica se aplicó sobre un prototipo de hardware. Los probadores inyectan fallas cambiando el voltaje de algunas partes de un circuito, aumentando o disminuyendo la temperatura, bombardeando la placa con radiación de alta energía, etc.

Características de la inyección de fallas.

Las fallas tienen tres parámetros principales. [8]

Estos parámetros crean el ámbito del espacio de fallas. El ámbito del espacio de fallas aumentará exponencialmente al aumentar la complejidad del sistema. Por lo tanto, el método tradicional de inyección de fallas no será aplicable en los sistemas ciberfísicos modernos, porque serán muy lentos y encontrarán una pequeña cantidad de fallas (menos cobertura de fallas). Por lo tanto, los evaluadores necesitan un algoritmo eficiente para elegir fallas críticas que tengan un mayor impacto en el comportamiento del sistema. Por lo tanto, la principal pregunta de investigación es cómo encontrar fallas críticas en el ámbito del espacio de fallas que tengan efectos catastróficos en el comportamiento del sistema. A continuación se presentan algunos métodos que pueden ayudar a la inyección de fallas a explorar eficientemente el espacio de fallas para alcanzar una mayor cobertura de fallas en menos tiempo de simulación.

Herramientas de inyección de fallos

Aunque este tipo de fallas se pueden inyectar manualmente, la posibilidad de introducir una falla no deseada es alta, por lo que existen herramientas para analizar un programa automáticamente e insertar fallas.

Herramientas de investigación

Se han desarrollado varias herramientas SWIFI y aquí se ofrece una selección de ellas. Seis herramientas de inyección de fallas comúnmente utilizadas son Ferrari, FTAPE, Doctor, Orchestra, Xception y Grid-FIT.

Herramientas comerciales

Bibliotecas

Inyección de fallas en propiedades funcionales o casos de prueba.

A diferencia de las pruebas de mutación tradicionales, en las que se generan fallos mutantes y se inyectan en la descripción del código del modelo, también se ha investigado la aplicación de una serie de operadores de mutación recién definidos directamente a las propiedades del modelo en lugar de al código del modelo. [29] Las propiedades mutantes que se generan a partir de las propiedades iniciales (o casos de prueba) y validadas por el verificador de modelos deben considerarse como nuevas propiedades que se han omitido durante el procedimiento de verificación inicial. Por lo tanto, agregar estas propiedades recientemente identificadas a la lista de propiedades existente mejora la métrica de cobertura de la verificación formal y, en consecuencia, conduce a un diseño más confiable.

Aplicación de inyección de fallas.

La inyección de fallos puede adoptar muchas formas. En las pruebas de sistemas operativos , por ejemplo, la inyección de fallas a menudo la realiza un controlador ( software en modo kernel ) que intercepta las llamadas al sistema (llamadas al kernel) y devuelve aleatoriamente una falla para algunas de las llamadas. Este tipo de inyección de fallas es útil para probar software en modo de usuario de bajo nivel. Para software de nivel superior, varios métodos inyectan fallas. En el código administrado , es común utilizar instrumentación . Aunque la inyección de fallas se puede realizar manualmente, existen varias herramientas de inyección de fallas para automatizar el proceso de inyección de fallas. [30]

Dependiendo de la complejidad de la API para el nivel donde se inyectan las fallas, las pruebas de inyección de fallas a menudo deben diseñarse cuidadosamente para minimizar la cantidad de falsos positivos. Incluso una prueba de inyección de fallos bien diseñada puede a veces producir situaciones que son imposibles en el funcionamiento normal del software. Por ejemplo, imagine que hay dos funciones API , Commity PrepareForCommit, de modo que por sí solas, cada una de estas funciones puede fallar, pero si PrepareForCommitse llama y tiene éxito, Commitse garantiza que una llamada posterior tendrá éxito. Ahora considere el siguiente código:

 error = PrepareForCommit (); if ( error == ÉXITO ) { error = Confirmar (); afirmar ( error == ÉXITO ); }              

A menudo, será inviable que la implementación de la inyección de fallas realice un seguimiento del estado suficiente para garantizar la garantía que brindan las funciones API. En este ejemplo, una prueba de inyección de fallas del código anterior podría afectar a la afirmación , mientras que esto nunca sucedería en el funcionamiento normal.

Ver también

Referencias

  1. ^ Moradi, Mehrdad; Van Acker, Bert; Vanherpen, Ken; Denil, Joaquín (2019). "Inyección de fallas híbridas implementada en modelo para Simulink (demostraciones de herramientas)". En Chamberlain, Roger; Taha, Walid; Törngren, Martín (eds.). Sistemas ciberfísicos. Diseño basado en modelos . Apuntes de conferencias sobre informática. vol. 11615. Publicación internacional Springer. págs. 71–90. doi :10.1007/978-3-030-23703-5_4. ISBN 9783030237035. S2CID  195769468.
  2. ^ Pastor, Carlton; Markantonakis, Konstantinos; Van Heijningen, Nico; Aboulkassimi, Driss; Gaine, Clemente; Heckmann, Thibaut; Naccache, David (2021). "Inyección de fallas físicas y ataques de canal lateral en dispositivos móviles: un análisis integral". Computadoras y seguridad . 111 (102471). Elsevier: 102471. arXiv : 2105.04454 . doi :10.1016/j.cose.2021.102471. S2CID  236957400.
  3. ^ Bar-El, Hagai; Choukri, Hamid; Naccache, David; Tunstall, Michael; Whelan, Claire (2004). "La guía de aprendiz de brujo para los ataques de fallas". Actas del IEEE . 94 (2). IEEE: 370–382. doi :10.1109/JPROC.2005.862424. S2CID  2397174.
  4. ^ J. Voas, "Inyección de fallas para las masas", Computadora, vol. 30, págs. 129-130, 1997.
  5. ^ ab Kaksonen, Rauli. Un método funcional para evaluar la seguridad de la implementación del protocolo. 2001.
  6. ^ A. Avizienis, J.-C. Laprie, Brian Randell y C. Landwehr, "Conceptos básicos y taxonomía de la informática segura y confiable", Computación confiable y segura, vol. 1, págs. 11 a 33, 2004.
  7. ^ ab JV Carreira, D. Costa y SJ G, "Inyección de fallas verifica la confiabilidad del sistema informático", IEEE Spectrum, págs. 50–55, 1999.
  8. ^ Benso, Alfredo; Prinetto, Paolo, eds. (2003). Técnicas y herramientas de inyección de fallas para la evaluación de la confiabilidad de sistemas integrados. Fronteras en pruebas electrónicas. Springer Estados Unidos. ISBN 978-1-4020-7589-6.
  9. ^ "Optimización de la inyección de fallas en la cosimulación de FMI mediante la partición de sensibilidad | Actas de la Conferencia de simulación de verano de 2019". dl.acm.org . Consultado el 14 de junio de 2020 .
  10. ^ Moradi, M., Oakes, BJ, Saraoglu, M., Morozov, A., Janschek, K. y Denil, J., 2020. EXPLORACIÓN DEL ESPACIO DE PARÁMETROS DE FALLAS UTILIZANDO LA INYECCIÓN DE FALLAS BASADA EN EL APRENDIZAJE DE REFUERZO.
  11. ^ Rickard Svenningsson, Jonny Vinter, Henrik Eriksson y Martin Torngren, "MODIFI: una herramienta de inyección de fallas implementada por MODel", Lecture Notes in Computer Science, 2010, volumen 6351/2010, 210-222.
  12. ^ GA Kanawati, NA Kanawati y JA Abraham, "FERRARI: un sistema flexible de inyección de errores y fallas basado en software", IEEE Transactions on Computers, vol. 44, págs. 248, 1995.
  13. ^ T. Tsai y R. Iyer, "FTAPE: una herramienta de inyección de fallas para medir la tolerancia a fallas", presentado en Computing in aerospace, San Antonio; Texas, 1995.
  14. ^ S. Han, KG Shin y HA Rosenberg, "DOCTOR: Un entorno integrado de inyección de fallas de software para sistemas distribuidos en tiempo real", presentado en el Simposio internacional sobre confiabilidad y rendimiento informático, Erlangen; Alemania, 1995.
  15. ^ S. Dawson, F. Jahanian y T. Mitton, "ORQUESTA: Un entorno de sondeo e inyección de fallas para implementaciones de protocolos de prueba", presentado en el Simposio internacional sobre confiabilidad y rendimiento informático, Urbana-Champaign, EE. UU., 1996.
  16. ^ Sitio web Grid-FIT Archivado el 2 de febrero de 2008 en Wayback Machine.
  17. ^ N. Looker, B. Gwynne, J. Xu y M. Munro, "Un enfoque basado en ontologías para determinar la confiabilidad de las arquitecturas orientadas a servicios", en las actas del décimo taller internacional IEEE sobre realidad orientada a objetos. Time Dependable Systems, EE. UU., 2005.
  18. ^ N. Looker, M. Munro y J. Xu, "Una comparación de la inyección de fallas a nivel de red con la inserción de código", en las actas de la 29.ª Conferencia internacional de aplicaciones y software informáticos del IEEE, Escocia, 2005.
  19. ^ Sitio web de LFI
  20. ^ Flatag (16 de mayo de 2020), Flatag/FIBlock , consultado el 16 de mayo de 2020
  21. ^ información del producto beSTORM
  22. ^ Sitio de herramientas ExhaustiF SWIFI
  23. ^ Descripción general del producto Holodeck Archivado el 13 de octubre de 2008 en Wayback Machine.
  24. ^ Descripción general del producto Codenomicon Defensics
  25. ^ Analizador de servicios Mu
  26. ^ Dinámica Mu, Inc.
  27. ^ Sitio web de Xcepción
  28. ^ Software crítico SA
  29. ^ Abbasinasab, Ali; Mohammadi, Mehdi; Mohammadi, Siamak; Yanushkevich, Svetlana; Smith, Michael (2011). "Inyección de fallas mutantes en propiedades funcionales de un modelo para mejorar las métricas de cobertura". 2011 14ª Conferencia Euromicro sobre Diseño de Sistemas Digitales . págs. 422–425. doi :10.1109/DSD.2011.57. ISBN 978-1-4577-1048-3. S2CID  15992130.
  30. ^ N. Looker, M. Munro y J. Xu, "Simulación de errores en servicios web", Revista internacional de sistemas de simulación, ciencia y tecnología, vol. 5, 2004.

enlaces externos