fbpx

コンテナ環境におけるファイルレスマルウェア #aqua #コンテナ #セキュリティ #ファイルレスマルウェア

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

New call-to-action

本ブログは「Aqua Security」社の技術ブログで2022年8月11日に公開された「 Intro to Fileless Malware in Containers 」の日本語翻訳です。

コンテナ環境におけるファイルレスマルウェア


ファイルレスマルウェア攻撃とは、検知されないまま、段階的に環境を制御していく手法のことです。ファイルレスマルウェア攻撃では、マルウェアが直接メモリにロードされて実行されるため、一般的な防御策や静的スキャンを回避できます。

多くの場合、攻撃者は圧縮や暗号化を用いてマルウェアファイルを隠蔽し、検知を回避します。Windows に対する利用が最も一般的ですが、最近では Linux、特にコンテナ内での利用が増加している傾向が見られます。このガイドでは、独自のファイルレスマルウェアのデモによってファイルレスマルウェア攻撃を分析し、私たちが見ているアクティビティを検出するために必要なツールを紹介します。

マルウェアとは、ソフトウェアに損害を与え、情報を盗み、サプライチェーンを完全に制御することを目的とした悪質なコードです。マルウェアには、いくつかの形態があります。マルウェアには、ウイルス、ワーム、トロイの木馬、ランサムウェア、ボット、アドウェア、ファイルレスなどの形態があり、その中には非常に高度なものもあります。

ファイルレスマルウェア攻撃は、高度なマルウェアの一種で、現在、最も危険なセキュリティ脅威の1つです。2017年の Ponemon Institute のレポートによれば、ファイルレスマルウェア攻撃はファイルベース攻撃の 10倍 の成功率となっています。実際、成功した攻撃の 77% がファイルレス技術またはエクスプロイトに起因しています。さらに、2020年の WatchGuard のレポートでは、この手法が2019年から 900% 近く増加していることが指摘されています。ファイルレスマルウェア攻撃は、ほとんどのアンチウイルスソフトウェア、エンドポイント検出および応答(EDR)、および従来のセキュリティツールでは検出できません。これらは通常、ファイルシステム内のファイルディスクリプタに基づいて侵害を発見するだけだからです。ファイルレスマルウェア攻撃は、メモリアドレスから実行されるため、何が起こったかについての証拠やフォレンジックの手がかりを収集することはほとんど不可能です。この形式の攻撃の詳細については、こちらを参照してください。

ファイルレスマルウェア攻撃は、自身を隠すために一般的なアーティファクトを使用します。ファイルレスマルウェア攻撃は、多くの場合、広く使用されているアプリケーションに悪意のあるコードを注入するために、信頼できるソフトウェアの中にカモフラージュされます。ひっそりと身を隠しながら、ソフトウェアのサプライチェーンに攻撃を仕掛け、ファイルレスマルウェア攻撃を広め、信頼できるソフトウェアの関係やネットワークを悪用して組織に侵入していきます。

過去に成功したファイルレスマルウェア攻撃のほとんどは、PowerShell、Microsoft Office マクロ、WMI、スクリプト言語(VBScript、Windows PowerShell)や、人気のあるポストエクスプロイトツール(PowerShell empire、Powersploit、Metasploit、cobaltstrikeなど)の乗っ取られたアーティファクトを経由して、Windows で発生しています。

しかし現在では、Linux だけでなく、Linux カーネルをベースにした、名前空間や cgroup を利用した技術であるコンテナへの攻撃も急増しています。ここでは、Linux におけるプロセスインジェクションの仕組みの1つを紹介し、悪質な攻撃者がいかに容易にコンテナへのファイルレスマルウェア攻撃ができるか見ていきましょう。

Linuxにおけるファイルレスマルウェアの攻撃

Linux システムを標的としたファイルレスマルウェア攻撃は、感染から始まり、悪意のあるコードの実行に至るまで、一連のステップを踏みます。そこから、攻撃者は、サーバとデータの両方を危険にさらすことができます。攻撃は、いくつかの方法(フィッシングメール、悪意のあるリンクなど)で開始されますが、最も一般的で成功しやすい方法は、既存の脆弱性を悪用する方法です。脆弱性スキャンツールの使用は、一般的な脆弱性と暴露(CVE)を特定し管理するための最初のステップですが、実行時に行われる高度な攻撃を阻止するには十分ではありません。


図1

ステップ1:脆弱性の悪用による感染 - まず、パッチが適用されていない脆弱性や、ネットワークプロトコルの欠陥などの弱点を発見することから攻撃が開始されます。これに対しては、脆弱性スキャン、設定ミス、コンプライアンス、シークレット管理などのツールを使用することが、最も良い対策となります。

悪用可能な脆弱性は、ターゲットシステムにアクセスするためのゲートウェイとして使用される可能性があるため、脆弱性スキャンはソフトウェアライフサイクルの重要なシフトレフトコントロールとなります(図2)。ただし、ファイルレスマルウェア攻撃は実行時に発生するため、静的スキャンツールでは検出できません。


