Cómo rechazar la serialización de pepinillos en el apio.

Celery utiliza de forma predeterminada el pickle como método de serialización para las tareas. Como se señaló en las preguntas frecuentes , esto representa un agujero de seguridad. Celery le permite configurar cómo se serializan las tareas utilizando el parámetro de configuración CELERY_TASK_SERIALIZER .

Pero esto no resuelve el problema de seguridad. Incluso si las tareas se serializan con JSON o similar, los trabajadores seguirán ejecutando las tareas insertadas en la cola con la serialización de salmuera, solo responden al parámetro de content-type en el mensaje. Por lo tanto, cualquier persona que pueda escribir en la cola de tareas puede controlar de manera efectiva los procesos de trabajo escribiendo objetos encurtidos malintencionados.

¿Cómo puedo evitar que los subprocesos de trabajo ejecuten tareas serializadas con pickle?

Recibía “ContentDisallowed: Negarse a deserializar contenido no confiable del tipo pickle (aplicación / x-python-serialize)”

teniendo:

 CELERY_ACCEPT_CONTENT = ['json'] 

no fue suficiente … También tuve que agregar lo siguiente a la configuración:

 CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' 

Obtuve una respuesta de la lista de correo de los usuarios de apio (de Ask Solem para ser más específicos). Agregue estas dos líneas a la configuración (celeryconfig / settings):

 from kombu import serialization serialization.registry._decoders.pop("application/x-python-serialize") 

Ahora que Celery admite la configuración por aplicación, existe una forma más sencilla de restringir el contenido que ejecutará un consumidor.

 c = celery.Celery() c.conf.update(CELERY_ACCEPT_CONTENT = ['json']) 

Consulte la documentación de Celery sobre seguridad para obtener más información y opciones de seguridad más avanzadas, como la firma de contenido.