stringtranslate.com

Prueba diferencial

Las pruebas diferenciales , [1] también conocidas como fuzzing diferencial , son una técnica de pruebas de software que detecta errores al proporcionar la misma entrada a una serie de aplicaciones similares (o a diferentes implementaciones de la misma aplicación) y observar las diferencias en su ejecución. Las pruebas diferenciales complementan las pruebas de software tradicionales porque son adecuadas para encontrar errores semánticos o lógicos que no exhiban comportamientos erróneos explícitos como fallas o fallas de aserción. Las pruebas diferenciales también se denominan pruebas consecutivas.

Las pruebas diferenciales encuentran errores semánticos al usar diferentes implementaciones de la misma funcionalidad como oráculos de referencia cruzada , señalando diferencias en sus salidas sobre la misma entrada: cualquier discrepancia entre los comportamientos del programa en la misma entrada se marca como un error potencial.

Dominios de aplicación

Las pruebas diferenciales se han utilizado para encontrar errores semánticos con éxito en diversos dominios como implementaciones de SSL/TLS , [2] [3] [4] [5] compiladores de C , [6] implementaciones de JVM , [7] firewalls de aplicaciones web , [8] políticas de seguridad para API , [9] software antivirus , [4] [10] y sistemas de archivos . [11] Las pruebas diferenciales también se han utilizado para la generación automatizada de huellas dactilares a partir de diferentes implementaciones de protocolos de red . [12]

Generación de entrada

Sin guía

Las herramientas de prueba diferencial no guiadas generan entradas de prueba de forma independiente a lo largo de las iteraciones sin tener en cuenta el comportamiento del programa de prueba en las entradas anteriores. Este proceso de generación de entradas no utiliza ninguna información de las entradas anteriores y, en esencia, crea nuevas entradas al azar a partir de un espacio de entrada prohibitivamente grande. Esto puede hacer que el proceso de prueba sea muy ineficiente, ya que se deben generar grandes cantidades de entradas para encontrar un solo error.

Un ejemplo de un sistema de pruebas diferenciales que genera entradas sin guía es "Frankencerts". [2] Este trabajo sintetiza Frankencerts combinando aleatoriamente partes de certificados reales. Utiliza certificados sintácticamente válidos para probar violaciones semánticas de la validación de certificados SSL/TLS en múltiples implementaciones. Sin embargo, dado que la creación y selección de Frankencerts no se realiza de forma guiada, es significativamente ineficiente en comparación con las herramientas guiadas.

Guiado

El proceso de generación de entradas guiadas tiene como objetivo minimizar la cantidad de entradas necesarias para encontrar cada error teniendo en cuenta la información sobre el comportamiento del programa para las entradas anteriores.

Orientación evolutiva específica del dominio

Un ejemplo de un sistema de prueba diferencial que realiza una generación de entrada guiada por cobertura específica del dominio es Mucerts. [3] Mucerts se basa en el conocimiento de la gramática parcial del formato de certificado X.509 y utiliza un algoritmo de muestreo estocástico para impulsar su generación de entrada mientras rastrea la cobertura del programa.

Otra línea de investigación se basa en la observación de que el problema de la generación de nuevas entradas a partir de entradas existentes se puede modelar como un proceso estocástico. Un ejemplo de una herramienta de prueba diferencial que utiliza un modelado de proceso estocástico de este tipo para la generación de entradas es la herramienta de Chen et al. [7] Realiza pruebas diferenciales de máquinas virtuales Java (JVM) utilizando el muestreo de Monte Carlo de cadena de Markov (MCMC) para la generación de entradas. Utiliza mutaciones personalizadas específicas del dominio aprovechando el conocimiento detallado del formato de archivo de clase Java.

Orientación evolutiva independiente del dominio

NEZHA [4] es un ejemplo de una herramienta de prueba diferencial que tiene un mecanismo de selección de ruta orientado a la prueba diferencial independiente del dominio. Utiliza métricas específicas (denominadas diversidad delta) que resumen y cuantifican las asimetrías observadas entre los comportamientos de múltiples aplicaciones de prueba. Estas métricas que promueven la diversidad relativa del comportamiento observado del programa han demostrado ser efectivas para aplicar pruebas diferenciales de manera independiente del dominio y de caja negra.

Orientación basada en el aprendizaje automático

Para aplicaciones como filtros de secuencias de comandos entre sitios (XSS) y verificación de nombres de host de certificados X.509, que se pueden modelar con precisión con autómatas de estados finitos (FSA), se pueden utilizar técnicas de aprendizaje de FSA basadas en contraejemplos para generar entradas que tengan más probabilidades de encontrar errores. [8] [5]

Orientación basada en ejecución simbólica

La ejecución simbólica [13] es una técnica de caja blanca que ejecuta un programa simbólicamente, calcula restricciones a lo largo de diferentes rutas y utiliza un solucionador de restricciones para generar entradas que satisfacen las restricciones recopiladas a lo largo de cada ruta. La ejecución simbólica también se puede utilizar para generar entradas para pruebas diferenciales. [12] [14]

