Atheris, un kit de herramientas de prueba de código de Python
Google dio a conocer recientemente la liberación del proyecto Atheris, el cual es un desarrollo de un conjunto de herramientas open source especializado para pruebas fuzzing de código Python y extensiones para CPython escrito en C/C++.
El proyecto utiliza un motor basado en libFuzzer y se puede utilizar junto con las herramientas Address Sanitizer y Undefined Behavior Sanitizer para detectar errores adicionales. El código está abierto bajo la licencia Apache 2.0.
Sobre Google Atheris
A palabras de Google Atheris, es un kit de herramientas que se puede usar para encontrar errores automáticamente en el código Python y las extensiones nativas. Atheris es un fuzzer» guiado por cobertura», lo que significa que Atheris probará repetidamente varias entradas a su programa mientras observa cómo se ejecuta e intentará encontrar caminos interesantes.
Se admite la revisión de código para Python 2.7 y Python 3.3+, pero para una cobertura completa guiada, se recomienda utilizar las ramas de Python 3.8 y 3.9, que ahora admiten estadísticas de código de operación por código de operación.
En el proceso, Atheris enumera posibles combinaciones de datos de entrada y genera un informe sobre todas las fallas detectadas y excepciones no detectadas.
Por ejemplo, al verificar la biblioteca de análisis YAML en Atheris, se encontró que algunas construcciones YAML, como especificar «-_» en lugar de un valor entero o usar una lista en lugar de una clave, arrojan una excepción inesperada en lugar de un error estándar de YAMLErrors.
La prueba de fuzz es una técnica bien conocida para descubrir errores de programación. Muchos de estos errores detectables tienen serias implicaciones de seguridad. Google ha encontrado miles de vulnerabilidades de seguridad y otros errores al utilizar esta técnica. Fuzzing se usa tradicionalmente en lenguajes nativos como C o C ++, pero el año pasado creamos un nuevo motor de fuzzing Python. Hoy, lanzamos el motor de fuzzing Atheris como código abierto.
Atheris también se puede utilizar para identificar diferencias en el comportamiento de bibliotecas que tienen como objetivo tareas idénticas. Por ejemplo, una verificación resumida del paquete Python «idna» y la biblioteca «libidn2», que realizan la tarea de decodificar los nombres de dominio internacionalizados, encontró que no siempre producen el mismo resultado.
Uno de los mejores usos de Atheris es para difusores diferenciales . Estos son fuzzers que buscan diferencias en el comportamiento de dos bibliotecas que están destinadas a hacer lo mismo. Uno de los fuzzers de ejemplo empaquetados con Atheris hace exactamente esto para comparar el paquete «idna» de Python con el paquete «libidn2» de C.
En particular, si el dominio usó secuencias Unicode, entonces «idna» y «libidn2» convirtieron el nombre de dominio internacionalizado a diferentes hosts.
En general, Atheris es útil en código Python puro siempre que tenga una forma de expresar cuál es el comportamiento «correcto», o al menos expresar qué comportamientos definitivamente no son correctos. Esto podría ser tan complejo como el código personalizado en el fuzzer que evalúa la exactitud de la salida de una biblioteca, o tan simple como verificar que no haya excepciones inesperadas.están alzadas.
Es importante tomar en cuenta que las pruebas de fuzzing generan un flujo de todo tipo de combinaciones aleatorias de datos de entrada, cerca de los datos reales (por ejemplo, páginas html con parámetros de etiquetas aleatorios, archivos o imágenes con encabezados anormales, etc.) y corrigen posibles fallas en el proceso.
Si alguna secuencia da como resultado una excepción o no coincide con la respuesta esperada, es muy probable que este comportamiento indique un error o vulnerabilidad.
Finalmente, tal y como se mencionó Atheris funciona con código Python en la versión 2.7 y 3.3+, aunque Google recomienda encarecidamente usar 3.8+ y extensiones nativas escritas para CPython.
Windows aún no se encuentra entre los sistemas operativos compatibles, por lo que el motor solo es de interés para los usuarios de Linux y Mac OS X por ahora.
Para emplearlo en esas plataformas, los desarrolladores deben tener instalada una versión actual del frontend del compilador Clang.
Si quieres conocer más al respecto, puedes consultar la nota original en el siguiente enlace.