PyPIにWindowsユーザーを狙う6つのPythonパッケージを発見

Malicious packages discovered on PyPI point to vulnerabilities in cloud ecosystems. We analyze the malicious code and suspected motivations of the threat actors.

This post is also available in: English (英語)

概要

2023年3月、Unit 42のリサーチャーは、Python Package Index (PyPI)パッケージ マネージャーに悪意のあるパッケージを6つ発見しました。これらのパッケージは、Windowsユーザーのアプリケーション クレデンシャル、個人データ、暗号ウォレットの追跡情報窃取を意図したものでした。この攻撃は、以前に悪意のあるパッケージを使ってサプライ チェーン攻撃をしかけたことのある攻撃グループ、W4SPを模倣しようとするものでした。

本稿では、脅威アクターが悪意のあるコードをオープンソース エコシステムに公開することが、悪意のあるパッケージを使うことでいかに容易になっているのかを解説します。今回私たちが観測したアクティビティはおそらく、ある種の攻撃グループが計画的に組織だって行ったキャンペーンではなく、以前のキャンペーンについての技術レポートを読んだ模倣者が、独自に実行した攻撃であると考えられます。ここでは、悪意のあるコードの技術分析をステップバイステップで行ってから、この攻撃により彼らが何を達成しようとしていたのかを解明します。

また、本稿で解説した悪意のあるパッケージの識別に弊社Prisma Cloudモジュールが使っているインジケーター(指標)についても説明します。パロアルトネットワークス製品をご利用のお客様は、Prisma Cloudを介し、悪意のあるコードを含むオープンソース パッケージからの保護を受けています。

関連するUnit 42のトピック Cloud, Python, Open Source

目次

概要
PyPIに新たな悪意のあるパッケージが発見される
調査結果
攻撃: カスタム パッケージのエントリー ポイント
悪意のあるコード
第2ステージ: W4SP Stealer
悪意のあるパッケージをアップロードする便利なプラットフォームとしてのPyPI
結論
パロアルトネットワークス製品による保護
IoC
悪意のあるパッケージ
悪意のある URL
悪意のあるユーザー

概要

「悪意のあるパッケージ」とは、コンピューター システムまたはコンピューター システムが処理するデータに損害を与えるよう、意図的に設計されたソフトウェア コンポーネントを指します。こうしたパッケージを配布する手段はたくさんあります。たとえばフィッシングメール、侵害されたWebサイト、正規ソフトウェアのリポジトリーなどがそうした手段の例です。

こうした悪意のあるパッケージは広範にわたる影響を及ぼしかねません。そうした影響には、気づかぬうちに機微データを窃取される、システムの障害を引き起こす、はてはシステム全体を制御することまでもが含まれます。それだけでなく、こうした悪質なパッケージは、相互に接続された他のシステムに拡散し、広範囲におよぶ被害を引き起こしたり、生産性を下げたりすることもできます。したがって、ソフトウェアのダウンロードやインストールには細心の注意が必要です。とくにそのソースがよく知らないものであったり信頼できないものであったりした場合は要注意です。

ユーザーは警戒を怠らず、優れた判断力を保つことにより、システムを保護し、テクノロジー環境に侵入する脅威アクターによる潜在的被害を防ぐことができます。

PyPIに新たな悪意のあるパッケージが発見される

2023年3月、Prisma Cloudのリサーチャーは、PyPIのパッケージマネージャーに6つの悪意のあるパッケージを発見しました。これらのパッケージはWindows ユーザーを標的とするもので、その目的はアプリケーション クレデンシャル、個人データ、暗号通貨ウォレット情報の窃取にありました。

