芹菜默认使用pickle作为任务的序列化方法。如FAQ中所述,这代表了一个安全漏洞。芹菜允许您使用CELERY_TASK_SERIALIZER
配置参数配置任务的序列化方式。
但这并不能解决安全问题。即使任务是用JSON或类似的方式序列化的,工作线程仍然会执行用pickle序列化插入到队列中的任务——它们只是响应消息中的content-type
参数。因此,任何可以写入任务队列的人都可以通过写入恶意pickle对象来有效地控制工作进程。
如何防止工作线程运行用pickle序列化的任务?
我得到"ContentDisallowed:拒绝反序列化类型为pickle的不受信任的内容(application/x-python-serialize)"
:
CELERY_ACCEPT_CONTENT = ['json']
是不够的…我还必须在设置中添加以下内容:
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
我从celry用户邮件列表(具体来说是Ask Solem)得到了一个答案。将这两行添加到配置(celeryconfig/settings):
from kombu import serialization
serialization.registry._decoders.pop("application/x-python-serialize")
既然芹菜支持基于每个应用的配置,那么就有了一种更清晰的方式来限制消费者将执行的内容。
c = celery.Celery()
c.conf.update(CELERY_ACCEPT_CONTENT = ['json'])
请参阅芹菜文档中的安全详细信息,以及更高级的安全选项,如对内容进行签名。