NumPyの任意コード実行の脆弱性
Hayley Denbraver
2019年2月5日
0 分で読めます科学技術計算に広く使われているPythonのオープンソースパッケージNumPyで最近発見された脆弱性により、任意のコード(悪意のあるコードを含む)が実行されるおそれがあります。
NumPy
NumPyは、数学、科学、工学向けのオープンソースソフトウェアパッケージ群であるSciPyエコシステムの一部です。NumPyは産業界と学術界の両方で利用されており、GitHubで9,000を超えるスターと700人以上のコントリビューターを獲得しています。PyPIのBigQueryで確認できる記録によると、NumPyは直近3か月で約400万回ダウンロードされています。
脆弱性について
2019年1月16日、GitHubユーザーのnanshihuiが、numpy.load関数はPythonのpickleモジュールの使用方法に起因して、任意コード実行の脆弱性があると報告するIssueを作成しました。Pythonのpickleモジュールは、Pythonオブジェクトをシリアライズおよびデシリアライズします。「Pickling」はPythonオブジェクトの階層構造をバイトストリームに変換し、「unpickling」はバイトストリームをオブジェクトの階層構造に戻します。信頼できないソースからpickle化された配列を受け入れるのは危険です。unpicklingの前に検証する方法がないためです。悪意のあるシェルコードが入力として渡された場合、unpickling時に実行される可能性があります。
この脆弱性は、2015年10月にリリースされたバージョン1.10から最新バージョン1.16までのNumPyに存在します。この脆弱性の詳細はこちらからSnykのデータベースで確認できます。
影響を受けるNumPyのバージョンでは、pickle化されたオブジェクト配列の読み込みがデフォルトで許可されています。これは信頼できるソースの場合にのみ行うべきですが、デフォルトの動作としては不適切です。
現在、この脆弱性が悪用された事例は確認されていませんが、問題への認知が広がれば状況が変わる可能性があります。この脆弱性の悪用に認証は不要で、特別な技術的知識も必要ありません。
この記事の執筆時点では、修正パッチやアップグレードはまだ提供されていませんが、NumPyチームが対応を進めています。信頼できないソースからデータを読み込むすべての allow_pickle=False の呼び出しに numpy.load を渡せば、脆弱性の影響を受けないようにできます。
影響を受けていますか?
Snykをご利用の場合、脆弱性のあるNumPy依存関係を含むプロジェクトがあれば、通常のアラートでお知らせします。
まだSnykをお試しでない方は、こちらの使いやすいインターフェースをお試しいただくか、CLIを使ってローカルでテストを実行してみてください。