Prisma Cloudエンジンは悪意のあるPyPIパッケージを検出するように設計されており、短期間内にアップロードされた不審な属性を持つ複数のパッケージを特定しました。

  • これらのパッケージには対応するGitHubリポジトリーが存在しません。正規のパッケージであれば、存在するのが一般的です。これは、コードを表示させたくないという意図を示唆する可能性があります。GitHubリポジトリーがないことに加え、ダウンロード数もごく限られていることから、さらに疑わしさが増しました。
  • これらのパッケージを実行すると、機微データを収集してサードパーティのURLに送信するなどの悪意のある動作を行います。
  • これらのパッケージには悪意のあるコードのパターン(後述)が見られ、これが弊社エンジンに検出されました。
  • このパッケージの作者は新しく作成されており、パッケージを 1 つしかアップロードしておらず、他のプロジェクトやリポジトリーへのリンクなどのサポート情報を提供していなかったことから、信頼おける作者とは見なされませんでした。
  • 最後に、パッケージ作者のユーザー名がある特徴的なパターンに従って作成されており、これらは互いに数分以内に作成されていました (例: Anne1337、Richard1337)。これらの各ユーザー名は単一のパッケージしかアップロードしていませんでした。

攻撃の第2ステージは、以前W4SP攻撃グループで確認された攻撃と同様のものでした。このグループはオープンソース エコシステムの脆弱性を悪用し、組織を標的にしてマルウェアを拡散することに特化したグループです。彼らの主な目的はユーザー クレデンシャルや財務データなどの機微情報に不正にアクセスすることで、多くは自動ツールを使って脆弱性をスキャンしエクスプロイトを試みます。このグループは、従来の攻撃に加え、サプライ チェーン攻撃を実施するようすも確認されています。

調査結果

Prisma Cloudエンジンが「悪意のあるコードが含まれる可能性がある」としてマークされたパッケージを検出しました。各パッケージには不審なリモートURLへのリンクが含まれており、ある1人のユーザーによって個別にアップロードされたコンテンツをダウンロードしようとしていました。

アップロードされた各パッケージのユーザーはアップロード直前に作成されており、それまでパッケージをアップロードした履歴がありませんでした。各パッケージには数百回のダウンロード実績がありましたが、私たちのリサーチ チームが不正行為を報告したことから、当該パッケージとそれらをアップロードした不正なユーザー アカウントはPyPIによって削除されました。

私たちはこのコードを分析し、パッケージの作者を追跡しようとしました。表1に示すように、どのパッケージ作者のユーザー名も「1337」を接尾語として使うというパターンが見られました。このことから、何らかの自動プロセスでユーザーを作成していたことが示唆されます。図1はこれらユーザー名の作者ページの1つを示したものです。

パッケージ名 作者  悪意のあるリンク ダウンロード数
ligitgays Anne1337 hxxps://paste.bingner[.]com/paste/o27gb/raw 191
xboxredeemer Richard1337 hxps://paste.bingner[.]com/paste/47rpu/raw 160
syntax-init Debbie1337 hxxps://paste.bingner[.]com/paste/q77t3/raw 140
xboxlivepy Christopher1337 hxxps://paste.bingner[.]com/paste/jr7ow/raw 153
Ligitkidss Sara1337 hxxps://paste.bingner[.]com/paste/9mzzs/raw 158
tls-python Kevin1337 hxxps://paste.bingner[.]com/paste/97vnn/raw 240

表1. 発見された悪意のあるパッケージ

画像1はPyPIの作者ページのスクリーンショットです。このユーザーはプロジェクトをアップロードしていません。ユーザー名はTravis Elliottで2023年3月13日に参加しています。ユーザー名は Richard1337です。
図1. PyPIの作者ページ

攻撃: カスタム パッケージのエントリー ポイント

この攻撃はW4SP攻撃グループによるそれまでに確認されていた攻撃と類似しています。なおこのW4SPによる攻撃についてはBleeping Computerが「Devs targeted by W4SP Stealer malware in malicious PyPi packages (悪意のあるPyPiパッケージにW4SP Stealerマルウェア 開発者が標的)」で詳しく報じています。こうした類似点から私たちはこれが模倣者による攻撃と考えています。

