web-dev-qa-db-ja.com

セロリのピクルスのシリアル化を禁止する方法

Celeryは、デフォルトで、タスクのシリアル化方法としてpickleを使用します。 [〜#〜] faq [〜#〜] に記載されているように、これはセキュリティホールを表しています。 Celeryでは、CELERY_TASK_SERIALIZER構成パラメーターを使用して、タスクをシリアル化する方法を構成できます。

しかし、これはセキュリティの問題を解決しません。タスクがJSONなどでシリアル化されている場合でも、ワーカーはピクルシリアル化でキューに挿入されたタスクを実行します。メッセージのcontent-typeパラメーターに応答するだけです。したがって、タスクキューに書き込むことができる人は誰でも、悪意のあるpickle化されたオブジェクトを書き込むことによってワーカープロセスを効果的にパウニングできます。

ワーカースレッドがpickleでシリアル化されたタスクを実行しないようにするにはどうすればよいですか?

41
Leopd

セロリユーザーのメーリングリストから回答を得ました(具体的にはAsk Solemから)。次の2行を構成(celeryconfig/settings)に追加します。

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

「ContentDisallowed:pickle型の信頼できないコンテンツの逆シリアル化を拒否する(application/x-python-serialize)」というメッセージが表示されていました。

持っている:

CELERY_ACCEPT_CONTENT = ['json']

十分ではありませんでした...設定に次のものも追加する必要がありました。

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
63
naoko

Celeryがアプリごとの構成をサポートするようになったため、コンシューマーが実行するコンテンツを制限するためのよりクリーンな方法があります。

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

詳細、およびコンテンツへの署名など​​のより高度なセキュリティオプションについては、 セキュリティに関するCeleryドキュメント を参照してください。

5
sirdodger