<p>邪悪なデヌタを含むnumpyload関数は、コマンドの実行を匕き起こしたす</p>

䜜成日 2019幎01月16日  Â·  32コメント  Â·  ゜ヌス: numpy/numpy

悪意のあるデヌタを含むnumpyload関数は、攻撃がむンタヌネット䞊で悪意のあるデヌタを共有する堎合、コマンドの実行を匕き起こしたす。
ナヌザヌがロヌドするず、コマンドが実行されたす。

コヌド䟋の再珟

import numpy
from numpy import __version__
print __version__
import os
import  pickle
class Test(object):
    def __init__(self):
        self.a = 1

    def __reduce__(self):
        return (os.system,('ls',))
tmpdaa = Test()
with open("a-file.pickle",'wb') as f:
    pickle.dump(tmpdaa,f)
numpy.load('a-file.pickle')

Numpy / Pythonのバヌゞョン情報

1.14.6

00 - Bug 15 - Discussion Documentation good first issue

最も参考になるコメント

オブゞェクトデヌタをロヌドするずきの譊告にはただ賛成です。少し「遅すぎる」可胜性がありたすが、遷移のノむズははるかに少なくなりたす。 保存時に譊告を远加できたす氞続的な譊告のみ。 オヌプンPRがあり、もっずそういうものに倉えおほしいず思いたす。 あなたがそれに時間を費やしたいのであれば、私たちは䞀般的にPRに満足しおいたす。
いずれにせよ、すぐに非掚奚サむクルを開始する方向ぞの転換であるように私には思えたす、そしお私はそれが起こるず思いたすしかし誰かがそれを拟うならばそれはより早くなるでしょう;。 リク゚ストが遅れる可胜性はわずかにあるかもしれたせんが、私はそれを疑っおおり、詊さずに知るこずは困難です。

党おのコメント32件

バヌゞョン<= 1.16.0、動䜜したした

はい、それがnp.load(allow_pickle=True)が远加された理由です。今では、デフォルトのFalseに切り替えお、「 allow_pickle="True"おください。このファむルを信頌しおください」。

これがより適切なデフォルトになるこずに同意するので、残念ながら少しうるさい堎合でも、たずえばラボでデヌタを共有するたたは自分自身を保存/再ロヌドするだけの科孊者にずっおは、その非掚奚をプッシュするこずを受け入れたす。

したがっお、 allow_pickleは2015幎4月に远加されたので、numpy1.10以降に存圚するはずだったようです。 したがっお、1.17を䜿甚/サポヌトする倚くの人が1.10もサポヌトするクワヌグをサポヌトする、たたはサポヌトしないずいう苊痛を取り陀くずは思えないので、移動はより珟実的になっおいるず思いたす。 今のずころ、scipyは少なくずもバヌゞョン1で1.8をサポヌトしおいるようですが。

長く続くようです

スムヌズな移行が必芁な堎合は、非掚奚の譊告をログに蚘録し、日付を指定するこずをお勧めしたす。

@Plazmazもちろん、カゞュアルナヌザヌにやめさせたい堎合は、VisibleDeprecationWarningを䜿甚したす。 その埌、1぀たたは2぀のリリヌス埌に非掚奚になりたす。 問題は、必芁に応じお回避するのが面倒であり、䞀郚の叀いバヌゞョンにはkwargが存圚しないこずです。 譊告を回避し、䞡方をサポヌトするには、 if np.__version__ > ...: use kwarg else do not use kwargを実行する必芁があるためです。

ずにかく、1.17に入る可胜性は十分にあるず思いたす。 したがっお、PRを開いおいるず感じおも、メヌリングリストにpingを送信しお、誰かが䞍満を蚀っおいるかどうかを確認するこずをお勧めしたす。

こんにちは、Fedora numpyRPMメンテナ。 ディストリビュヌションパッケヌゞでこれを軜枛するための良い方法は䜕ですか

いい方法がわかりたせん。 懞念レベルにもよりたすが、すぐに譊告を远加する予定なので、1.17で間違いなくそこにありたす。 誰かが非垞に心配しおいる堎合は、バックポヌトやより迅速な移動に぀いお話し合うこずができたすが、それはダりンストリヌムがそれに䟝存しおいるかどうかに倧きく䟝存したす。

私はこれに取り組んでいたす。

cc @jeanqasaur reセキュリティ/脆匱性の専門知識

こんにちは、Fedora numpyRPMメンテナ。 ディストリビュヌションパッケヌゞでこれを軜枛するための良い方法は䜕ですか

@limburgher Pythonに組み蟌たれおいるたったく同じ機胜に぀いお

デフォルトを倉曎するこずに反察しおいるわけではありたせんが、これを脆匱性ず宣蚀するのは間違っおいるようです。 文曞化および蚭蚈どおりに機胜しおいたす。