図2

ステップ2:Linux プロセスの改ざん - 脆弱性を悪用してアクセス権を得ると、悪意のあるプログラムは、ptrace syscall、LD_PRELOAD 環境など、プロセスインジェクションを実行するための多くのテクニックを使用できます。

ステップ3:メモリへの悪意のあるコードの挿入 - ファイルレス技術を利用すると、ファイルを書き込むことなく、メモリに悪意のあるコードを挿入可能です。例えば、memfd_create で匿名のディスクリプタを作成し、実行中のプロセスへ挿入します。

ステップ4:悪意のあるコードの実行 - 悪意のあるコードの実行された後は、すでにシステムは侵害されています。マルウェア、クリプトマイニング、その他の悪意のある手法のいずれであっても、システムは、機密データの窃盗、サーバの破壊、重要なファイルの暗号化などに対して無防備になるのです。

Linuxでコードインジェクションを実現する

コードインジェクションは、ファイルレスマルウェア攻撃でよく使われる手法です。通常、脆弱性やエクスプロイトによって最初のアクセスを得た後に、Linux プロセスを変更するために使用されます。Linux の世界では、プロセスは実行中のプログラムのインスタンスであり、プロセスの ID は PID として知られています。そして、そのアクティブなプロセスのメモリアドレス(通常は ELF バイナリファイル)を使用してコードが注入されます。他のプロセスのコンテキストでコードを実行すると、他のリソース(メモリ、ネットワークなど)にアクセスを必要とする場合があります。Linux におけるコードインジェクションは、ptrace や memfd_create などのシステムコールや、LD _PRELOAD などの環境変数の使用がよく見られます。

Ptrace システムコールは、UNIX システム上のデバッガ(gdb や dbx など)が、アタッチされた子プロセスによって呼び出されるシステムコールを検査するために使用されます。主な役割は、他のプロセスの実行を制御するプロセスであるトレーサと、トレーサに制御されるプロセスであるトレース先です。ptrace を利用するには特権的なアクセス権が必要なため、より巧妙なテクニックが求められます。

LD_PRELOAD 環境変数は、そのメイン関数が呼び出される前に、すべての共有オブジェクトをプロセスにロードします。これは、コードを注入する1つの方法です。しかし、これを行うには、ターゲットプロセスを再起動する必要があります。プリロードは、ほとんどの UNIX システムで利用可能なダイナミックリンカー(ld)の機能です。この機能により、実行ファイルにリンクされた他のライブラリより先に、ユーザ定義の共有ライブラリをロードできます。

memfd_create は、Linux カーネル 3.17(sys_356/319)で追加されたシステムコールです。この機能により、メモリに直接格納される匿名ファイルを作成できます。このため、マルウェアや特定のバイナリなど、任意のプログラムをロードするために使用できます。また、特権ユーザ権限で使用する必要はありません。

つまり、コードインジェクションは、システムコールフッキングから、ファイルレスマルウェアの実行を可能にする Java プログラミング言語の違反を突く Log4j CVE-2021-44228 の場合のようなゼロデイ脆弱性まで、多くの方法で発生する可能性があります。

ファイルレス攻撃のシミュレーション

1. memfd_create、すべての始まりとなるネイティブな Linux のシステムコール

ファイルレスインジェクションを実行するには、多くの方法があります。ここでは、シンプルにするため、memfd_create システムコールを使用した Linux カーネルのネイティブ機能に関わるインジェクションを実行することにしました。

システムコール memfd_create を使用するプログラムを作成し、匿名ディスクリプタを作成し、それを使用してコードを注入することにより、ファイルレスマルウェアのプロセスをミラーリングできます。

memfd_create は、Linux が /proc/PID/fd/ に匿名のファイルディスクリプタを作成するために使用するシステムコールで、execve を使用して実行できます。そのため、マウントデバイス、一時ファイルストレージ(tmpfs)、一時 RAM ストレージ(/dev/shm)にも存在せず、ファイルシステムのスキャンのみを行うセキュリティツールでは見つけられません。Linux 開発者向けのあらゆるプログラミング言語と同様に(図3参照)、このシステムコールを使ってプログラムを作成できます。


図3 - コード319のシステムコールをサポートするプログラミング言語

2. ファイルレス実行を実現するためのプログラム

memfd_create を呼び出すことで、マルウェアなどの任意のバイナリをロードするために使用できる、匿名ディスクリプタを得ることができます。execve システムコールとともに、前のステップで memfd_create によって作成された匿名ディスクリプタを指し示すプログラムが実行されます。このようなロジックを持つ実装が GitHub 上で多数見つかっていますが、その1つが memrun です(図4)。このプログラムには、プログラミング言語 Golang を使用してメモリへのコードインジェクションを実行するために必要なすべての手順が含まれています。主なパラメータは、注入される ELF バイナリパスと、そのアドレスメモリを使用するライブプロセスです。サンプルデモでは、実行中のプロセス「nginx」を使用して、「./memrun nginx invasive_binary」として「invasive binary」をインジェクションしている様子が分かります。


