日本ソフトウェア科学会第 40 回大会 (2023 年度) 講演論文集

機械学習を用いた悪性 Python パッケージの検出
近藤 徳彦 大山 恵弘

Python 言語は他人の作ったコードを容易に再利用できる，パッケージという仕組みを持っている．パッケージはオープンソースで誰でも公開・利用ができる便利な機能である一方で，近年悪性のコードを含むものが増加している．そのため，悪性のパッケージの素早い検出が，利用者の安全のために必要になってきている．しかし，悪性コードを含んだ Python パッケージの検出に関する研究やツールは少なく，多数のユーザがダウンロードする危険性がある．そこで本研究では，機械学習により悪性の Python パッケージを検出する手法を提案する．この手法では，まずパッケージ内の Python コードから予め定めたルールに基づき特徴を抽出する．この操作を悪性・良性の両サンプルに適用し，両方の特徴を基に機械学習で悪性と良性に分類するためのモデルを作成する．この手法を良性と悪性を含むデータセットを使用して評価した結果，約 92%の精度で正しく分類することができた.に実行する悪性パッケージが多く存在する [6, 7, 9]．

1 はじめに以上の状況から，悪性 Python パッケージを検出すPython への注目が近年高まっているとともに，悪る必要性が極めて高くなっている．しかし，バイナリ性のコードを含む Python パッケージも増加傾向にあ

コードをはじめとするマルウェアを検出する研究はる [4]．パッケージは自分以外が作成したコードを容数多くあり，検出ツールやそれに使われるルールも多易に再利用するための仕組みであり，多くのユーザがく作成されている一方で [1, 2]，悪性の Python コー利用している．しかしこの仕組みを使い，悪意を持っドの検出に関する研究やツールは少なく，ましてやたパッケージ開発者が悪性のパッケージを作成し，頒Python パッケージに関する研究やツールはさらに少布している [12]．例えば，Python のパッケージはイない．その結果，PyPI などのパッケージ管理レポジ

ンストール時に，依存関係などのパッケージのメタトリ内に悪性のパッケージが登録されてから，発見・データを処理する必要がある．この処理は様々な手法削除までに多くのユーザがダウンロードした事例がで実現されるが，しばしば setup.py というファイルある [8]．

によって処理する手法が利用される．この手法で処理

そこで本研究では，機械学習を用いて悪性 Pythonを行うには，setup.py 自体を実行する必要があるたパッケージを自動で検出するための手法を提案する．

め，標準的なパッケージ管理ツールである pip でパッ

この手法では，パッケージから抽出した特徴を機械学

ケージをインストールする場合には，setup.py がイ

習に使用した，パッケージが悪性か良性かを予測するンストール時に自動実行されるようになっている．こプログラムを作成した．このプログラムを使用して，の機能を悪用し，setup.py に悪性のコードを書いて用意したデータセットを交差検証で評価する実験をおくことで，インストール時にその処理を気づかれず行った．
提案手法を用いたプログラムは以下のことを達成

Detection of Malicious Python Packages Using Machine Learning
Norihiko Kondo, Yoshihiro Oyama, 筑波大学, University of Tsukuba.

できている．

• 実験では，既存のツールよりも高い検出精度を出すことができている• 予測モデルの作成に使用する特徴として，パッ類の良性データセットをそれぞれ 2 通りの方法でスケージ内のファイルから静的に得られる情報のキャンした．この調査では，検出率が最も高い場合でみを使用しているため，パッケージのダウンローも約 90%であり，その他の場合はさらに低い．またド時などに，短時間で簡易的に調査する目的に活最も高い検出率を出した場合では，誤検出率が 80%用が可能を超えてしまっている．

本論文の構成は以下のようになっている．2 節で関連研究について述べた後，3 節で提案手法を説明し，4 節で実験の結果と評価を述べる．5 節で結論を述べる．

3 提案手法
本節では，提案手法について説明する．提案手法では，パッケージのファイルに対し，設定されたルールにのっとってマッチングを行うことで特徴を抽出

2 関連研究し，この特徴を使って機械学習で予測モデルを作成

2. 1 悪性 Python コードの検出する．具体的には，まずサンプルのパッケージ内のFang らの研究 [5] では，以下のような特徴を使っPython ファイル内のコードが，既存ツールであるて機械学習によって予測モデルを作成し，分類する手PyPI Malware Checks を基に作成したルール群 (表法を提案した．

1) にマッチするか調べる．表 1 で示されるルール群• ファイル内に事前に定めた悪性と疑われるコードが存在するかは，対象の Python コードが悪性コードに多く見られる特徴を持っているかを調べることを目的として作• 情報エントロピーや最長文字列などに成されている．直感的には，コードがマッチするルー関する，コードの難読化がなされている

