ブログ

悪意のあるPythonライブラリjeilyfishおよびpython3-dateutilからの保護

Google Cloudとコンテナの継続的なセキュリティ

本文の内容は、2019年12月12日にSysdigのVicente Herrera Garcíaが投稿したブログ(https://sysdig.com/blog/malicious-python-libraries-jeilyfish-dateutil/)を元に日本語に翻訳・再構成した内容となっております。

2つの悪意のあるPythonライブラリ、jeilyfish(大文字のiと元の名前の小文字のL)とpython3-dateutilが12月1日にPyPI(Python Package Index)で検出されました。これらは、同様の名前の正当なライブラリjellyfish(二重小文字のL)とpython-dateutilライブラリのタイポスクワッティングでした。

このブログでは、Sysdig SecureにおいてFalcoルールを用いたランタイムポリシーイメージスキャニングを使用して、CI/CDパイプラインでそれらを検出および停止する方法とその動作について説明します。

悪意のあるタイポスクワッティングライブラリがオフィシャルのPyPIインデックスで検出されなかった1年

トロイの木馬化された両方のライブラリは、正当なライブラリに基づいてコードを作成したため、セキュリティ上の懸念について多くのヒントを与えることなく、完全に置き換えられました。

デベロッパー達から報告されたその日にインデックスから即座に削除されました。トロイの木馬化されたjeilyfishライブラリはほぼ1年間(2018年12月11日)インデックス上にありましたが、python3-dateutilは数日間しか存在していませんでした。Jeilyfishは、利用可能になった先月からのみ140以上のダウンロードを記録しました。

20200214-11.png

Jeilyfish、SSHおよびGPGキーを盗む

Jeilyfishライブラリは、悪意のあるPythonライブラリの中でも最も厄介なものです。ライブラリには、実際にはPythonコードであるbase64圧縮テキストが含まれていました。デコード、圧縮解除、そして、実行されるとURLに接続して別のエンコードされたコードをダウンロードします。デコードされ実行されると、現在のユーザーのホームディレクトリのSSHキーとGPGキーがコピーされ、HTTPでサーバーにアップロードされます アドレスhttp://68.183.212.246:32258(ホスティングプロバイダーによって既にブロックされています)。また、いくつかのディレクトリ(ホーム、ドキュメント、ダウンロード、PycharmProjects)の内容に関する情報のリスト、およびifconfig.coサービスを使用して、トロイの木馬化されたコンピューターのIPアドレスとその位置情報データに関する情報をコンパイルします。

コンテンツを一覧表示するディレクトリには、PythonのPycharmエディターで使用されるPycharmProjectsが含まれます。したがって、これらのSSHおよびGPGキーを使用して公開される可能性のあるPythonプロジェクトについての知識を得て、改ざんします。プロジェクトでこのライブラリを検出したデベロッパーは、できるだけ早くキーを無効にし、それらのキーを使用したプロジェクトにおける最近の変更を確認する必要があります。

Python3-dateutil,参照で害を及ぼす

python3-dateutilライブラリは説明が最も簡単です。 デベロッパーから、それはjeilyfishを参照するだけなので、参照により悪意があると見なされます。 また、Fedoraのような一部のディストリビューションでは、パッケージの「python3-dateutil」という名前が(ただし、PyPIではない)正当なものとして使用されているため、そのタイポスクワッティング名で参照されるパッケージをブロックしようとすると、誤検出が発生する可能性があります。そのため、悪意のあるアクティビティを検出および防止するため、jeilyfishライブラリのブロックに焦点を当てます。

Sysdig Secureによる悪意のあるPythonライブラリからの保護

Sysdig Secureを使用して、CI/CDパイプラインと実行時の両方でjeilyfishを検出および停止する手順を説明します。また、実行時に悪意のある動作の一部を検出する方法についても説明します。そのため、パイプラインで脅威の修正バージョンが検出されなくても、その影響から保護されます。できるだけ早く対処する必要がある他の同様のゼロデイ脅威およびタイポスクワッティングライブラリから保護するために、同じ手順を実行できます。

20200214-12.png

CI/CDパイプラインでの悪意のあるPythonライブラリの検出

セキュリティの脅威を防ぐ最良の方法は、脅威が本番環境に到達するのを防ぐことです。Sysdig Secureを使用して、イメージスキャンをCI/CDパイプライン開発ツールと統合して、開発レベルでの脅威を防ぐことができます。 Jenkins CI/CDGitlab CI/CDAzure PipelinesAtlassian BambooAWS CodePipeline、AWS CodeBuildなどと統合できます。

また、これらのルールを使用すると、レジストリ内のイメージの手動スキャン実行中のコンテナのスキャン、さらにはレジストリにアクセスせずにローカルイメージをスキャンできることも覚えておいてください。

タイポスクワッティング悪意のあるPythonパッケージのイメージスキャンのポリシーを作成する

まず、悪意のあるPythonパッケージの使用を検出するのに役立つすべてのルールのポリシーの作成を開始します。Sysdig Secureダッシュボードに移動し、メニュー項目[Image Scanning]> [Image scanning policies]> [Policies]を使用してイメージスキャンポリシーリストに移動し、[Add policy]ボタンをクリックします。

  • Name:Jeilyfish悪意のあるPythonライブラリ(タイポスクワッティング)
  • Description:jeylyfish(小文字のLの前に大文字のi)を使用して、悪意のあるPythonライブラリをタイポスクワットし、PyPIの実際のクラゲライブラリ(2つのLを含む)に取って代わります。

ルールセクションでは、常にゲートを選択することから始めて、いくつかのルールを追加します。

20200214-13.png

タイポスクワッティングの悪意のあるPythonパッケージを検出するためのイメージスキャンルール

最初に説明するルールでは、コンテナイメージで特定の名前のPythonパッケージが使用されているかどうかを確認します。このデータをフォームに入力します。

  • Gate: Packages
  • Blacklist
  • Select parameters (click to expand parameter list)
  • Name: jeIlyfish
  • Version (optional): (leave blank)
  • Stop

(名前の小文字のLの前に大文字のiがあることに注意してください)。

20200214-14.png

悪意のあるPythonライブラリのインストール試行を検出するイメージスキャンルール

次に、コンテナイメージを構築するDockerfileが何らかの方法で問題のあるライブラリを参照することを検出するルールを作成します。新しいゲートを選択します。

  • Gate: Dockerfile
  • Instruction
  • Check (click to expand parameter list)
  • Actual dockerfile only: Leave blank
  • Check: like
  • Instruction: RUN
  • Value: .*jeIlyfish.*
  • Stop

(名前の小文字のLの前に大文字のiがあることに注意してください)。

20200214-15.png

悪意のあるファイル名を検出するためのイメージスキャンルール

このポリシーは、ディレクトリの存在と悪意のあるファイルのファイル名を検出します。ファイルのチェックサムを知っていれば追加することもできますが、この場合、パッケージはすぐに削除されます。 知っているのはディレクトリ名とそれに含まれるファイルjeIlyfish/_jellyfish.py("_je"の後の文字は大文字のiと小文字のL)であると仮定します。次のポリシーを使用して、その情報を使用してコンテナイメージ内の情報を検出します。

[add new policy]をクリックし、次の値を使用します。

  • Gate: Files
  • Name match
  • Regex: jeIlyfish\/_jellyfish\.py
  • Stop

(ディレクトリ名の小文字のLの前に大文字のiがあることに注意してください)。

3つのルールを追加すると、ポリシーは次のようになります。

20200214-16.png

[Save]をクリックして、最後にイメージスキャンのポリシーを追加します。

Falcoを使用して実行時に悪意のあるアクティビティを検出する

コンテナイメージをスキャンする方法を示しましたが、物理ホスト、またはデベロッパーがスキャンを実行せずにローカルでビルドし、レジストリなしで実行できるようにする開発クラスターをモニタリングしている場合があります。また、悪意のあるアクティビティの症状を検出する方法を示して、さまざまな新しい脅威の派生ルールを作成できるようにします。

次に、実行時にチェックされるSysdig SecureでFalcoランタイムルールを定義する方法を示します。Falcoは、ビヘイビアアクティビティモニターに使用できるKubernetesランタイムセキュリティツールです。

悪意のあるIPアドレスへの発信接続を検出するFalcoルール(68.183.212.246)

最初に示すルールでは、jeilyfishの悪意のあるPythonライブラリサーバーのIPアドレスへの接続を検出します。これは実行時にのみ検出できるものであり、接続を検出するIPアドレスがわかったら、他の同様の脅威に対してこのルールをカスタマイズできます。

このルールを作成するには、Sysdig Secureダッシュボードで[Policies]> [Rules]> [Rules Library]に移動し、[Add Rule]をクリックします。

  • Name: Connection to jeilyfish malicious Python library server at 68.183.212.246
  • Description: Detect attempts to connect to a malicious server (35.184.21.208)
  • Condition: outbound and fd.sip="68.183.212.246"
  • Output: Outbound connection to jeilyfish malicious Python library server (35.184.21.208) (command=%proc.cmdline connection=%fd.name %container.info image=%container.image)
  • Priority: Critical
  • Source: Syscall
  • Tags: network, jeilyfish
20200214-17.png

このFalcoルールのコード:

- rule: Connection to Jeilyfish malicious Python library server
  desc: Detect attempts to connect to a malicious server (35.184.21.208)
  condition: outbound and fd.sip="68.183.212.246"
  output: Outbound connection to Jeilyfish malicious Python library server (35.184.21.208) (command=%proc.cmdline connection=%fd.name %container.info image=%container.image)
  priority: CRITICAL
  tags: [network, python, jeilyfish, typosquatting]

pipを使用した悪意のあるライブラリのインストールを防ぐFalcoルール

実行中のコンテナまたは任意のホストで、これらの悪意のあるPythonライブラリのインストール試行を直接検出することもできます。

[Policies]> [Rules]> [Rules Library]に再度移動し、[Add Rule]をクリックします。

  • Name: Prevent installation of malicious jeilyfish Python library
  • Description: Detects the execution during runtime using pip of the jeilyfish malicious Python library
  • Condition: spawned_process and (proc.name="pip" or proc.name="pip3") and (proc.cmdline contains "jeilyfish")
  • Output: Detect installation of malicious jeilyfish Python library (user=%user.name command=%proc.cmdline container=%container.info)
  • Priority: Critical
  • Source: Syscall
  • Tags: filesystem, jeilyfish
20200214-18.png

同様のFalcoルール:

- rule: Prevent installation of malicious jeilyfish Python library
  desc: Detects the execution during runtime using pip of the jeilyfish malicious Python library
  condition: >
    spawned_process and
    (proc.name="pip" or proc.name="pip3") and
    (proc.cmdline contains "jeilyfish")
  output: "Detect installation of malicious jeilyfish Python library (user=%user.name command=%proc.cmdline container=%container.info)"
  priority: CRITICAL
  tags: [filesystem, python, pip, jeilyfish, typosquatting]

SSHキー読み取りを検出するFalcoルール

FalcoにはすでにSSHキー読み取りを検出するルールがあります。これらのパラメーターを使用して、/etc/sshディレクトリーの追加チェックを追加するものを作成できます。

  • Name: Read ssh information v2
  • Description: Any attempt to read files below ssh directories by non-ssh programs
  • Condition: (consider_ssh_reads and (open_read or open_directory) and (user_ssh_directory or fd.name startswith /root/.ssh or fd.name startswith /etc/ssh) and (not proc.name in (ssh_binaries)))
  • Output: ssh-related file/directory read by non-ssh program (user=%user.name command=%proc.cmdline file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline container_id=%container.id image=%container.image.repository)
  • Priority: Critical
  • Source: Syscall
  • Tags: filesystem, jeilyfish
20200214-19.png

Falcoルールコード:

- rule: Read ssh information
  desc: Any attempt to read files below ssh directories by non-ssh programs
  condition: >
    (consider_ssh_reads and
     (open_read or open_directory) and
     (user_ssh_directory or fd.name startswith /root/.ssh or fd.name startswith /etc/ssh) and
     (not proc.name in (ssh_binaries)))
  output: >
    ssh-related file/directory read by non-ssh program (user=%user.name
    command=%proc.cmdline file=%fd.name parent=%proc.pname pcmdline=%proc.pcmdline container_id=%container.id image=%container.image.repository)
  priority: CRITICAL
  tags: [filesystem, mitre_discovery, jeilyfish, typosquatting]

GPGキー読み取りを検出するFalcoルール

このルールでは、最初にGPGキーを読み取る可能性のあるGPGバイナリのリストを作成します。今は1つだけを含めますが、後で追加する必要がある場合があります。

[Policies]> [Rules]> [Falco Lists]に移動し、[Add List]をクリックします。

  • List name: gpg_binaries
  • Items: gpg
20200214-20.png

ここで、/rootまたは/homeディレクトリ内にあるときに、.gnupgディレクトリ内のファイルへの読み取りを検出するルールを作成します。これを行うには、[Policies]> [Rules]> [Rules Library]に再度移動し、[Add Rule]をクリックします。

  • Name: Read GPG keys
  • Description: Any attempt to read files below user gpg key directories by non-gpg programs
  • Condition: (open_read or open_directory) and ((fd.name startswith /root/.gnupg) or (fd.name startswith '/home' and fd.name contains '.gnupg)) and (not proc.name in (gpg_binaries))
  • Output: GPG key read by non-gpg program (user=%user.name command=%proc.cmdline file=%fd.name parent=%proc.pname)
  • Priority: Critical
  • Source: Syscall
  • Tags: filesystem, gpg, jeilyfish
20200214-21.png

Falcoルールコード:

- list: gpg_binaries
  Items: [gpg]
- rule: Read GPG keys
  desc: Any attempt to read files below user gpg key directories by non-gpg  programs
  condition: >
    (open_read or open_directory) and
    ((fd.name startswith /root/.gnupg) or
     (fd.name startswith '/home' and fd.name contains '.gnupg)) and
    (not proc.name in (gpg_binaries))
  output: >
    GPG key read by non-gpg program (user=%user.name command=%proc.cmdline
    file=%fd.name parent=%proc.pname)
  priority: CRITICAL
  tags: [filesystem, gpg, secret exfiltration, jeilyfish, typosquatting]
  source: syscall

悪意のあるPythonライブラリを実行しているコンテナーを停止するポリシーを作成する

ランタイムルールは、アクションを実行して脅威を通知するために、ポリシーと連携して機能する必要があります。ここでは、ルールがトリガーされるたびに電子メールで警告するポリシーを作成し、発生したアクティビティを調査するために後で検査できるシステムイベントをキャプチャし、問題のコンテナーをストップさせる方法を説明します。

これらのルールのポリシーを作成するには、[Policies]> [Runtime Policies]に移動し、[Add Policy]をクリックします

  • Name: Malicious Python library jeilyfish activities prevention
  • Description: Prevent runtime activities from jeilyfish malicious Python library
  • Enabled: On
  • Severity: High
  • Scope: Custom Scope

Everywhere (空白のまま)

  • Rules

[Import from library]をクリックし、作成したルールをタグで検索またはフィルターし、それらを選択して[Mark for Import rules]をクリックし、[Import rules]をクリックします。

  • Actions: Containers: Stop / Capture: On イベントの5秒前、15秒後
  • Notification Channels: Email Channel

また、プロファイルの[Settings]> [Notifications]に異なる通知チャネルを追加するか、検出ごとに個別のポリシーを作成して、問題をより簡単に特定できるようにすることもできます。

まとめ

タイプミスの名前を持つ2つの悪意のあるPythonライブラリjeilyfishとpython3-dateutilが、公式のPyPIインデックスで検出され、SSHおよびGPGキーを盗みました。それらは1年間検出されませんでした。

Sysdig Secureを使用すると、トロイの木馬化されたライブラリの使用だけでなく、悪意のある振る舞いも検出および防止するためのポリシーとルールを簡単に作成できます。 インフラストラクチャを将来の攻撃からも保護する事を可能とします。

試されたい方は、https://sysdig.com/ 内のProduct->Free Trialをクリックすると14日間のトライアルライセンスが発行されます。Sysdig Secureも試されたい方は、http://www.scsk.jp/sp/sysdig/index.htmlからお問い合わせいただければと存じます。

最近の投稿

カテゴリー

アーカイブ

ご質問・お問い合わせはこちら

top