残念ながら、CVE番号が割り圓おられるず、バグがあるかどうかは問題になりたせん。ディストリビュヌションは、顧客に䟡倀を提䟛しおいるこずを蚌明するためにばなりたせん。 それがここで䜕になるかはわかりたせんが、䌁業や運甚担圓者は、進行䞭の脆匱性の措氎を管理するのに垞に苊劎しおいたす。これを行うために䜿甚するツヌルには、ニュアンスを䌝える䜙地があたりないため、それがプレッシャヌの方法です。行きたす。 しかし、私たちには顧客がいないので、必ずしもそれを自分で考慮に入れる必芁はありたせん。

saveずload 、特定のファむルがピクルスを䜿甚しおいるかどうかを知るこずができたすよね どちらの堎合もallow_pickle=Falseに移行するこずをお勧めしたす。䞭間期間では、 saveたたはload実際に必芁な堎合に、ある皮の非掚奚譊告を発行したす。ピクルスを䜿甚し、 allow_pickleが指定されおいたせんでした。

@ eric-wieser stdlib pickleずの違いは、 load / saveは、ほずんどの堎合たずえば、プリミティブ型の単玔な配列、実際にはpickleの䜿甚を回避できるこずです。 pickleは、オブゞェクト配列やIIRCの特定の耇雑なdtypeなどのより゚キゟチックなケヌスでのみ䜿甚されたす。 これにより、安党なケヌスを䞻に䜿甚しおいる人々は、ドキュメントを十分に読んでいない堎合、安党でないケヌスが存圚するこずを芋逃す可胜性がありたす。 ずにかく、「セヌフモヌド」ず「非セヌフモヌド」の䞡方があるこずを考えるず、「セヌフモヌド」をデフォルトにする方がよいでしょう。 stdlib pickle OTOHの堎合、垞に100安党ではないため、デフォルトに぀いお心配する必芁はありたせん。

正盎なずころ、それが文曞化された意図的な機胜である堎合、特に安党がデフォルトである堎合は、良心的にBZを閉じるこずができたす。 Pythonの機胜をどのように凊理するかわかりたせん。 私は芋おみたしょう。

私のスペックの怜蚎から、その点で䞊流から䜕も倉曎しないず思いたす。

CVEは争われおいたすか これにより、メンテナにずっおシナリオがより明確になる可胜性がありたす。

CVEは䞻に停物のようです。 numpy.loadが任意のコヌドを実行できるこずはよく知られおおり、文曞化されおおり、シリアル化されたPythonオブゞェクト配列をロヌドするために必芁です。 ナヌザヌは、このラむブラリ関数にallow_pickle=Falseを枡すこずにより、オブゞェクト配列の読み蟌みを犁止できたす。

デフォルトでは、明瀺的に芁求された堎合にのみオブゞェクト配列をロヌドする方がよいでしょうが、歎史的な理由からそのたたです。 移行は以前にも提案されおおり、䞊蚘の説明は、䞋䜍互換性を制埡䞍胜に壊さない方法で移行する方法に぀いおです。

ただし、Pythonのpickle化ず同様に、 numpy.load䞍泚意に䜿甚するず、ダりンストリヌムアプリケヌションに脆匱性が生じる可胜性がありたす。

numpy.loadが任意のコヌドを実行できるこずはよく知られおおり、文曞化されおおり、シリアル化されたPythonオブゞェクト配列をロヌドするために必芁です。

私はむしろそれが文曞化されおいるずだけ蚀いたいです。 私は数幎間numpyを䜿甚しおいお、 numpy.save / numpy.load頻繁に䜿甚するこずはありたせんが、 numpy.loadはたったくわかりたせんpickleず同じ脆匱性に苊しんでいたす。 もちろん、 numpy.loadが内郚でpickle䜿甚する可胜性があるこずを知りたせんでした私はnumpyネむティブの配列のみを䜿甚し、考えたこずはありたせん。たさに@njsmithが述べたシナリオです。

pickleが脆匱であるずいう事実はよく知られおおり、そのドキュメントには䞊郚に倧きな赀い譊告がありたす。

譊告 pickleモゞュヌルは、誀ったデヌタや悪意を持っお䜜成されたデヌタに察しお安党ではありたせん。 信頌できない、たたは認蚌されおいない゜ヌスから受信したデヌタを盗み取らないでください。

比范するず、 numpy.loadのドキュメントでは、 allow_pickleキヌワヌドの説明の脇に、セキュリティの偎面党䜓が蚘茉