図4 – memrun コード

Memrun - 特に注目すべきは、いくつかのファイルレスマルウェア攻撃で、memrun と同じユーザによって作成されたツールを利用していることです。このツールは Ezuri Golang crypter と呼ばれ、皮肉にも教育目的で開発されましたが、後に、犯罪的な攻撃を目的として再利用されるようになりました。

3. コンテナイメージにプログラムを追加

デモ用に、コンテナ実行時に使用する公式 nginx イメージの中にバイナリを追加して、新しいイメージを作成しました(図5)。


図5 – コンテナイメージ

ファイルレスマルウェアインジェクションがどのように実現されるかをシミュレーションしたところで、コードインジェクションの解析に移りましょう。詳しくは前出の memrun に関するメモを参照してください。

Traceeで攻撃を検知する

セキュリティランタイムの不審な挙動を特定するオープンソースツール「Tracee」を用いることで、このファイルレス実行技術を検出できます(図6)。Tracee は、eBPF 技術を使ってカーネルレベルで収集したイベントをリアルタイムに解析します。デモ(図6)では、execve、close、openatmemfd_create などの主なシステムコールが使用されており、その他の主要なイベントも使用されています。Tracee では、コードインジェクション、ダイナミックコードローディング、ファイルレス実行などのセキュリティ脅威を分析・特定するための抽象化として、「シグネチャ」という用語を使用できます。これらのシグネチャは、Aqua のセキュリティ研究チームである Team Nautilus によって開発された行動指標として機能します。シグネチャの全リストはこちらにあります。

  1. デモ コンテナを実行
  2. Tracee を実行
  3. Tracee により検知


図6 - nginxプロセスを利用したファイルレス実行で、コードインジェクションを行う

以下のリポジトリで、デモを再現するための詳細な手順を見ることができます。
https://github.com/krol3/demo-fileless

クラウドネイティブディテクション&レスポンスで攻撃を検知する

ファイルレスマルウェア攻撃を検出し、Aqua のオープンソースプロジェクト Tracee よりも改善された UI の恩恵を受けるために、Cloud Native Detection and Response(CNDR)を使用することをお勧めします。CNDR は Aqua Platform のランタイム機能の一部で、Tracee をベースに開発されており、より大きな行動指標のデータベースと、企業レベルのサポートを含む包括的で簡単な UI を備えています。例えば、Tracee では10以上のデフォルトルールがありますが、CNDR では 100 以上のセキュリティシグネチャを持っています。これらの行動指標は、Aqua Nautilus Security Research が実世界で観測されたクラウドネイティブ攻撃を基に作成されています。

コード、コンテナイメージ、Kubernetes マニフェスト、infra as code などのアーティファクトをスキャンすることは、設定ミス、ハードコードされた秘密データ、脆弱性を回避するための最初のステップとなります。これにより、攻撃者が早期に足場を築くことが制限されます。いつ、あなたのシステムをハッキングする新しい脅威が発見されるかわかりません。ファイルレスマルウェアのような検出の難しい高度なテクニックが、あなたのシステムに存在する可能性があることを忘れてはいけません。次の log4j や spring4shell のようなゼロデイ脆弱性について考え、お客様の環境に足場を築き、検知を回避するような高度な脅威を検知する方法が必要です。

デモにあるリアルタイムマルウェア保護コントロールについて注目し、現在これらの脅威を検知可能かご確認ください。


図7 - Detection and Response (CNDR) to detect Fileless Malware

関連事項として、クラウド環境(CSPM)の検出と基本的なリスクを示すデモビデオをご覧ください。

まとめ


ファイルレスマルウェアは、検出が非常に難しく、セキュリティツールから巧妙に隠れることができるため、より注目されるようになった強力な攻撃手法です。ファイルレスのような高度な攻撃を発見し、対応するために、クラウドネイティブ環境での実行中に不審なイベントを特定するセキュリティツールの利用が不可欠です。脅威は常に進化し、発見されています(Zero Days)。そのため、セキュリティ研究の専門家が定義した悪意のある行動(シグネチャ)を特定し、真のリスクに優先順位をつけるために、常に最新情報を入手することが重要です。

Trivy は、脆弱性、設定ミス、秘密などのセキュリティスキャンを行うためのツールです。詳細はこちらをご覧ください。Tracee は、Linux 用のランタイムセキュリティとフォレンジックツールで、Aqua とともに、コードからランタイムまで、アプリケーションのすべてのフェーズに統合された独自のプラットフォームで検出と応答機能を提供します。Aqua がどのようにセキュリティクラウドネイティブの完全なソリューションを提供するか、詳しくはこちらをご覧ください。

New call-to-action

New call-to-action

新規CTA