ルが多ければ多いほど，そのコードが悪性である可能かを示唆する数値性が高い．

• Python ファイルをコンパイルして得ら

次に，マッチしたルールに相当する要素を 1，マッれるバイナリのオペコードを FastText

チしなかったルールに相当する要素を 0 とする特徴というプログラムや，TF-IDF という手ベクタを作成する (図 1)．ここで，パッケージ内にあ法で処理して得られた値

る setup.py と init .py はパッケージ特有のファこの研究では以上の手法により，高い精度で悪性イルであり，通常のコードとは違うコードが書かれるコードを含んだ Python ファイルを検出できることことが多いため，このマッチング処理を setup.py，が示されているが，通常複数のファイルで構成される

init .py，それ以外の 3 種類に分けて行う．もパッケージでは，この手法が有効か否かは未知数でし init .py やその他の Python ファイルがパッある．

ケージ内にない場合は，その部分の特徴は全て −1 とする．

最後に，作成した 3 種類の特徴ベクタを連結し，そ†1
Vu らの研究 [14] では，PyPI Malware Checks [15]， のパッケージの特徴ベクタとする (図 2)．図 2 の例に

2. 2 検出ツールの精度比較

OSS Detect Backdoor [11]，Bandit4Mal [13] の 3 つ

おいては，setup.py ではルール 2 とルール 3 にマッの悪性パッケージ検出ツールについて，対象の Pythonチするため，特徴ベクタのその部分に相当する要素をパッケージデータセットから悪性パッケージを検出1 とし， init .py が存在しないため，特徴ベクタする処理の検出率と誤検出率を調査した．調査ではの相当する部分を全て −1 としている．特徴ベクタの各ツールを用いて，1 種類の悪性データセットと 2 種その他の Python ファイルに相当する要素は，分類さ†1 以前 PyPI で使用されていた悪性パッケージ検出ツー
ル．現在はリンク切れなどのため，入手できないようである．

れるファイルが 1 つでもマッチすれば 1 とする．例
ではルール 1 とルール n がマッチしているため，相当する要素を 1 としている．

表1

ルール

使用したルール

ライブラリ

関数

socket/ftplib/requests/
ネットワーク通信

socketserver/http/ssl/

指定なし

xmlrpc/urllib
pytransform/pyarmor runtime/

デシリアライズbase64/binhex/pickle/
pytransform bootstrap

プロセス生成 1ossystem/exec/spawn/popen/ posix spawn

プロセス生成 2

subprocess

run/call/check call/ check output/Popen

プロセス生成 3

multiprocessing

Pool/Processapply/apply async/start

プロセス生成 4

threadingrun/Thread/start/

メタプログラミング系

importlib/compileall/py compile/inspect
ctypes/win32com/

Win32 APIdir /compile/dir/import /eval/exec/ord/getattr/ dict /vars/ globals/locals/chr/
指定なし

pypi2in32

ある．

4. 2 データセット
本研究ではデータセットとして，悪性データセッ
ト約 1380 個，良性データセット約 760 個の合計約
図1

ファイルの特徴例: ルール 2 とルール 3 がマッチ2140 個を使用した．悪性データセットは MalOSS というツールの GitHub レポジトリ [10] から約 120 個，DataDog というセキュリティ会社の GitHub レポジ
トリ [3] から約 1270 個入手した．一方で良性のサン
プルはデータセットとしてまとまったものがなかったため，2. 2 節で紹介した Vu らの研究 [14] を参考に，
図2

パッケージの特徴例

PyPI でダウンロード数が上位 1000 個のパッケージをダウンロードした．ここからパッケージ内に Python

以上の処理をデータセット内の全てのパッケージにファイルが存在しないものや，Python2.x 系のコー対して行い，集めた特徴を機械学習で使うデータセッドを含んでいるためなど，特徴を抽出するプログラム

トとする．この作成した特徴の集合を基に機械学習でエラーになるものを除いてまとめた約 760 個を良を行い，予測モデルを作成する．機械学習のアルゴリ性データセットとして使用した．

ズムには，実行速度が速く精度も高いランダムフォレストを使用する．

これらのデータセットは全て setup.py というファイルを含んだ，source distribution と呼ばれる形式のパッケージで構成されている．これは，悪性データ

4 実験セットのほとんどがこの形式であり，これ以外の形式4. 1 実験環境の悪性サンプルがほとんどないためである．また，良本研究の実験環境は表 2 のとおりである．また，実性データセット内のパッケージは source distribution

験で使用した Python ライブラリは表 3 のとおりでではない形式も持っているものがあるが，悪性サ表2

実行環境

CPU

AMD Ryzen 7 2700X Eight-Core Processor 3.70 GHz

メモリ32 GBOS

Windows 10 Pro

仮想マシン

Oracle VM VirtualBox 6.1.38