今回のケースには、実際のW4SPの攻撃であれば予想すべきであろう複雑さに欠ける側面がありました。以下にその例を示します。

  • いかなる組織も標的にしていない
  • この悪意のあるパッケージには広く使われている人気パッケージの名前に似せて綴りをほんの少しだけ変える「タイポスクワッティング」が使われていない。これがW4SP攻撃であれば使っているものと予期される
  • 攻撃の第2ステージが暗号化されていない。本物のW4SPの攻撃ではこのステージが暗号化されていて検出はより困難
  • W4SPが以前の攻撃で使ったコードのほとんどはダウンロードできる状態になっていたのでアクセス・再利用が容易だった

以前の攻撃では、W4SP Stealerが無料のファイル ホスティング サービスからダウンロードされる第2ステージ ペイロードとして配信されていたので、攻撃者はパッケージ リポジトリーの段階での検出を回避できていました。

これらのパッケージにはあからさまに悪質なコードは持たせていません。そのかわり、特定のエントリー ポイントを含めておき、それらのエントリー ポイントがインストールないし実行の過程でトリガーされるように作ってあります。無料のファイル ホスティング サービスの利用やカスタム エントリー ポイントの採用は検出回避をもくろんでのことで、こうした脅威の検出・緩和を任されているセキュリティ専門家やリサーチャーにとっては頭の痛い問題となっています。

これらの攻撃は実装が容易でセキュリティの専門知識がほとんどなくても実行できます。しかもインストール プロセスが自動的に攻撃を実行するので、インポートされたモジュールの使用時に脅威アクターが攻撃を開始するのと比べて非常に効果的です。

ソフトウェア開発者はPythonパッケージの利用にあたり2つのアクションをとる必要があります。1つめはパッケージをインストールすること、2つめはそのパッケージを使うためにコード内でインポート/宣言を行うことです。次のセクションで説明しますがこの攻撃コードは実際にはインストール ファイル (setup.py)で始まっています。つまりこれはパッケージのインストール過程ですでに攻撃が実行されていることを意味します。

私たちが調査した事例ではこの攻撃者は自分自身を@EVIL$ STEALERと呼んでいました。ただしこの攻撃者名は攻撃のつど変わっていました。以下はコード署名から見つけた名前の一覧です。

  • ANGEL Stealer
  • Celestial Stealer
  • Fade Stealer
  • Leaf $tealer
  • PURE Stealer
  • Satan Stealer
  • @skid Stealer

悪意のあるコード

すべてのパッケージでsetup.pyファイルは同じで、実行前にリモートURLからコンテンツをダウンロードする次のコード スニペットが含まれていました。

画像2は、多数のPythonコード行のスクリーンショットです。このコード スニペットは、実行前にリモートURLからコンテンツをダウンロードします。
図2. Setup.py (第1ステージ)の悪意のあるコード

図2 (上)は次のアクティビティを行います。

  1. 攻撃者は _ffileオブジェクトを使って一時ファイルを作成します。そのファイルの内容はwriteメソッドで書き込まれます。
    • NamedTemporaryFile関数による一時ファイルの使用は、ウイルス対策ソフトウェアをはじめとするセキュリティ対策での検出から悪意のあるコードを隠すためのよく知られた手法です。
  2. このファイルの内容はurllib.requestモジュールのurlopen関数でURLの内容をダウンロードすることによって取得します。その後、exec関数を使ってこのファイルの内容を実行します。
  3. 一時ファイルの内容を書き込んだ後でこのファイルは閉じられます。その後、システム シェルのstartコマンドを使ってこのファイルの実行が試みられます。実行に成功するとsetup関数が呼び出され、パッケージが作成されます。
    • その後、攻撃者はstartコマンドで Python エンジンの実行ファイル (pythonw.exe) を起動します。
    • その後この実行ファイルは、パラメーターとして渡されたスクリプト ファイルを実行します。この悪意のあるパッケージは Windows ユーザーを標的にしているので、スクリプト ファイルが署名されていなければ、SmartScreen (潜在的に悪意のあるファイルを検出し実行を防止する Windows のセキュリティ機能) や署名検証の対象になりません。
    • つまり、標的となったコンピューターが SmartScreen やシグネチャ検証を有効にしていても、そのコンピューター上で悪意のあるコードが実行されることになります。

