執筆者:Edmund Brumaghin、Ross Gibb、Warren Mercer、Matthew Molyett、Craig Williams
9/18 更新:CCleaner Cloud バージョン 1.07.3191 も影響ありとの報告
はじめに
サプライ チェーン攻撃は、悪意のあるソフトウェアを標的組織に配布する方法として非常に効果的です。というのも、サプライ チェーン攻撃では、攻撃者が製造者またはサプライヤと顧客との間の信頼関係を利用するからです。そして、この信頼関係が組織や個人への攻撃に悪用され、さまざまな目的のために実行される危険性があります。2017 年に出現した Nyetya ワームは、この種の攻撃の潜在能力の高さを見せつけました。Nyetya がそうであったように、最初の感染ベクトルが相当な長期間潜伏し続ける例も少なくありません。幸い、AMP のようなツールを使えば可視性が強化されるため、初期の攻撃ベクトルを関知できます。
Talos が最近観察した事例では、ソフトウェア ベンダーが正規のソフトウェア パッケージを配布していたダウンロード サーバが悪用されて、疑いを持たない被害者にマルウェアが配信されました。一時期、Avast 社 が配布する正規の署名入り CCleaner 5.33 にも、インストールに便乗した多段階のマルウェア ペイロードが含まれていたことがありました。CCleaner は、週あたりの新規ユーザ数が 500 万人というペースで成長しており、2016 年 11 月現在で総ダウンロード数 20 億超を誇っていました。ユーザの総数を考慮すれば、ごく一部が感染しても甚大な被害が発生します。そのため早急な対応が急務でした。Avast 社が適切な対応策を開始できるよう、Cisco Talos は 2017 年 9 月 13 日に調査結果を急いで同社に知らせました。以降のセクションでは、この攻撃に関する詳細を具体的に説明します。
技術詳細
CCleaner は、システムの定期メンテナンス用アプリケーションです。一時ファイルの消去や、パフォーマンスを最適化するためのシステム分析などの機能が含まれており、インストールされているアプリケーションを(ディスク容量の)無駄なく管理できます。
図 1:CCleaner 5.33 のスクリーンショット
Cisco Talos は 2017 年 9 月 13 日、新しいエクスプロイト検出技術の顧客ベータ テストを実施していた際に、特定の実行可能ファイルに対して Advanced Malware Protection が発動したことに気付きました。詳しく調べてみると、問題の実行可能ファイルが CCleaner v5.33 のインストーラーであることが判明しました。これは、正規の CCleaner ダウンロード サーバからエンドポイントに配信されたものでした。Talos では、AMP が CCleaner の実行を阻止した理由を探るべく、初期分析に着手しました。ダウンロードされたインストール ファイルは、Piriform 社に発行された有効なデジタル署名を使用していましたが、ダウンロードの際には CCleaner 以外のアプリケーションも付随していることが判明しました。CCleaner 5.33 のインストーラには、32 ビットの CCleaner バイナリに加え、悪意のあるペイロードも含まれていました。このペイロードは、ドメイン生成アルゴリズム(DGA)やハードコードされたコマンド・アンド・コントロール(C2)機能を備えています。また、問題のバージョンの CCleaner について、少なくとも 2017 年 9 月 11 日までは正規のダウンロード サーバ上で直接ホストされていたことが確認されました。
CCleaner ダウンロード サイトの [バージョン履歴(Version History)] ページを見ると、問題のバージョン(5.33)のリリース日は 2017 年 8 月 15 日です。2017 年 9 月 12 日にはバージョン 5.34 がリリースされています。つまり、悪意のあるペイロードを含むバージョン(5.33)は、8 月 15 日から 9 月 12 日の間に配布されました。問題のバージョンは、Symantec により Piriform Ltd に発行された有効な証明書を使用して署名されており、証明書の有効期日は 2018 年 10 月 10 日です。Piriform は Avast が先頃買収した会社で、CCleaner のソフトウェア アプリケーションは当初、Piriform 社によって開発されました。
図 2:CCleaner 5.33 のデジタル署名
この脅威に関連する 2 つ目のサンプルも発見されました。2 つ目のサンプルも有効なデジタル証明書を使用して署名されていましたが、署名のタイムスタンプ時刻は、最初のサンプルの署名から約 15 分後でした。
悪意のある CCleaner バイナリに有効なデジタル署名が存在するということは、一部の開発/署名プロセスが侵害されているという、より重大な問題を示すものとも考えられます。この証明書は、直ちに失効させる必要があります。新しい証明書を生成する際は、新しい証明書を侵害する足掛かりを攻撃者に与えないよう注意が必要です。この問題の範囲や最適な対処法の詳細を確認するには、インシデント対応プロセスが唯一の手がかりとなります。
興味深いことに、Talos が分析した CCleaner のバイナリ内で、次のようなコンパイル アーティファクトが発見されました。
S:\workspace\ccleaner\branches\v5.33\bin\CCleaner\Release\CCleaner.pdb
コンパイル アーティファクトが存在するという事実と、ソフトウェア開発会社に発行された有効な証明書を使用してバイナリがデジタル署名されていたという点を考え合わせると、外部の攻撃者によって開発環境または構築環境の一部が侵害された可能性があります。そして、そのアクセス権を使用して CCleaner のビルドにマルウェアを挿入し、それが組織によってホストされた上、リリースされたというシナリオが想定されます。さらに、組織内の開発環境または構築環境へのアクセス権を持つ内部関係者が意図的に不正コードを組み込んだか、アカウント(または類似のもの)を侵害されたことにより不正コードの組み込みを攻撃者に許した可能性も考えられます。
なお、旧バージョンの CCleaner インストーラーは今でもダウンロード サーバで入手可能ですが、悪意のあるペイロードはすでに削除されており、もはや入手もできません。
マルウェアのインストールと動作
正規の CCleaner v5.33 インストーラーに含まれる 32 ビットの CCleaner v5.33 バイナリの中で、「__scrt_get_dyn_tls_init_callback」が、コードの CC_InfectionBase(0x0040102C)を呼び出すように変更されていました。これは、CCleaner バイナリ内のコード実行フローを、通常の CCleaner の動作に向かわせずに、悪意あるコードにリダイレクトする目的があります。呼び出されるコードにより、悪意のあるペイロードを含んだデータを復号します。ペイロードは、PIC(位置独立コード)である PE ローダーと DLL ファイルの 2 段階で構成されており、マルウェアのペイロードとして効果的に機能します。マルウェア作成者は、IMAGE_DOS_HEADER の値をすべて 0 で埋めることで、セキュリティ ソフトによる DLL の検出を防いでいます。つまり、攻撃は一般的な検出技術を回避しようと試みていました。
次に、バイナリは、HeapCreate(HEAP_CREATE_ENABLE_EXECUTE,0,0) を使用して、実行可能なヒープを作成します。新しいヒープにはスペースが割り当てられ、マルウェアを含む復号データの内容のコピー先となります。ヒープにデータをコピーすると、ソース データは消去されます。次いで PE ローダーが呼び出され、動作を開始します。感染プロセスが始まると、バイナリは、それまで PE ローダーと DLL ファイルが含まれていたメモリ領域を消去します。そして割り当てられていたメモリを解放してヒープを解消し、通常の CCleaner の動作を続けます。
PE ローダーは、位置独立コードの手法を利用して、メモリ内の DLL ファイルの位置を特定します。そして、DLL を実行可能メモリにマッピングし、DLLEntryPoint を呼び出すことにより、ロードされている DLL の実行を開始します。一方、CCleaner バイナリは通常どおり続行されます。その結果、マルウェアの本体が実行されます。次のセクションでは、そのプロセスの概要について説明します。
CBkrdr.dll
検出を回避する目的で DLL ファイル(CBkdr.dll)が改ざんされており、IMAGE_DOS_HEADER の値が 0 で埋められています。DLLEntryPoint は実行スレッドを作成して、ローダーに制御を返します。このスレッドには、CCBkdr_GetShellcodeFromC2AndCall を呼び出す役割があります。また、DLL に関連付けられたメモリの解放に使われる ROP(Return Oriented Programming)チェーンを設定した上で、スレッドを終了させます。
CCBkrdr_GetShellcodeFromC2AndCall
マルウェアの分析中に Talos が観察した不正動作の多くは、この関数によって起こされたものです。この関数は最初に、感染システムの現在のシステム時刻を記録します。その後、601 秒遅れて動作を続行します。その目的はおそらく、所定の間だけサンプルを実行するよう構成されている自動分析システムを回避すること、あるいはデバッガでマルウェアが実行されていないか判断するためだと思われます。この遅延機能を実装するために、マルウェアは、delay_in_seconds タイムアウトを 601 秒に設定して 224.0.0.0 への ping 接続を試行する関数を呼び出します。そして、600 秒が経過したかどうか見極めるために現在のシステム時刻を確認します。条件が満たされない場合、マルウェアは実行を終了し、CCleaner バイナリが通常の動作を続行します。マルウェアが IcmpCreateFile を実行できない場合は、Sleep() を使ってフォールバックし、同じ遅延機能を実行します。また、マルウェアは、現在のシステム時刻と、次のレジストリ ロケーションに格納されている値とを比較します。
HKLM\SOFTWARE\Piriform\Agomo:TCID
TCID に格納されている値が、現在より後の時刻である場合にも、マルウェアは実行を終了します。
図 3:遅延ルーチン
次にマルウェアは、システム実行中のユーザに割り当てられている権限を確認します。悪意のあるプロセスを実行しているユーザに管理者権限がない場合、マルウェアは実行を終了します。
図 4:権限チェック
マルウェアを実行中のユーザが感染システムの管理者権限を持っている場合は、プロセスの SeDebugPrivilege が有効となります。マルウェアは、次のレジストリ ロケーションに格納されている「InstallID」の値を読み取ります
HKLM\SOFTWARE\Piriform\Agomo:MUID
この値が存在しない場合、マルウェアは「((rand()*rand() ^ GetTickCount())」を使用してそれを作成します。
前述のアクティビティが実行されると、マルウェアはシステムのプロファイリングを開始します。また、後で C2 サーバに転送するシステム情報の収集も開始します。システム情報は、次のデータ構造で格納されます。
図 5:CCBkdr_System_Information のデータ構造
収集されたシステム情報は、暗号化された後、変形版の Base64 でエンコードされます。次に、マルウェアはコマンド & コントロール(C2)チャネルを確立します。それについては次のセクションで説明します。
コマンド・アンド・コントロール(C2)
マルウェアの分析中に、C2 関数関連の不正コードの中に、ソフトウェアのバグのようなものを発見しました。Talos が分析したサンプルは、次のレジストリ ロケーションにある DGA で計算された IP アドレスを読み取りますが、今のところ他では使用されていません。
HKLM\SOFTWARE\Piriform\Agomo:NID
現時点で、この IP アドレスの目的は不明です。後続の動作において、マルウェアがそれを利用している形跡が見当たりません。いずれにせよ、前述のようなシステム情報が収集され C2 サーバへの送信準備が行われると、マルウェアは 216[.]126[.]225[.]148 への HTTPS POST リクエストを使用してそれを送信しようとします。HTTPS 通信では、speccy[.]piriform[.]com がハードコードされた HTTP Host ヘッダーが使用されます。speccy[.]piriform[.]com は、同じく Piriform によって作成された、ハードウェアを監視するための正規のプラットフォームです。これにより、ドメインが正規のドメインのように見えたり、被害者のインフラストラクチャによっては想定通りのドメインに見えたりするため、動的分析がいっそう困難になる危険性があります。このリクエストでは HTTPS も活用されますが、セキュリティ エラーはすべて無視されます。なぜなら、サーバの返す自己署名 SSL 証明書が、Host ヘッダー フィールドで定義されたサブドメインで発行されているからです。C2 サーバからの応答が受信されない場合、マルウェアはドメイン生成アルゴリズム(DGA)にフェールバックします。DGA については、この記事の「ドメイン生成アルゴリズム」のセクションで説明します。
マルウェアが使用可能な C2 サーバを認識すると、システム プロファイル情報を含むエンコードされたデータが送信され、次のレジストリ ロケーションに C2 の IP アドレスが格納されます。
HKLM\SOFTWARE\Piriform\Agomo:NID
マルウェアは、現在のシステム時刻に 2 日間を加えた値を、次のレジストリ ロケーションに格納します。
HKLM\SOFTWARE\Piriform\Agomo:NID
C2 サーバから受信したデータが検証され、受信データが CCBkdr_ShellCode_Payload の構造に沿った形式になっていることが確認されます。次に例を示します。
図 6:CCBkdr_ShellCode_Payload のデータ構造
マルウェアは、以前 C2 サーバに送信された値と EncryptedInstallID の値が一致するか確認します。そして、最終的なシェルコードのペイロードにメモリを割り当てます。ペイロードは、変更版の Base64 を使用してデコードされており、新たに割り当てられたメモリ領域に格納されます。ペイロードが復号され、LoadLibraryA と GetProcAddress のアドレスをパラメーターとして呼び出されます。ペイロードが実行されると、メモリの割り当てが解除され、現在のシステム時刻に 7 日間を加えた値が、下記のレジストリの値として設定されます。
HKLM\SOFTWARE\Piriform\Agomo:TCID
受信バッファがすべて 0 で埋められ、割り当てが解除されます。CCBkdr_ShellCode_Payload のデータ構造に対する割り当ても解除され、マルウェアは CCleaner の通常の動作を続行します。以下に、このマルウェアの動作概要を表した図を示します。
図 7:マルウェアの動作プロセス フロー
ドメイン生成アルゴリズム
前のセクションで触れたように、HTTP POST リクエストへの応答がプライマリ C2 サーバから返ってこない場合、マルウェアはフェールバックして DGA アルゴリズムを使用します。このマルウェアが使用するアルゴリズムは時間に基づいており、年と月の値を使用して計算できます。DGA ドメインのリストを以下に示します。
図 8:12 か月間の DGA 生成
マルウェアは、DGA アルゴリズムで生成された各ドメインに対して DNS ルックアップを開始します。DNS ルックアップに対して IP アドレスが返ってこない場合、プロセスが続行されます。マルウェアは、アクティブな DGA ドメインの DNS クエリを実行し、DGA ドメインの名前空間を管理するネーム サーバから 2 つの IP アドレスが返されることを期待します。次にマルウェアは、返された IP アドレスの値に対し一連のビット演算を実行することでセカンダリ C2 サーバを計算し、それらを組み合わせて、その後の C2 動作に使用する実際のフォールバック C2 サーバのアドレスを決定します。このプロセスを以下に図示します。
図 9:C2 プロセス図
マルウェアの分析中に、DGA ドメインが未登録だったことに気づきました。そこで、悪意のある目的で攻撃者に使用されるのを防ぐため、それらのドメインを登録し、シンクホールとしました。
予想される影響
この攻撃では、影響を受ける可能性のあるシステムが甚大な数に上るため、大規模な被害の発生するおそれがあります。CCleaner は、2016 年 11 月現在で、世界全体のダウンロード数が 20 億を超えており、週に 500 万のペースで新しいユーザが増えています。
図 10:CCleaner ユーザの統計
侵害を受けたのがごく一部のユーザであったとしても、攻撃者はそれを不正な目的で自由にエクスプロイトできます。影響を受けたシステムは、2017 年 8 月 15 日より前の状態に復元するか、またはシステムを再インストールする必要があります。ユーザも、感染を防ぐため、最新バージョンの CCleaner に更新する必要があります。本記事の執筆時点で、最新バージョンは 5.34 です。CCleaner のダウンロード ページによると、CCleaner の無料版では自動アップデートは提供されないため、影響を受けるユーザは手動でアップデートする必要があります。
攻撃に関連する DNS ベースのテレメトリ データを分析する中で、前述の DGA ドメインに関連したドメインを解決する DNS 要求が、多数のシステムで行なわれているのを確認しました。これらのドメインは一度も登録されたことがなく、システムが関連する IP アドレスの解決を行おうとするのは、このマルウェアの影響によるものと結論付けるのが妥当と思われます。この DGA に関連するドメインの大部分では、それらをリクエストするトラフィックがほぼ皆無な一方で、8 月と 9 月(このマルウェアが活発だった時期)に関連するドメインは、かなり多くのアクティビティを示しています。
2017 年 7 月(CCleaner 5.33 がリリースされる前)に Cisco Umbrella で観察した DNS 関連のアクティビティを見てみると、このマルウェアに関連する DGA ドメインの IP アドレスを解決する DNS 要求は、ほとんど観察されませんでした。
図 11:2017 年 7 月時点における DGA ドメインの DNS アクティビティ
この記事で前述したように、マルウェアを含んだバージョンの CCleaner は、2017 年 8 月 15 日にリリースされました。次のグラフでは、2017 年 8 月に使用された DGA ドメインに関連した DNS アクティビティの量が大幅に増加したことが示されています。
図 12:2017 年 8 月時点における DGA ドメインの DNS アクティビティ
同様に、2017 年 9 月に関連した DGA ドメインでは、関連する IP アドレスの解決に関するアクティビティは、次のようになっています。
図 13:2017 年 9 月時点における DGA ドメインの DNS アクティビティ
2017 年 9 月 1 日に、DNS アクティビティがシフトしたことに注目してください。8 月に使用されていた DGA ドメインから 9 月に使用された DGA ドメインへとシフトしています。これは、このブログ記事の「ドメイン生成アルゴリズム」のセクションで説明した時間ベースの DGA アルゴリズムに一致しています。Avast 社への連絡後、サーバが停止され、すでに感染しているシステムからの接触は遮断されました。その結果、マルウェアがフェールバックの際に使用する DGA ドメインへのリクエスト量が大幅に増加したのが確認されました。
図 14:サーバ削除後のトラフィックの急増
また、本記事の執筆時点で、ウイルス対策による今回の脅威の検出が非常に低水準にある(執筆時点での検出率は 1/64)ことも、注目に値します。
図 15:VirusTotal による CCleaner バイナリの検出
この脅威への対応の一環として、Cisco Talos は、お客様を保護する包括的なカバレッジをリリースしました。このカバレッジの詳細については、この記事の「カバレッジ」のセクションを参照してください。
まとめ
今回のケースは、攻撃者が世界中の組織や個人にマルウェアを配布しようとしていることを示す最たる例となりました。攻撃者は、ソフトウェア ベンダーとそのユーザとの間の信頼関係を悪用することで、更新プログラムの配布に使用される Web サーバやファイルを、ユーザに疑念を抱かせることなく利用します。ほとんどの組織では、一般的なソフトウェア ベンダーから配布されたデータが、信頼できない供給元からのデータと同じレベルで精査されることはほぼ皆無です。攻撃者には、信頼関係を利用することで、検出を回避しながらマルウェアを配布するという意図がみられました。Cisco Talos では、脅威状況のあらゆる側面に対する監視を今後も注視し、攻撃者が世界中の標的に向けて使用する新しい手口を検出し続けます。
カバレッジ
今回の脅威を検出するために、6336251 および 6336252 の ClamAV 署名がリリースされました。
お客様がこの脅威を検出してブロックできる別の方法を以下に記載します。
Advanced Malware Protection(AMP)は、これらの攻撃者によるマルウェアの実行の阻止に最適です。
CWS や WSA の Web スキャンは、悪意のある Web サイトへのアクセスを阻止し、それらの攻撃に使用されるマルウェアを検出します。
AMP Threat Grid は、悪意のあるバイナリを特定し、すべてのシスコ セキュリティ製品に保護機能を組み込みます。
シスコのセキュア インターネット ゲートウェイ(SIG)である Umbrella は、社内ネットワークの内外で悪意のあるドメイン、IP、URL への接続をブロックします。
INDICATORS OF COMPROMISE(IOC)
ファイルのハッシュ値
6f7840c77f99049d788155c1351e1560b62b8ad18ad0e9adda8218b9f432f0a9
1a4a5123d7b2c534cb3e3168f7032cf9ebf38b9a2a97226d0fdb7933cf6030ff
36b36ee9515e0a60629d2c722b006b33e543dce1c8c2611053e0651a0bfdb2e9
DGA Domains
ab6d54340c1a[.]com
aba9a949bc1d[.]com
ab2da3d400c20[.]com
ab3520430c23[.]com
ab1c403220c27[.]com
ab1abad1d0c2a[.]com
ab8cee60c2d[.]com
ab1145b758c30[.]com
ab890e964c34[.]com
ab3d685a0c37[.]com
ab70a139cc3a[.]com
IP アドレス
216[.]126[.]225[.]148
本稿は 2017年9月18日に Talos Group のブログに投稿された「CCleanup: A Vast Number of Machines at Risk」の抄訳です。