仮想マシン上のメモリ

4 GB

仮想マシン上の OS

Windows 10 Pro

使用プログラミング言語

Python 3.11

表3使用した Python ライブラリ

ライブラリ名バージョンnumpy

1.25.0scikit-learn

1.2.2

け特段低いといったことがなく，特異度や適合率が高いことから，良性を間違えて悪性とするようなことが防ぎやすく，良性が圧倒的に多い現実の環境に適したモデルになっていると考えられる．

4. 4 アルゴリズムの比較実験
ンプルとパッケージの形式をそろえるため，sourcedistribution のみを収集して使用している．

これまでの実験では，機械学習のアルゴリズムは速度などの面からランダムフォレストを使用したが，特徴の傾向によってはこれが最適でない可能性がある．

4. 3 既存手法との比較実験

そこで他のアルゴリズムと精度や実行速度を比較す入手した悪性サンプルと良性サンプル約 2140 個る実験を行った．この実験では，提案手法で使用したに提案手法を適用し, 与えられたパッケージが良性ランダムフォレストの他に，サポートベクターマシか悪性かを推定する実験を行った．作成されたモデ

ン，多層パーセプトロン，k 近傍法の 3 つのアルゴリ

ルの検出精度の評価には Stratiﬁed k-fold を使用し，ズムを使用した．サポートベクターマシンは，データk=5 で交差検証を行った．Stratiﬁed k-fold は，通常セットを分割するための線を，分割後の集団からできの k-fold 交差検証がデータセットを無作為に k 個にるだけ離そうとするアルゴリズムで，分類でよく使わ分割するのに対し，データセットのラベルの比率をれる．多層パーセプトロンは，パーセプトロンという保ったまま k 個に分割するというものである．つま複数の入力データから 1 つの出力を返す関数を組みり，良性と悪性の比率が 2:1 のデータセットをこの方合わせることで，複雑なデータを解釈するアルゴリズ法で分割した場合，分割後の k 個のブロック 1 つ 1ムである．k 近傍法は，与えられたデータのラベルをつも良性と悪性の比率が 2:1 になる．

一番近い k 個のデータのラベルの多数決で予測する，この実験の結果を表 4 に示す．表 4 では，提案手クラスタリングでよく使われるアルゴリズムである．

法の結果と並べて，2. 2 節で示した Vu らの研究で使

これらのアルゴリズムを表 3 で示した scikit-learn をわれたツールの実験結果も示している．Vu らの研究使用して実装した．また，これらのアルゴリズムを使では検出率と誤検出率のみ出されていたため，その部用するときのハイパーパラメータは全てデフォルト分のみを表示している．またこの実験では，良性のとし，何も入力せずに実装した．

データセットを 2 種類使用していたが，表には結果の良かった方のデータセットの値を示している．

この比較実験の結果を表 5 に示す．表 5 の学習時間
は，k-fold で分割した 1 回あたりの学習時間である．

表 4 の提案手法の結果では全ての指標が 9 割を超

この結果をみると，この中ではランダムフォレストえており，既存のツールと比較して再現率・特異度とが今回のような用途に対するアルゴリズムとしては最もに全て上回っている．また，どれか 1 つの指標だ適と思われる．まず検出精度に関する指標をみると，

表4提案手法と既存手法の結果 (%)

提案手法

精度

適合率

再現率

F値

特異度92.3

96.3

91.6

93.993.6

PyPI Malware Checks (手法 1)

58.9

85.1

PyPI Malware Checks (手法 2)

85.7

32.2

OSS Detect Backdoor (手法 1)

50.6

66.9

OSS Detect Backdoor (手法 2)

85.1

22.8

Bandit4Mal (手法 1)

66.7

29.8

Bandit4Mal (手法 2)

90.5

15.4

ランダムフォレストと多層パーセプトロンの 2 つが，法をとっている．そのため，全く新しいタイプの悪性バランス良く高い値を出している．サポートベクター

パッケージではマッチするルールが存在しない場合がマシンは特異度や適合率が他のアルゴリズムよりも出てくる恐れがある．また，今回使用した悪性サンプ高いが，再現率がそれ以上に落ちてている．残った k

ルのパッケージでは似たようなパッケージが多くなっ近傍法は，ほとんどの指標が他のアルゴリズムよりもている．これらのことから今回のモデルでは十分な大きく下がっている．

汎化性能が得られていない可能性がある．今後はこ次に速度に関する指標を見る．k 近傍法は，学習時の部分を解決する手法の開発が必要であると考える．

間が他のアルゴリズムよりも大幅に短く，多層パーセプトロンが圧倒的に長い．残りの 2 つに関しては，サポートベクターマシンの方がランダムフォレストと謝辞 本研究の一部は JSPS 科研費 23K11096 の助成を受けている．