第2ステージ: W4SP Stealer

私たちの調査によると、第2ステージでこの攻撃者はW4SP Stealer 1.1.6の設定済みバージョンを使用していました。このバージョンは、コードがrequestsCrypto.Cipherjsonsqlite3のような複数のライブラリーをインポートしているところが以前のバージョンと似ています。。次に、さまざまな技術を使い、パスワードやCookieなど、保存されているブラウザーのクレデンシャルを抽出・復号し、この情報をあるDiscordのwebhookに送信します。

見つかったすべての悪意のあるパッケージについてこのステージは類似していました。W4SP Stealerはサイバーセキュリティ コミュニティではよく知られています。このセクションでは簡単に概要を説明します。

コードの主要部分では、DATA_BLOBというクラスを定義しています。このクラスは、CryptUnprotectData関数のデータ保存に使われます。この関数はパスワードやAPIキーなどの機微データの保存に使われるWindows Data Protection API (DPAPI)が保護している値を復号します。このコードはCryptUnprotectData関数とDecryptValue関数を使って値の復号を試み、それをDiscord webhook経由でリモート サーバーに送信します(図3)。

画像3は多数のコード行のスクリーンショットです。まずDATA_BLOBクラスを定義し、次に復号を試みます。
図3. Windows Data Protection API (DPAPI) で保護された値の復号を試みている

以下の図は、悪意のあるコードのサンプルです。この中で攻撃者は被害者の情報を収集しようとしています。図4では攻撃者がIPアドレス、ユーザー名、国、国コードなど、被害者の情報を収集しようとしています。

画像4はユーザーのIPアドレス、場所、ユーザー名、国コード、国名などの情報を取得しているコードのスクリーンショットです。
図4. ユーザーの IP アドレス、場所、ユーザー名などの情報を取得しているコード

図5では攻撃者がDiscord APIとやりとりしてユーザーの友達リストを取得し、友達の所有するバッジの情報を抽出しています。

画像5はカスタム チャット ルームのように機能するアプリケーション、Discord上のユーザーの友達リストを取得するコードのスクリーンショットです。これらのチャット ルームはチャネルと呼ばれます。
図5. Discord上のユーザーの友達のリストを取得するコード

コード後半では事前に用意したDiscord webhook (図6)を使おうとしています。その後、HTTPリクエスト経由で関連するDiscordチャネルに被害者情報を送信しようとしています。

画像6はDiscord API webhookのスクリーンショットです。
図6. Discord webhook

最後に攻撃者は被害マシンが攻撃実行にふさわしいかどうか確認しようとします(図7)。ふさわしいと判断されれば、DETECTEDという変数がtrueに設定され、被害マシンからの情報がリモート サーバーに送られます。

画像7は、Cookieを検索できるコードのスクリーンショットです。
図7. Cookieを検索するコード

悪意のあるパッケージをアップロードする便利なプラットフォームとしてのPyPI

驚異的な数のPythonパッケージをホストするリポジトリーとして広く愛用されているPyPI界隈で、困った事態が明らかになりました。比肩するもののないこのリポジトリーの人気は、悪質なパッケージをこっそりばらまいてその膨大なユーザー ベースを悪用したがる良からぬ集団からの注目も意図せず引いてしまったのです。

この気の滅入るトレンドは、じつにやっかいな問題を引き起こしています。PyPIは分散型なので、こうした良からぬ集団の監視や検出はひどく骨が折れるのです。これらの悪質パッケージによる被害の影響は深刻で、何も知らない被害者は、それがユーザーであれ企業であれ、データ、クレデンシャル、暗号通貨の窃取といったかたちで等しく影響を受けます。したがってPyPIのパッケージ エコシステムの安全性やセキュリティの強化は喫緊の課題で、これらの持続的脅威に対抗する強力な施策の実装が必要です。