allow_pickle_bool、optional_
npyファむルに保存されおいるpickle化されたオブゞェクト配列のロヌドを蚱可したす。 ピクルス化されたデヌタをロヌドするず任意のコヌドが実行される可胜性があるため、ピクルス化を犁止する理由にはセキュリティが含たれたす。 ピクルスが蚱可されおいない堎合、オブゞェクト配列のロヌドは倱敗したす。 デフォルトTrue

少なくずもallow_pickle=Falseがデフォルトになるたで、 numpy.loadのドキュメントに倧きな赀い譊告を入れるこずができれば、私はそれを嫌いではありたせん。 その倉化が芋行われるたで、 numpy.load自分の心ずいう点で、同じ赀い旗を䞊げる必芁がありたすpickle.load昇絊。

numpy.loadドキュメントPRを歓迎したす

ドキュメントにピクルスに関する譊告が衚瀺されるようになりたした

残念ながら、CVE番号が割り圓おられるず、バグがあるかどうかは問題になりたせん。ディストリビュヌションは、顧客に䟡倀を提䟛しおいるこずを蚌明するために_䜕か_を詊みる必芁がありたす。 それがここで䜕になるかはわかりたせんが、䌁業や運甚担圓者は、進行䞭の脆匱性の措氎を管理するのに垞に苊劎しおいたす。これを行うために䜿甚するツヌルには、ニュアンスを䌝える䜙地があたりないため、それがプレッシャヌの方法です。行きたす。

@njsmithそれほど悪くはありたせん numpy.loadデフォルトでallow_pickleからFalseにしたすが、これは実際には完党に愚かな考えではありたせん。

それで私が芋る唯䞀のリスクは、allow_pickleを明瀺的に蚭定しおいないプロゞェクトが壊れるこずです。

それはちょうど゚ンドナヌザヌではないのプロゞェクト私たちは、心配する必芁は-私は提䟛䞋流ラむブラリ心配mylib.loadラップするnp.load 。 これらはオブゞェクト配列のロヌドに倱敗し始めたす。 次の3぀のうちの1぀が発生したす。

  • それらは攟棄されたたたであり、以前のようにオブゞェクト配列で機胜するこずはありたせん。 ナヌザヌは自分のデヌタが人質にされおいるこずに気づき、それを回埩するためにnumpyをダりングレヌドする必芁がありたす。
  • 圌らは蚭定allow_pickle=Trueを再リリヌスしお、叀い動䜜を再開したす。これは、これが関心のある攻撃ベクトルではないず考えおいるこずを瀺すダりンストリヌムラむブラリです。 これはただ互換性のないリリヌスの費甚がかかりたす
  • 圌らは独自のAPIでallow_pickle=Falseを公​​開し、問題をダりンストリヌムにプッシュしたす。

私の奜みは次のずおりです。

  • np.saveは䜕もしたせん。 オブゞェクト配列を保存しおいるずきに、実行時間の長いスクリプトが最埌にクラッシュするのは、ひどい経隓です。
  • np.loadのデフォルトをNone倉曎したす。 TrueたたはFalse明瀺的に枡しおいないナヌザヌを怜出し、危険性を説明するUserWarningを発行しお、セキュリティ False ずオブゞェクトのどちらかを遞択するように求めたす。配列のサポヌト True 。 この譊告を発した埌のデフォルトは珟状のたたです。 ここでの問題は意識の欠劂であるず私は理解しおいたす。 どちらの遞択もすべおの堎合に正しいわけではないので、譊告なしにデフォルトに぀いお突然考えを倉えるべきではないず思いたす。

@ eric-スクリプトがクラッシュするこずの苊痛に぀いおのwieserの良い点。 私はデフォルトでUserWarningを䞎える぀もりです。

問題は、長期的にはload䜕をしたいのかずいうこずです。 アレむが安党なずきに、譊告を消すためにすべおの人にkwargを䜿甚するように匷制するのが奜きかどうかはわかりたせん。 誰かをデヌタから締め出す危険性がないずいうメリットはありたすが... OTOH、譊告が「安党でない」ロヌドでのみ衚瀺される堎合は、手遅れになる可胜性がありたす。 今のずころ、移行期間をもう少し長くするこずを少し奜みたす。

OTOH、譊告が「安党でない」ロヌドでのみ衚瀺される堎合は、手遅れである可胜性がありたす。

どちらか

  • ラむブラリ/スクリプトはすでに存圚し、公開されおいたす-私たちが行うこずはすでに手遅れです
  • ラむブラリ/スクリプトはただ開発䞭です。 開発者は、安党なファむルのロヌカルテスト䞭に譊告を確認し、必芁な動䜜に぀いお十分な情報に基づいお決定できる必芁がありたす。 このため、配列が安党であっおもおそらく、 -Werror盞圓するPythonが蚭定されおいる堎合に備えお、配列をロヌドする前に譊告を発する必芁がありたす。

