Celeryは、デフォルトで、タスクのシリアル化方法としてpickleを使用します。 [〜#〜] faq [〜#〜] に記載されているように、これはセキュリティホールを表しています。 Celeryでは、CELERY_TASK_SERIALIZER
構成パラメーターを使用して、タスクをシリアル化する方法を構成できます。
しかし、これはセキュリティの問題を解決しません。タスクがJSONなどでシリアル化されている場合でも、ワーカーはピクルシリアル化でキューに挿入されたタスクを実行します。メッセージのcontent-type
パラメーターに応答するだけです。したがって、タスクキューに書き込むことができる人は誰でも、悪意のあるpickle化されたオブジェクトを書き込むことによってワーカープロセスを効果的にパウニングできます。
ワーカースレッドがpickleでシリアル化されたタスクを実行しないようにするにはどうすればよいですか?
セロリユーザーのメーリングリストから回答を得ました(具体的にはAsk Solemから)。次の2行を構成(celeryconfig/settings)に追加します。
from kombu import serialization
serialization.registry._decoders.pop("application/x-python-serialize")
「ContentDisallowed:pickle型の信頼できないコンテンツの逆シリアル化を拒否する(application/x-python-serialize)」というメッセージが表示されていました。
持っている:
CELERY_ACCEPT_CONTENT = ['json']
十分ではありませんでした...設定に次のものも追加する必要がありました。
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
Celeryがアプリごとの構成をサポートするようになったため、コンシューマーが実行するコンテンツを制限するためのよりクリーンな方法があります。
c = celery.Celery()
c.conf.update(CELERY_ACCEPT_CONTENT = ['json'])
詳細、およびコンテンツへの署名などのより高度なセキュリティオプションについては、 セキュリティに関するCeleryドキュメント を参照してください。