こうした状況を受け、2023年5月20日、PyPIはプラットフォーム上の悪意のあるアクティビティ、悪意のあるユーザー、プロジェクトの増加が懸念されるため新しいパッケージの登録とアップロードを一時停止したと告知しました。残念ながら現時点ではそれらマルウェアの性質や関与した攻撃者に関する具体的な情報は開示されていません。

新規ユーザーとプロジェクトの登録を一時停止するというこの決定は、PyPIのようなソフトウェア レジストリーが現在直面している課題を反映しているといえます。開発環境を侵害し、ソフトウェア サプライ チェーンを改ざんしようとする攻撃者にとって、こうしたソフトウェア レジストリーは魅力的な標的となっているのです。

結論

オープンソース ソフトウェアの台頭と普及、パッケージ マネージャーの普及により、攻撃者が危険なパッケージを無防備なシステムに滑り込ませることがこれまで以上に簡単になりました。日常生活にソフトウェアが浸透するにつれ、悪意のあるパッケージのもたらす脅威は深刻化します。攻撃者はこれらのパッケージを正規ソフトウェアに偽装して無防備なシステムの脆弱性をエクスプロイトすることで、データの窃取、システムの停止、ネットワークの支配など、大きな損害をもたらす可能性があります。

こうした脅威に立ち向かうにはソフトウェア開発者と組織が開発プロセスにおけるソフトウェア セキュリティの優先度を上げねばなりません。コード レビュー、自動テスト、ペネトレーション テストなどの堅牢なセキュリティ対策を実装することで、デプロイ前に脆弱性を特定・修正できます。さらに、セキュリティ パッチやアップデートを常に最新の状態に保つことで、攻撃者による既知の脆弱性のエクスプロイトを防げます。

技術的対策に加え、ソフトウェア セキュリティに関する意識と教育を高めることも、悪意のあるパッケージからのリスク軽減に役立ちます。開発者、IT スタッフ、エンド ユーザーに対し、セキュリティ ベスト プラクティス (パスワードの衛生管理や不審な電子メールの識別など) に関する定期的なトレーニングを行うと攻撃を未然に防ぎやすくなります。悪意のあるパッケージを確実に特定し、システムやネットワークへの被害を防ぐには、セキュリティ専門家、開発者、エンド ユーザーが団結して努力せねばなりません。

マルウェアや悪意のあるパッケージに関する技術レポートを発行することも、これらの脅威に対する理解を深め、それらに対する保護能力を向上させる上で重要な役割を果たします。技術レポートはマルウェアの振る舞いや機能の詳細分析を提供し、リサーチャーやセキュリティ専門家による効果の高い対策の開発に役立ちます。さらにマルウェアに関する技術的な詳細を共有することで、組織は最新の脅威や脆弱性を常に把握しておくことができます。これにより、セキュリティ態勢を改善し、サイバー攻撃リスクを軽減できます。

パロアルトネットワークス製品による保護

Prisma Cloud Runtime Protection (ランタイム保護)ソリューション

Prisma Cloud Runtime Protection (ランタイム保護) ソリューションにはクラウド仮想マシン、コンテナー、サーバーレス機能のために指定ないし予測により識別を行う構成可能な一連の機能が含まれています。予測保護にはクラウドやコンテナーのインスタンスが未知のプロセスを実行したり予期しないネットワーク ソケットを作成した場合にそれを判定する機能が含まれています。

脅威ベースの保護にはマルウェアがワークロードに追加されたりワークロードがボットネットに接続されたりするとそれを検出する機能が含まれています。この悪意のあるバイナリーの検出はパロアルトネットワークスのクラウドベース マルウェア保護エンジン、WildFireの統合によって実現できました。これらのランタイム インシデントは、Image Analysis Sandbox (イメージ分析サンドボックス)を使うことでもデプロイ前に検出できます。

Prisma Cloud Malicious Package (悪意のあるパッケージ)ソリューション

Prisma Cloudは高度なエンドツーエンドのサイバーセキュリティ ソリューションを提供しています。このソリューションにはプロアクティブな手法による包括的なスイートが含まれており、さまざまな潜在的攻撃から本製品をご利用のお客様を保護するように設計されています。これにより、一般公開に先立つリスク軽減が可能となります。

