如何禁止芹菜中的泡菜系列化

Leo*_*opd 41 python security celery

Celery默认使用pickle作为任务的序列化方法.如常见问题解答中所述,这代表了一个安全漏洞.Celery允许您使用CELERY_TASK_SERIALIZER配置参数配置任务的序列化方式.

但这并不能解决安全问题.即使使用JSON或类似方法序列化任务,工作人员仍将使用pickle序列化执行插入队列的任务 - 它们只响应content-type消息中的参数.因此,任何可以写入任务队列的人都可以通过编写恶意的pickle对象来有效地显示工作进程.

如何防止工作线程运行使用pickle序列化的任务?

nao*_*oko 63

我得到了"ContentDisallowed:拒绝反序列化pickle类型的不可信内容(application/x-python-serialize)"

有:

CELERY_ACCEPT_CONTENT = ['json']
Run Code Online (Sandbox Code Playgroud)

还不够......我还必须在设置中添加以下内容:

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
Run Code Online (Sandbox Code Playgroud)


Leo*_*opd 11

我从celery-users邮件列表中得到了答案(来自Ask Solem具体).将这两行添加到配置(celeryconfig/settings):

from kombu import serialization
serialization.registry._decoders.pop("application/x-python-serialize")
Run Code Online (Sandbox Code Playgroud)

  • 使用受保护的方法通常是一个坏主意。我明白在提出这个答案时可能并非如此,但现在肯定不是这样。 (2认同)

sir*_*ger 5

现在Celery支持基于每个应用程序的配置,有一种更简洁的方法来限制消费者将执行的内容.

c = celery.Celery()
c.conf.update(CELERY_ACCEPT_CONTENT = ['json'])
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Celery文档中的安全性,以及更高级的安全性选项,例如签名内容.