Vulnerabilidad de ejecución de código arbitrario en NumPy
Hayley Denbraver
5 de febrero de 2019
0 minutos de lecturaUna vulnerabilidad descubierta recientemente en NumPy, el paquete de código abierto ampliamente utilizado para la computación científica en Python, permite ejecutar código arbitrario potencialmente malicioso.
NumPy
NumPy forma parte del ecosistema SciPy, una colección de paquetes de software de código abierto para matemáticas, ciencia e ingeniería. NumPy se utiliza tanto en la industria como en el ámbito académico, y tiene más de 9,000 estrellas en GitHub y más de 700 colaboradores. Según los registros disponibles en BigQuery de PyPI, NumPy se descargó casi 4 millones de veces en los últimos tres meses.
La vulnerabilidad
El 16 de enero de 2019, el usuario de GitHub nanshihui abrió un problema en el que afirmaba que la función numpy.load era vulnerable a la ejecución de código arbitrario debido a la forma en que usaba el módulo pickle de Python. El módulo pickle de Python serializa y deserializa objetos de Python. El «pickling» convierte la jerarquía de objetos de Python en un flujo de bytes, y el «unpickling» toma un flujo de bytes y lo convierte de nuevo en una jerarquía de objetos. Aceptar arreglos serializados con pickle de fuentes no confiables es peligroso porque no hay forma de verificarlos antes de deserializarlos. Si se proporciona código malicioso de shell como entrada, podría ejecutarse al deserializarlo.
La vulnerabilidad está presente en las versiones de NumPy desde la 1.10 (publicada en octubre de 2015) hasta la versión más reciente, la 1.16. Aquí encontrarás más detalles sobre esta vulnerabilidad en la base de datos de Snyk.
De forma predeterminada, las versiones afectadas de NumPy permiten cargar arreglos de objetos serializados con pickle. Esto solo debería hacerse cuando la fuente sea confiable, pero es una mala práctica que sea el comportamiento predeterminado.
Por el momento no se conocen casos en los que se haya explotado esta vulnerabilidad, pero eso podría cambiar a medida que crezca la conciencia sobre el problema. El exploit no requiere autenticación ni muchos conocimientos técnicos para aprovecharlo.
Al momento de escribir esto, todavía no se había publicado un parche ni una actualización, aunque el equipo de NumPy está trabajando en ello. Puedes asegurarte de no ser vulnerable pasando allow_pickle=False a cualquier instancia de numpy.load que cargue datos de una fuente no confiable.
¿Te afecta?
Si usas Snyk, recibirás notificaciones mediante tus alertas habituales si tienes proyectos con dependencias vulnerables de NumPy.
Si todavía no probaste Snyk, considera probar nuestra interfaz fácil de usar o usar nuestra CLI para ejecutar pruebas localmente.
