PyPI のセキュリティ対策:人気パッケージの3分の1を誤検知するスキャナーに苦慮

One-Third of Popular PyPI Packages Mistakenly Flagged as Malicious

2022/08/24 DarkReading — オープンソース・コードのリポジトリ Python Package Index (PyPI) で、悪意のパッケージを検知するスキャナーが、かなりの数の誤報を生成していたことが、研究者たちにより明らかにされた。PyPI とは、Python で記述されたアプリケーションが使用する、ソフトウェア・コンポーネントのメイン・リポジトリのことである。Chainguard の分析によると、そのスキャナーにより、悪意のパッケージの 59% が検出されるが、人気のある正規 Python パッケージの3分の1に対して、また、ランダムに選択されたパッケージの 15% に対して、悪意の判定フラグを立ててしまうことが判明した。

火曜日のレポートで、Chainguard の研究者たちは、「この研究の目的は、Python の保守担当者や PyPI リポジトリが、悪意のある変更やサプライ・チェーン攻撃の可能性を見つけ出すために、プロジェクトをスキャンするシステムの有効性を判断するデータセットを作成することだ」と述べている。

この研究に協力した Chainguard の Senior Software Engineer である Zack Newman は、「現状のスキャナーにより、マルウェアの大半が検出されているが、誤検知を引き起こしてプロジェクト・マネージャーの時間を無駄にしないためには、大幅な改善が不可欠だ。これらを運営しているのは、多大な責任を負っているボランティアたちであり、時間のある限り疑わしいコードを調査できる、セキュリティ研究者ではない。彼らは 、PyPI のセキュリティを非常に気にかけており、状況を改善するために懸命に取り組んでいる。しかし、今のところ、彼らの努力に対する見返りはない」と述べている。

あらゆるソフトウェア分析ツールにとって、誤検出は悩みの種であり、セキュリティ・チームの悩みの種である。たとえ悪意のパッケージを 100% の確率で、正確に検出するシステムであっても、誤検出率が 1% であれば話が変わってくる。つまり、アプリケーションの開発者やセキュリティの専門家たちは、毎週リリースされる 2万件の PyPI パッケージの悪意を確認するために、200件のアラートを調べなければならない。

Zack Newman は、「何百ものパッケージが、悪意あるパッケージとして検出されてしまった。我々は、いくつかのスポット・チェックを行った。しかし、パッケージにおける悪意の有無を判断するには、ひと目見ただけでは不十分であり、マルウェア検出ツールが非常に重要になる。我々は、毎週大量のアラートに直面している、リポジトリ管理者に強い共感を覚えた。スキャナーが有用であるためには、悪意のパッケージを見逃すことを犠牲にしても、その誤検知率を約 0.01% に減らす必要がある」と付け加えている。

PyPI のマルウェア・スキャニング・アプローチ

PyPI は、パッケージとプロジェクトを2つの方法でチェックすることで、ソフトウェア・サプライチェーン攻撃の阻止を試みている。PyPI は、シグネチャを使用してパッケージの setup.py ファイルをスキャンし、マルウェア・シグネチャを作成するための業界標準である YARA ルールで表現される、既知の疑わしいパターンを検出している。それにより、悪意の機能が含まれている可能性が示される  (YARA は、Yet Another Recursive Acronym の略で、わかりやすい名前というよりも、業界内のジョークだ)。さらに、リポジトリのスキャン・ツールは、プロジェクトのコミットやコントリビューターを分析し、悪意のあるコントリビュートを示唆する、疑わしい変更がないかどうかを確認する。

研究者たちは、PyPI リポジトリに対する攻撃例として、すでに知られている 168 種類の悪意のサンプルを用いてデータセットを構築した。続いて、最もダウンロードされた 1,000 個のパッケージと、最もインポートされた 1,000 個のパッケージを含む2つ目のデータ セットを作成し、重複を除外したところ、最終的に 1,430 個の人気のパッケージになった。最後に、1,000 個のパッケージをランダムに選択したデータ セットも作成した。このうちの 14 個には、Python コードが含まれていなかったことで、986 個のランダムな Python パッケージとなった。

研究者によると、人気のあるパッケージと、無作為に選択されたパッケージは、すべて正規のものであると想定されるようだ。さらに、人気のプロジェクトは、より優れたセキュリティ衛生状態にあり、プログラミングのベスト・プラクティスを遵守している可能性が高いという。

火曜日に発表された分析結果で、研究者たちは、「これらのパッケージの一部が、悪意のあるものである可能性はあるが、ほんの一握りである可能性が極めて高い。重要なのは、これらのパッケージは、PyPI からランダムに選択されたパッケージである可能性が高いということだ」と述べている

依然として PyPI はサイバー犯罪の標的

今回の調査は、平均的なプログラムのコードの 78%を占めるという、オープンソース・ソフトウェア・コンポーネントのセキュリティを、セキュリティの専門家やソフトウェア開発者が確保する方法を模索する中で行われた。

The Open Source Security Foundation (OpenSSF) は、オープンソース・ソフトウェアのサプライチェーンのセキュリティ向上のため、セキュリティ精査が最も重要なパッケージの特定や、ソースコードとコンパイル済みパッケージを暗号的にリンクするための SigStore の採用支援など、多くの取り組みを開始した。

ソフトウェア・サプライチェーンに対する攻撃は、ここ数年で増加している。先月だけでも、Kaspersky が Node Package Manager (npm) リポジトリでマルウェアを発見し、Check Point/Snyk も、PyPI リポジトリサービスにホストされている、悪質なパッケージを多数発見している。

また、イタリアの小学生が、ランサムウェアのスクリプトを含む、複数の悪意の Python パッケージを、実験として PyPI にアップロードしていたことが明らかになった。

スキャン機能に問題があるのは、PyPI だけではないようだ。今後、Chainguard の研究者たちは、OSSGadget Detect Backdoor/bandit4ma/OSSF Package Analysis など、少なくとも4つのオープンソース・ソフトウェアの、マルウェア解析ツールを評価するために分析を拡張するという。さらに、PyPI Malware Checks ルールを、多言語オープンソースの静的コード・アナライザーである SemGrep に翻訳するとのことだ。

この記事を読む限り、PyPI での悪意のパッケージ・スキャンは、まだ調整中なのだと解釈できます。文中の、「誤検出率が 1% であれば、毎週リリースされる 2万件の PyPI パッケージの悪意を確認するために、200件のアラートを調べなければならない」という発言と、「スキャナーが有用であるためには、悪意のパッケージを見逃すことを犠牲にしても、その誤検知率を約 0.01% に減らす必要がある」という発言からも、厳しさが窺えますね。それは、PyPI に限ったことではなく、すべてのセキュリティ・チームに共通することなのでしょう。

%d bloggers like this: