Hice esta pregunta en StackOverflow pero no obtuve respuestas, así que pensé que probaría suerte aquí ya que fuzzing está estrechamente relacionado con la seguridad y se usa a menudo en pruebas de evaluación de vulnerabilidad.
Actualmente estoy escribiendo un fuzzer que generará una carga útil basada en un formato de especificación personalizado.
Todo está bien y estoy contento con la primera versión que escribí, pero tuve un problema al intentar aplicar este fuzzer a una tarea que no era mi caso de uso inicial.
El problema está relacionado con cómo la entrada del fuzzer afectará el entorno de prueba.
E.g:
-
Si el método probado construye un búfer con tamaño variable, ¿qué pasaría si el valor generado es
2^64
y provocaría un error de falta de memoria (OOM)? -
Si el método de prueba elimina un archivo especificado por un nombre de archivo variable, ¿qué pasaría si el valor generado es
*
y se eliminara todo el directorio?
Por supuesto, estos son solo algunos ejemplos ingenuos, pero el punto es que estoy tratando de encontrar una manera de reducir las consecuencias de la confusión en el entorno de prueba (aunque aún sea portátil).
Esto haría que fuzzer sea más seguro de usar pero también más fluido, ya que los casos de prueba fuzz podrían encadenarse fácilmente y ejecutarse en paralelo sin romper o dañar el medio ambiente cada otra carga útil.
Hay algunas soluciones radicales como:
- no usar fuzzing en métodos que podrían tener efectos secundarios críticos y consecuencias
- entradas negras en listas negras / listas blancas en ciertos casos de uso
En mi opinión, ambos serían realmente limitantes y dificultarían el uso genérico del fuzzer en las pruebas de fuzz de caja negra.
Otras posibles soluciones como:
- ejecutar pruebas en una máquina virtual sin cabeza como Vagrant
- ejecutar pruebas en un contenedor de Linux como Docker
- interceptar ciertos syscalls como llamadas de E / S y desinfectar sus entradas
son válidos, pero todos sufren el problema de que son de muy alto nivel. Syscalls y Docker también tienen el problema de no ser muy portátiles.
¿Cómo manejan este problema más fuzzers profesionales / empresariales?
Me imagino que el software de prueba de caja negra probablemente solucionó este problema de manera portátil, ¿no?