Fuzzing versus Symbolic Execution - ¿cuál es la diferencia?

1

Fuzzing, según la definición actual de Wikipedia, se define de la siguiente manera:

  

Fuzzing o fuzz testing es una técnica de prueba de software automatizada que consiste en proporcionar datos no válidos, inesperados o aleatorios como entradas a un programa de computadora. Luego, el programa se supervisa para detectar excepciones como fallos, fallos en las aserciones de código incorporadas o posibles pérdidas de memoria. Normalmente, los fuzzers se usan para probar programas que toman entradas estructuradas.

     

enlace

La ejecución simbólica, por el contrario, se define de la siguiente manera, también se extrae de Wikipedia:

  

En informática, la ejecución simbólica (también la evaluación simbólica) es un medio para analizar un programa para determinar qué entradas hacen que se ejecuten cada parte de un programa. Un intérprete sigue el programa, asumiendo valores simbólicos para las entradas en lugar de obtener entradas reales como lo haría la ejecución normal del programa, un caso de interpretación abstracta.

     

enlace

Lo que estoy tratando de entender es la diferencia funcional entre estos dos métodos. Veo que la línea que dice que la ejecución simbólica determina "qué entradas hacen que cada parte de un programa se ejecute", por lo que puede diferenciar cada método por el "objetivo" que un investigador de seguridad tiene en mente. Los documentos que he leído recientemente diferencian la ejecución simbólica de la confusión al decir que el primero tiene una sobrecarga significativamente mayor / corre más lentamente.

Desde mi perspectiva, la ejecución simbólica utiliza una forma de "fuzzing dirigido" que afecta específicamente a ciertos valores simbólicos. También he oído decir que la ejecución simbólica es simplemente "un engaño más sofisticado".

¿Puede alguien aclarar cuál es la diferencia real entre los dos y por qué o cuándo deberíamos preferir un método sobre el otro?

    
pregunta Bradley Evans 01.11.2018 - 21:47
fuente

2 respuestas

2
  

¿Puede alguien aclarar cuál es la diferencia real entre los dos y   ¿Por qué o cuándo deberíamos preferir un método sobre el otro?

La ejecución simbólica

(dinámica) a veces se denomina difusa de caja blanca, vea, por ejemplo, SAGE . Fuzzing se puede agrupar en categorías:

  • Blackbox fuzzing: no requiere ninguna información sobre el sistema bajo prueba (SUT). Existen dos estrategias para generar entradas: generar desde una gramática / modelo o mutar desde las existentes.
  • Whitebox fuzzing: requiere toda la información sobre el SUT, incluidas las API, el entorno, etc. Es necesario saber qué instrucción se ejecuta, para que pueda reemplazar la semántica de la instrucción con la semántica simbólica. .
  • Fuzzing Greybox: requiere conocer un poco sobre el SUT, es decir, la transición de bloque básica. Actualmente es el más exitoso, ver, por ejemplo, este caso de trofeos .
  

¿Puede alguien aclarar cuál es la diferencia real entre los dos y   ¿Por qué o cuándo deberíamos preferir un método sobre el otro?

Consideremos un programa con una entrada x , que tiene la siguiente condición: if (x > 5 && x < 10) abort();
Supongamos que x es un número entero, es decir, su dominio es 2 32 . La probabilidad de generar aleatoriamente una entrada x que desencadena el error es 4/2 32 . Esta probabilidad es un poco mayor en el engaño inteligente de greybox, pero en general apestan para este tipo de condición.

Por otra parte, la función de exclusión de whitebox ejecuta el programa con un símbolo x = X , y usa un solucionador de restricciones, por ejemplo. Z3 , para resolver la restricción. Z3 puede resolver X > 5 ∧ X < 10 en mili o nano segundo.

Sin embargo, no hay almuerzo gratis, este poder tiene un precio caro.

  • Un documento reciente muestra que solo para una ruta, es decir, sin restricciones Para resolverlo, una ejecución en KLEE es 3000 veces más lenta que la ejecución nativa, mientras que angr es 300,000 veces más lento. Como es muy lento, no es realista lograr una cobertura del 100%.
  • El solucionador de restricciones solo es bueno para la aritmética lineal. No existe un solucionador eficiente para la teoría de cuerdas, aritmética de punto flotante, etc.
  • No es realista conocer toda la información sobre las API, el entorno, etc.

El estado actual de la técnica es fuzzing híbrido , que combina greybox y whitebox. La idea es usar greybox fuzzer como búsqueda global para muestrear rápidamente el espacio de estado. Cuando se atasca, utilice la caja blanca de peso pesado como búsqueda local . Esta es la técnica utilizada por todo el equipo en el Cyber Grand Challenge . El fuzzer híbrido QSym , ejecutándose en una máquina modesta, descubrió algunos CVE que Google no se pudo encontrar con los fuzzers de greybox corriendo en la nube.

    
respondido por el qsp 02.11.2018 - 07:32
fuente
2
  

¿Puede alguien aclarar cuál es la diferencia real entre los dos y   ¿Por qué o cuándo deberíamos preferir un método sobre el otro?

Al igual que un bate de béisbol, la diferencia está en el objetivo de la persona que lo sostiene: Barry Bonds lo usará de manera diferente a un criminal callejero.

Tanto Fuzzing como Symbolic Execution están incorporando entradas a un programa para aprender algo. En ese sentido, son exactamente lo mismo. Puedes usar muchas de las mismas herramientas para hacer cualquiera de las dos cosas.

Cuando alguien lo llama Fuzzing, se concentran en una amplia variedad de entradas sintéticas, con el objetivo de encontrar entradas que rompan las cosas de una manera que se pueda abusar. Hay un mayor enfoque en las entradas "inválidas", porque ver las entradas válidas manejadas de manera válida no es interesante para la persona que está Fuzzing.

Cuando alguien lo llama Ejecución Simbólica, es probable que tengan un conjunto más pequeño y más consistente de entradas sintéticas. Muchos de ellos serán entradas "válidas" y verificarán que el programa funciona como se espera. Algunos de ellos serán entradas "no válidas" y verificarán que el programa las manejó sin fallar.

Fuzzing se usa para encontrar formas en que los programas se romperán (ya sea para aprovechar o para arreglar).

La ejecución simbólica se utiliza para garantizar la corrección de un programa, para medir cómo maneja las mismas entradas y para ver que el desempeño / estabilidad mejore, no empeore, con el tiempo.

    
respondido por el gowenfawr 02.11.2018 - 00:30
fuente

Lea otras preguntas en las etiquetas