web-dev-qa-db-ja.com

pickleファイルを安全にロードしますか?

Python=アプリでは、pickle.loadを使用してperceptron.pklという名前のファイルをロードしています。HPFortify静的スキャンは、動的コード評価-安全でないPickleを引き起こします逆シリアル化」と同じ行にあります。

どうすればこれを修正できますか?ピクルスを安全に入れる方法はありますか?

6
Pro

Pythonマニュアル には、ピクルモジュールに関する警告が付属しています。

警告pickleモジュールは、誤ったデータまたは悪意を持って作成されたデータに対して安全ではありません。信頼できない、または認証されていないソースから受信したデータを抽出しないでください。

この警告は非常に真剣に受け止められるべきです。信頼できないデータを取り出した場合、攻撃者はシステム上の任意のコードを除外することができます。それは悪いです。ひどい。

ただし、ここでの引用の重要な部分は、「信頼できない、または認証されていないソース」です。悪意のあるアクターが制御できないと確信している静的ファイルをロードしているだけであれば、アンピッキングは安全です。たとえば、ファイルをソースコードと同じアクセス制限で保存した場合、攻撃者はソースコードをピクルスファイルと同様に変更する可能性があります。したがって、アンピッキングはセキュリティリスクである必要はありません。

ファイルを信頼できない場合はどうなりますか?次の2つのオプションがあります。

  1. JSONなど、コード実行に対して脆弱ではない形式に切り替えます。
  2. find_classメソッドを使用して制限付きunpicklerを作成します( マニュアル を参照)。

私の推測では、#2はコードの変更が少なくて済むため、おそらく実装がより迅速になるでしょう。しかし、これはリスクの高い戦略でもあります。マイナーなミスを犯して脆弱性を開くのは非常に簡単だと私は思っています。リスクを最小限に抑えたいのであれば、私は#1に行きます。

10
Anders

ピクルスを安全に入れる方法はありますか?

どのようにでも求めましたが、それは部分的には方法だけでなく、問題のあるピクルスおよび「安全に」という意味に依存します」

「ピクルスの起源を常に知っているので、合理的に安全に」というような意味でない限り、答えはおそらく「いいえ」です。

ただし、答えが「はい」であるいくつかの質問を次に示します。

  • 書いたものであり、輸送中に変更されていないことが100%わかっている場合、ピクルスを安全にロードできますか?
  • ソースが信頼されていて、ピクルスのロード元のファイルが実際にそのソースからのものであることを確認した場合、ピクルスを安全にロードできますか?
  • ほとんどの場合、完全に安全なデシリアライズロジックを使用して、ピクルスをロードするのと同じことを安全に達成できますか?

それで、あなた自身に尋ねる最初の質問は、これらの3番目があなたに当てはまりますか?別の方法でシリアライズとデシリアライズできますか?

そうでない場合、最初の2つのどちらかが適用されますか?

そうでない場合は、PyConで学んだばかりの「Pikara」というプロジェクトがあります。これは、「ピクルを解除するオブジェクトをこれまで以上に安全にする」ことを目的としています。明らかにポーランドの漬物にちなんで名付けられました。私は「キムチ」も同様にふさわしいかもしれないと提案しました。 :-)

代替のシリアル化方法が実装に理想的でない場合は、それをチェックアウトすることを検討してください: https://github.com/latacora/pikara

別の回答者も別のunpicklingメソッドを投稿しましたが、それを保証することはできません(今日はよく見ましたが、少なくとも興味深いことですが、ドキュメントが成人したらチェックします)。

この回答で今後100%の信頼が得られなかった場合は、フォローアップをお願いします。実際に実際に取り出しを試みていますここに?

3
jMyles

安全でないのはデフォルトのunpicklerだけです。安全な変更されたunpicklerを作成するか、picklemagicなど、他の誰かがすでに作成したunpicklerを使用できます。 https://github.com/CensoredUsername/picklemagic

0
user176454