La limitación inherente de las herramientas de prueba asistidas por ejecución simbólica (explosión de rutas y escalabilidad) se magnifica especialmente en el contexto de pruebas diferenciales donde se utilizan múltiples programas de prueba. Por lo tanto, es muy difícil escalar las técnicas de ejecución simbólica para realizar pruebas diferenciales de múltiples programas grandes.

Véase también

Referencias

  1. ^ William M. McKeeman, “Pruebas diferenciales para software”, Digital Technical Journal, vol. 10, núm. 1, págs. 100–107, 1998.
  2. ^ ab C. Brubaker, S. Jana, B. Ray, S. Khurshid y V. Shmatikov, “Uso de frankencerts para pruebas adversarias automatizadas de validación de certificados en implementaciones SSL/TLS”, en Actas del Simposio IEEE sobre Seguridad y Privacidad (S&P) de 2014. IEEE Computer Society, 2014, págs. 114-129.
  3. ^ ab Y. Chen y Z. Su, “Pruebas diferenciales guiadas de validación de certificados en implementaciones SSL/TLS”, en Actas de la 10.ª Reunión conjunta sobre fundamentos de la ingeniería de software (FSE). ACM, 2015, págs. 793– 804.
  4. ^ abc Petsios, T., Tang, A., Stolfo, S., Keromytis, AD y Jana, S. (mayo de 2017). NEZHA: Pruebas diferenciales independientes del dominio eficientes. En Actas del 38.º Simposio IEEE sobre seguridad y privacidad (San José, CA).
  5. ^ ab S. Sivakorn, G. Argyros, K. Pei, AD Keromytis y S. Jana, "HVLearn: Análisis automatizado de caja negra de la verificación de nombre de host en implementaciones SSL/TLS", Simposio IEEE sobre seguridad y privacidad (S&P) de 2017, San José, California, EE. UU., 2017, págs. 521–538.
  6. ^ X. Yang, Y. Chen, E. Eide y J. Regehr, “Cómo encontrar y comprender errores en los compiladores de C”, en Actas de la 32.ª Conferencia SIGPLAN de la ACM sobre diseño e implementación de lenguajes de programación (PLDI). ACM, 2011, págs. 283–294.
  7. ^ ab Y. Chen, T. Su, C. Sun, Z. Su y J. Zhao, “Pruebas diferenciales dirigidas por cobertura de implementaciones de JVM”, en Actas de la 37.ª Conferencia SIGPLAN de la ACM sobre diseño e implementación de lenguajes de programación (PLDI). ACM, 2016, págs. 85–99.
  8. ^ ab G. Argyros, I. Stais, S. Jana, AD Keromytis y A. Kiayias, “SFADiff: ataques de evasión automatizados y toma de huellas digitales mediante aprendizaje de autómatas diferenciales de caja negra”, en Actas de la Conferencia ACM SIGSAC de 2016 sobre seguridad informática y de comunicaciones (CCS). ACM, 2016, págs. 1690–1701.
  9. ^ V. Srivastava, MD Bond, KS McKinley y V. Shmatikov, “Un oráculo de políticas de seguridad: detección de agujeros de seguridad mediante múltiples implementaciones de API”, ACM SIGPLAN Notices, vol. 46, núm. 6, págs. 343–354, 2011.
  10. ^ S. Jana y V. Shmatikov, “Abusing file processing in malware detectors for fun and profit” (Abusar del procesamiento de archivos en detectores de malware por diversión y beneficio), en Actas del Simposio IEEE sobre Seguridad y Privacidad de 2012 (S&P). IEEE Computer Society, 2012, págs. 80-94.
  11. ^ Y. Liu, M. Adkar, G. Holzmann, G. Kuenning, P. Liu, SA Smolka, W. Su y E. Zadok, “Metis: comprobación del modelo del sistema de archivos mediante la exploración versátil de entradas y estados”, en la 22.ª Conferencia USENIX sobre tecnologías de archivos y almacenamiento (FAST '24). Asociación USENIX, 2024, págs. 123-140.
  12. ^ ab D. Brumley, J. Caballero, Z. Liang, J. Newsome y D. Song, “Hacia el descubrimiento automático de desviaciones en implementaciones binarias con aplicaciones para la detección de errores y la generación de huellas digitales”, en el 16.º Simposio de Seguridad USENIX (USENIX Security '07). Asociación USENIX, 2007.
  13. ^ JC King, “Ejecución simbólica y pruebas de programas”, Communications of the ACM, vol. 19, núm. 7, págs. 385–394, 1976.
  14. ^ DA Ramos y DR Engler, “Verificación de equivalencia práctica y de bajo esfuerzo de código real”, en International Conference on Computer Aided Verification. Springer, 2011, págs. 669–685.