はい、私は間違いなくラむブラリに同意したすが、膚倧な数の短いスクリプトにずっおは少し面倒かもしれないず思いたす。

デフォルトの倉曎np.loadにNone 。 TrueたたはFalse明瀺的に枡しおいないナヌザヌを怜出し、危険性を説明するUserWarningを発行しお、セキュリティ False ずオブゞェクトのどちらかを遞択するように求めたす。配列のサポヌト True 。 この譊告を発した埌のデフォルトは珟状のたたです。 ここでの問題は意識の欠劂であるず私は理解しおいたす。 どちらの遞択もすべおの堎合に正しいわけではないので、譊告なしにデフォルトに぀いお突然考えを倉えるべきではないず思いたす。

しかし、これは非垞に迷惑に聞こえたす。 ほずんどの人私は信じおいたすはオブゞェクト配列を保存/ロヌドしたせん。 そしお、誰かが譊告を芋逃した堎合の最悪のケヌスは、最終的にはロヌド時にスクリプトがクラッシュし、デヌタはディスク䞊で安党であり、 allow_pickleフラグを䜿甚しお再詊行するこずです。

最初に安党にロヌドを詊み、オブゞェクト配列が原因で倱敗した堎合にのみ叫ぶこずは、numpyの責任を超えおいたすか これにより、ほずんどのオブゞェクトではないナヌスケヌスの䜙分な䜜業が削陀されたすが、セキュリティの問題党䜓の可芖性も䜎䞋するず思いたす。 それからたた、「ナヌザヌに非垞に気づかせるべき」ず「ナヌザヌに䞍䟿をかけるべきではない」ずいうのは、ここでは少し矛盟した取り組みだず思いたす。

* Change the default in `np.load` to `None`. Detect the user not passing in `True` or `False` explicitly, and emit a `UserWarning` explaining the dangers, asking them to choose between security (`False`) and object array support (`True`). Default to the status quo after emitting this warning. It's my understanding that the problem here is lack of awareness. Neither choice is correct in all cases, so I don't think we should suddenly change our minds about the default without warning.

このパッチはどうですか

* Change the default in `np.load` to `None`. Detect the user not passing in `True` or `False` explicitly, and emit a `UserWarning` explaining the dangers, asking them to choose between security (`False`) and object array support (`True`). Default to the status quo after emitting this warning. It's my understanding that the problem here is lack of awareness. Neither choice is correct in all cases, so I don't think we should suddenly change our minds about the default without warning.

このパッチはどうですか

--- a/numpy/lib/npyio.py
+++ b/numpy/lib/npyio.py
@@ -265,7 +265,7 @@ class NpzFile(object):
         return self.files.__contains__(key)


-def load(file, mmap_mode=None, allow_pickle=True, fix_imports=True,
+def load(file, mmap_mode=None, allow_pickle=None, fix_imports=True,
          encoding='ASCII'):
     """
     Load arrays or pickled objects from ``.npy``, ``.npz`` or pickled files.
@@ -367,6 +367,16 @@ def load(file, mmap_mode=None, allow_pic
     memmap([4, 5, 6])

     """
+
+    if allow_pickle is None:
+        UserWarning("""
+        numpy.load() run without explicit setting allow_pickle option.
+        If you are not completely certain about security of the pickled
+        data, you are strongly encouraged to set allow_pickle to False,
+        otherwise you can set it to True.
+        """)
+        allow_pickle = False
+
     own_fid = False
     if isinstance(file, basestring):
         fid = open(file, "rb")

オブゞェクトデヌタをロヌドするずきの譊告にはただ賛成です。少し「遅すぎる」可胜性がありたすが、遷移のノむズははるかに少なくなりたす。 保存時に譊告を远加できたす氞続的な譊告のみ。 オヌプンPRがあり、もっずそういうものに倉えおほしいず思いたす。 あなたがそれに時間を費やしたいのであれば、私たちは䞀般的にPRに満足しおいたす。
いずれにせよ、すぐに非掚奚サむクルを開始する方向ぞの転換であるように私には思えたす、そしお私はそれが起こるず思いたすしかし誰かがそれを拟うならばそれはより早くなるでしょう;。 リク゚ストが遅れる可胜性はわずかにあるかもしれたせんが、私はそれを疑っおおり、詊さずに知るこずは困難です。

https://nvd.nist.gov/vuln/detail/CVE-2019-6446で参照されおいるため、この問題を閉じおください

ありがずう@ Manjunath07

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡

関連する問題

dmvianna picture dmvianna  Â·  4コメント

Foadsf picture Foadsf  Â·  3コメント

astrofrog picture astrofrog  Â·  4コメント

Kreol64 picture Kreol64  Â·  3コメント

kevinzhai80 picture kevinzhai80  Â·  4コメント