この最先端防御システムの中核に位置するのがPrisma CVE Viewerです。Prisma CVE Viewerはリアルタイムで動作し、継続的に更新を受け、最新の脅威動向を反映する動的リソースです。

Prisma-IDとして知られる独自の識別システムを組み込んだPrisma CVE Viewerは、弊社リサーチ チームの精鋭たちが丹念に掘り起こした公開脆弱性の中央リポジトリーとして機能します。この弊社独自の識別子を活用し、Common Vulnerabilities and Exposures (CVE) IDがまだ割り振られていない脆弱性のギャップを埋め、セキュリティ ギャップの見逃しや対処漏れを防ぎます。さらに、Prisma CVE Viewerは弊社リサーチ専門家が発見した悪意のあるパッケージを精力的にアーカイブすることにより、ソフトウェア サプライ チェーンに潜む潜在的脅威に対する比類なき可視性をPrismaをお使いのお客様にご提供します。

図8に示すように、Prisma Cloudは、お客様にPrisma-IDとプリエンプティブな保護を提供することで、エクスプロイトの可能性が顕在化する前に、その可能性のあるエクスプロイトからお客様を保護します。この堅牢なセキュリティ アプローチは、サプライ チェーン攻撃に対する強力な抑止力として機能し、脅威をプロアクティブに阻止して、お客様のシステムやインフラの完全性と回復力を維持します。

画像8はPrisma Cloudアプリケーションのスクリーンショットです。これはCVE Viewerです。この画面では、CVEデータベースで悪意のあるパッケージを検出しています。検索フィールドがあり、CVE、Package、Distribution、Release、CVSS Score (7.5)、Severity (High)、Affected versions、Modified in IS の各列が表示されています。
図8. Prisma Cloudによる検出

このほか新しいPrisma Cloud CI/CD Securityモジュール(図9)は、悪意のあるソフトウェアの依存関係 (例: 依存関係の混乱、タイポスクワッティング、既知のパッケージのセキュリティ侵害など) を通じ、CIパイプラインや開発者環境でコードを実行するという、このところ台頭しつつある手法に対し、包括的な保護を提供します。これは、バージョン管理システムやCIシステムをはじめとしたソフトウェア デリバリー パイプライン全体にわたる多様なシステムの多様な設定・構成・相互接続を分析することで実現しています。

画像9は、Prisma Cloud CI/CD Securityモジュールのスクリーンショットです。幅広いデータを表示するさまざまな統計を備えたダッシュボードです。
図9. Prisma Cloud CI/CD Securityモジュール

Cortex EDRの分析

Cortex XDRはCortex XDRエージェントのほかにEDR分析機能も提供します。これにより、実行時に使われる悪意のあるPythonパッケージのランタイムでのコマンド&コントロール (C2) 検出用に、検出分析ベースの検出機能が提供されます。EDR分析のC2カバレッジのサンプルについてはCortex XDRの技術ドキュメントで説明しています。「A process connected to a rare external host」セクションの下の「Variations」のサブセクションの「UNIX LOLBIN process connected to a rare external host」を参照してください。

IoC (侵害指標)

悪意のあるパッケージ

  • ligitgays
  • xboxredeemer
  • syntax-init
  • xboxlivepy
  • Ligitkidss
  • Tls-python


悪意のあるURL

  • hxxps://paste.bingner[.]com/paste/o27gb/raw
  • hxps://paste.bingner[.]com/paste/47rpu/raw
  • hxxps://paste.bingner[.]com/paste/q77t3/raw
  • hxxps://paste.bingner[.]com/paste/jr7ow/raw
  • hxxps://paste.bingner[.]com/paste/9mzzs/raw
  • hxxps://paste.bingner[.]com/paste/97vnn/raw

悪意のあるユーザー

2023-07-14 13:30 JST 英語版更新日 2023-07-14 09:15 PDT の内容を反映し、図 2 のコードに背景情報を追記