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パイプラインでそれらを検出および停止する方法とその動作について説明します。
トロイの木馬化された両方のライブラリは、正当なライブラリに基づいてコードを作成したため、セキュリティ上の懸念について多くのヒントを与えることなく、完全に置き換えられました。
デベロッパー達から報告されたその日にインデックスから即座に削除されました。トロイの木馬化されたjeilyfishライブラリはほぼ1年間(2018年12月11日)インデックス上にありましたが、python3-dateutilは数日間しか存在していませんでした。Jeilyfishは、利用可能になった先月からのみ140以上のダウンロードを記録しました。
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ライブラリは説明が最も簡単です。 デベロッパーから、それはjeilyfishを参照するだけなので、参照により悪意があると見なされます。 また、Fedoraのような一部のディストリビューションでは、パッケージの「python3-dateutil」という名前が(ただし、PyPIではない)正当なものとして使用されているため、そのタイポスクワッティング名で参照されるパッケージをブロックしようとすると、誤検出が発生する可能性があります。そのため、悪意のあるアクティビティを検出および防止するため、jeilyfishライブラリのブロックに焦点を当てます。
Sysdig Secureを使用して、CI/CDパイプラインと実行時の両方でjeilyfishを検出および停止する手順を説明します。また、実行時に悪意のある動作の一部を検出する方法についても説明します。そのため、パイプラインで脅威の修正バージョンが検出されなくても、その影響から保護されます。できるだけ早く対処する必要がある他の同様のゼロデイ脅威およびタイポスクワッティングライブラリから保護するために、同じ手順を実行できます。
セキュリティの脅威を防ぐ最良の方法は、脅威が本番環境に到達するのを防ぐことです。Sysdig Secureを使用して、イメージスキャンをCI/CDパイプライン開発ツールと統合して、開発レベルでの脅威を防ぐことができます。 Jenkins CI/CD、Gitlab CI/CD、Azure Pipelines、Atlassian Bamboo、AWS CodePipeline、AWS CodeBuildなどと統合できます。
また、これらのルールを使用すると、レジストリ内のイメージの手動スキャン、実行中のコンテナのスキャン、さらにはレジストリにアクセスせずにローカルイメージをスキャンできることも覚えておいてください。
まず、悪意のあるPythonパッケージの使用を検出するのに役立つすべてのルールのポリシーの作成を開始します。Sysdig Secureダッシュボードに移動し、メニュー項目[Image Scanning]> [Image scanning policies]> [Policies]を使用してイメージスキャンポリシーリストに移動し、[Add policy]ボタンをクリックします。
ルールセクションでは、常にゲートを選択することから始めて、いくつかのルールを追加します。
最初に説明するルールでは、コンテナイメージで特定の名前のPythonパッケージが使用されているかどうかを確認します。このデータをフォームに入力します。
(名前の小文字のLの前に大文字のiがあることに注意してください)。
次に、コンテナイメージを構築するDockerfileが何らかの方法で問題のあるライブラリを参照することを検出するルールを作成します。新しいゲートを選択します。
(名前の小文字のLの前に大文字のiがあることに注意してください)。
このポリシーは、ディレクトリの存在と悪意のあるファイルのファイル名を検出します。ファイルのチェックサムを知っていれば追加することもできますが、この場合、パッケージはすぐに削除されます。 知っているのはディレクトリ名とそれに含まれるファイルjeIlyfish/_jellyfish.py("_je"の後の文字は大文字のiと小文字のL)であると仮定します。次のポリシーを使用して、その情報を使用してコンテナイメージ内の情報を検出します。
[add new policy]をクリックし、次の値を使用します。
(ディレクトリ名の小文字のLの前に大文字のiがあることに注意してください)。
3つのルールを追加すると、ポリシーは次のようになります。
[Save]をクリックして、最後にイメージスキャンのポリシーを追加します。
コンテナイメージをスキャンする方法を示しましたが、物理ホスト、またはデベロッパーがスキャンを実行せずにローカルでビルドし、レジストリなしで実行できるようにする開発クラスターをモニタリングしている場合があります。また、悪意のあるアクティビティの症状を検出する方法を示して、さまざまな新しい脅威の派生ルールを作成できるようにします。
次に、実行時にチェックされるSysdig SecureでFalcoランタイムルールを定義する方法を示します。Falcoは、ビヘイビアアクティビティモニターに使用できるKubernetesランタイムセキュリティツールです。
最初に示すルールでは、jeilyfishの悪意のあるPythonライブラリサーバーのIPアドレスへの接続を検出します。これは実行時にのみ検出できるものであり、接続を検出するIPアドレスがわかったら、他の同様の脅威に対してこのルールをカスタマイズできます。
このルールを作成するには、Sysdig Secureダッシュボードで[Policies]> [Rules]> [Rules Library]に移動し、[Add Rule]をクリックします。
この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]
実行中のコンテナまたは任意のホストで、これらの悪意のあるPythonライブラリのインストール試行を直接検出することもできます。
[Policies]> [Rules]> [Rules Library]に再度移動し、[Add Rule]をクリックします。
同様の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]
FalcoにはすでにSSHキー読み取りを検出するルールがあります。これらのパラメーターを使用して、/etc/sshディレクトリーの追加チェックを追加するものを作成できます。
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キーを読み取る可能性のあるGPGバイナリのリストを作成します。今は1つだけを含めますが、後で追加する必要がある場合があります。
[Policies]> [Rules]> [Falco Lists]に移動し、[Add List]をクリックします。
ここで、/rootまたは/homeディレクトリ内にあるときに、.gnupgディレクトリ内のファイルへの読み取りを検出するルールを作成します。これを行うには、[Policies]> [Rules]> [Rules Library]に再度移動し、[Add Rule]をクリックします。
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
ランタイムルールは、アクションを実行して脅威を通知するために、ポリシーと連携して機能する必要があります。ここでは、ルールがトリガーされるたびに電子メールで警告するポリシーを作成し、発生したアクティビティを調査するために後で検査できるシステムイベントをキャプチャし、問題のコンテナーをストップさせる方法を説明します。
これらのルールのポリシーを作成するには、[Policies]> [Runtime Policies]に移動し、[Add Policy]をクリックします
Everywhere (空白のまま)
[Import from library]をクリックし、作成したルールをタグで検索またはフィルターし、それらを選択して[Mark for Import rules]をクリックし、[Import rules]をクリックします。
また、プロファイルの[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からお問い合わせいただければと存じます。