比べて 5 倍以上速いが，0.1 秒と 0.02 秒では作業効率に影響が出るほどの差はないと考えられる．また，

参 考 文 献予測時間に関しては多層パーセプトロンを除き微差[ 1 ] Alahmadi, A., Alkhraan, N., and BinSaeedan,
W.: MPSAutodetect: A Malicious Powershell
Script Detection Model Based on Stacked Denoising Auto-Encoder, Computers & Security, Vol. 116,
No. 102658,(2022).
[ 2 ] Belaoued, M. and Mazouzi, S.: A Real-Time PEMalware Detection System Based on CHI-Square
Test and PE-File Features, CIIA 2015, 2015,
pp. 416–425.
[ 3 ] DataDog: malicious-software-packages-dataset,
https://github.com/DataDog/malicious-softwarepackages-dataset. (Accessed on 04/08/2022).
[ 4 ] Digmi, I.: The rising trend of malicious packages
inopensourceecosystems,
https://snyk.io/blog/malicious-packages-opensource-ecosystems/, 2023. (Accessed on 20/07/2023).
[ 5 ] Fang, Y., Xie, M., and Huang, C.: PBDT:Python Backdoor Detection Model Based on Combined Features, Security and Communication Networks, Vol. 2021(2021). DOI: 10.1155/2021/9923234.
[ 6 ] Hai, S. B.:PyPI に Windows ユ ー ザ ーを 狙 う 6 つ の Python パ ッ ケ ー ジ を 発 見,https://unit42.paloaltonetworks.jp/maliciouspackages-in-pypi/, 2023. (Accessed on 04/08/2023).
[ 7 ] Lakshmanan, R.: Warning: PyPI Feature Executes Code Automatically After Python Package

であり，多層パーセプトロンにおいても他のアルゴリズムの数十倍速いものの，学習時間の遅さを埋めるほど速くないと判断した．

5 結論
本研究では，機械学習を使用して悪性 Python パッ
ケージを検出する手法を提案した．提案手法ではパッ
ケージのファイルを 3 種類に分け，それぞれルールごとにコードのマッチングを行い特徴を抽出した．抽出
した特徴を使用し，Python パッケージを悪性と良性に予測するモデルをランダムフォレストで作成し，実験によって評価したところ，約 92%の精度を得ることができ，既存ツールの精度を超えることができた．
また，今後の課題としては次のことが挙げられる．
まず，提案手法ではシグネチャマッチングのような悪性パッケージの特徴となるルールを予め作成する手

表5

アルゴリズムごとの結果

( 秒)

(%)
精度

適合率

再現率

F値

特異度

学習時間

予測時間

ランダムフォレスト

92.3

96.3

91.6

93.9

93.6

0.12870.0100

サポートベクターマシン

91.8

96.7

90.3

93.4

94.3

0.02840.0139多層パーセプトロン

92.3

96.2

91.6

93.9

93.4

1.50140.0002

k 近傍法

91.0

94.3

91.7

92.9

89.6

0.00040.0208Download,
https://thehackernews.com/2022/09/warning-pypifeature-executes-code.html, 2022. (Accessed on
04/08/2023).
[ 8 ] Lakshmanan, R.: Researchers Uncover Obfuscated Malicious Code in PyPI Python Packages,
https://thehackernews.com/2023/02/researchersuncover-obfuscated.html, 2023.
(Accessed on
20/07/2023).
[ 9 ] Lee, J.: More Supply Chain Attacks via
New Malicious Python Packages in PyPi,
https://www.fortinet.com/blog/threat-research/more-supply-chain-attacks-via-new-maliciouspython-packages-in-pypi, 2023.
(Accessed on
04/08/2023).
[10] MalOSS:
ossanitizer,
https://github.com/osssanitizer/maloss. (Accessed on 31/03/2023).
[11] Microsoft:
OSSDetect
Backdoor,

https://github.com/microsoft/OSSGadget/wiki/OSSDetect-Backdoor. (Accessed on 30/12/2022).
[12] Team, P. R.: Malicious Actors Use Unicode Support in Python to Evade Detection,
https://blog.phylum.io/malicious-actors-use-unicodesupport-in-python-to-evade-detection/, 2023.
(Accessed on 31/05/2023).
[13] Vu,
D.
L.:
Bandit4Mal,
https://github.com/lyvd/bandit4mal. (Accessedon 30/12/2022).
[14] Vu, D.-L., Newman, Z., and Meyers, J. S.: A
Benchmark Comparison of Python Malware Detection
Approaches,
arXiv,(2022).
https://arxiv.org/abs/2209.13288.
[15] Warehouse:Malware
Checks,https://github.com/pypi/warehouse/blob/main/.github/
ISSUE_TEMPLATE/malware-check.md. (Accessed on
09/08/2022).