- Cisco Talos は、Windows ポリシーの抜け穴を悪用する攻撃者を確認しました。その抜け穴とは、2015 年 7 月 29 日以前に発行された証明書でクロス署名されたカーネルモードドライバの読み込みは可能であるというものです。
- 攻撃者は、カーネルモードドライバの署名の日付を変更する複数のオープンソースツールを利用し、期限切れの証明書で署名された悪意のある未検証のドライバを読み込ませます。
- Talos は、10 個以上のコード署名証明書と、秘密鍵、パスワードを含む PFX ファイルが GitHub 上でホストされていることを確認しました。署名には、オープンソースのツールが使用されています。
- Talos が確認したドライバのうち、メタデータに言語コードが含まれていたドライバの大半で、言語コードとして簡体字中国語が設定されていました。このことから、中国語を母国語とする攻撃者が頻繁にこうしたツールを使用している状況がうかがえます。
- オープンソースツールの 1 つを使用して、クラック版のドライバに再署名してデジタル著作権管理(DRM)をバイパスしていた事例も確認されています。
- このブログと同時に、実際にこの抜け穴が悪用されている状況を示す 2 つ目のブログを公開しています。そちらのブログでは、これまで情報がなかった RedDriver という悪意のあるドライバを取り上げています。
Talos はこのブログ記事の調査段階で Microsoft 社に連絡し、確認した内容について報告しました。これを受けて Microsoft 社は、このブログで取り上げたすべての証明書をブロックし、アドバイザリを公開しました。脅威を軽減するために支援、協力していただいた Microsoft 社のチームに感謝いたします。
悪意のあるドライバがもたらす重大な脅威
Windows オペレーティングシステム(OS)は 2 つのレイヤ(モード)に分かれています。1 つは、ユーザーが操作するファイルとアプリケーションが動作するユーザーモードです。もう 1 つがカーネルモードで、カーネルモードドライバと Windows の基盤は、システムを稼働させるための機能をこのモードで実行します。ドライバの役割は、システムライブラリに含まれる一連の関数を Windows API を介して実行することで、両モード間で通信できるようにすることです。
オペレーティングシステムを 2 つのモードに分割することにより、一般ユーザーと Windows カーネルの間に高度に制御された論理的な境界が作成されます。カーネルへアクセスすることはシステムへの完全なアクセスを提供することになるため、OS の整合性とセキュリティを維持するうえで、この境界は非常に重要です。悪意のあるドライバを利用すれば攻撃者はこの境界を通過することができ、標的となったシステムが完全に侵害されることになります。
Windows カーネルのアーキテクチャ
悪意のあるドライバの脅威に対抗するため、Microsoft 社は Windows Vista 64 ビット版から、検証済みの認証局から発行された証明書でカーネルモードドライバにデジタル署名することを必須とするようになりました。署名が必須でなければ、悪意のあるドライバがマルウェア対策ソフトウェアやエンドポイント検出を簡単に回避できるため、防御は極めて困難になるでしょう。ドライバへの署名を必須にすることは、悪意のあるカーネルモードドライバからシステムを防御するうえで最も重要なポイントです。
悪意のあるドライバによって生じるもう 1 つの問題は、サンプルの分析が困難になることです。マルウェアの分析に使用される一般的なサンドボックスには、ドライバのすべての動作を監視する機能がないため、分析の多くは手動で行う必要があります。ドライバの分析をさらに困難にする目的で、攻撃者は VMProtect のようなツールを使ってドライバのコードを難読化するようになっています。
攻撃者からすれば、悪意のあるドライバを利用するメリットはいろいろあります。たとえば、エンドポイントの検出を回避できる、システムおよびユーザーモードのプロセスを操作できる、感染したシステムに潜み続けられる、といったことです。このようなメリットがあるからこそ、攻撃者は Windows ドライバの署名ポリシーをバイパスする方法を見つけようとするのです。
Cisco Talos は、Windows ポリシーの抜け穴を利用する攻撃者を確認しました。攻撃者はカーネルモードドライバの署名を偽造することで、Windows の証明書ポリシーをバイパスできます。この攻撃では、オープンソースのツールと、2015 年 7 月 29 日以前に失効した、あるいはそれまでに発行されていた、まだ取り消されていない証明書が使用されます。詳細については後述しています。
Windows ドライバのポリシーに抜け穴があり、署名タイムスタンプの偽造が発生
Microsoft 社は、Windows 10 バージョン 1607 からドライバ署名ポリシーを更新し、開発者ポータルへ提出して署名を受けていない新しいカーネルモードドライバは読み込まれないようにしました。このプロセスは、ドライバが Microsoft 社の要件とセキュリティ基準を満たしていることを保証するためのものです。ただし、古いドライバの機能と互換性を維持するために以下の場合は例外とされました。
- PC が Windows の以前のリリースから Windows 10 バージョン 1607 にアップグレードされた場合
- BIOS でセキュアブートがオフになっている場合
- ドライバが、エンドエンティティ証明書(2015 年 7 月 29 日以前に発行されたもので、サポートされているクロス署名 CA にチェーンされている証明書)で署名されている場合
このポリシーには、3 つ目の例外によって生じた抜け穴があります。新たにコンパイルしたドライバを、2015 年 7 月 29 日以前に発行された、またはこれ以前に失効していてまだ取り消されていない証明書(サポートされているクロス署名認証局にチェーンされている証明書)で署名すればよいのです。このやり方で署名に成功すると、ドライバがインストールされ、サービスとして開始されてしまいます。こうして、この抜け穴を悪用するために複数のオープンソースツールが開発されることになりました。この手法はすでに知られており、Windows システムに深刻な脅威をもたらすだけでなく、ツールが公開されているため比較的簡単に実行できるにもかかわらず、見過ごされがちです。
オープンソースのツールを使用して抜け穴を悪用する攻撃者
Talos は、複数の攻撃者が前述の Windows ポリシーの抜け穴を利用していることを確認しました。悪意のある何千もの署名付きドライバが Microsoft に提出され検証を受けることなく展開されています。悪意のあるドライバを展開するために、攻撃者が HookSignTool と FuckCertVerifyTimeValidity を使用したことも今回の調査で突き止めました。いずれも署名のタイムスタンプ偽造ツールであり、それぞれ 2019 年と 2018 年に一般公開されています。両ツールは、もともとゲームのチート開発コミュニティで人気があったものですが、ゲームのチートとは無関係の、悪意のある Windows ドライバへの署名にこれらのツールが使用されたことが確認されています。ドライバベースのブラウザハイジャッカー RedDriver について明らかにした Talos のブログでは、HookSignTool が悪意のあるコンテキストで使用された実例を取り上げています。
HookSignTool
HookSignTool はドライバの署名を偽造するツールです。Windows API へのフックと、正規のコード署名ツールのインポートテーブルへの手動変更を組み合わせることで、署名プロセス中にドライバの署名の日付を変更します。もともとは、2019 年に作者の「JemmyLoveJenny」によって中国のソフトウェア クラッキング フォーラム「52pojie[.]cn」で公開されましたが、遅くとも 2020 年からは GitHub で一般に利用できるようになっています。
52pojie で最初に公開された HookSignTool
GitHub にある HookSignTool の readme ファイルの中で、作者は HookSignTool と組み合わせて使用するツールとして、中国のコード署名ユーティリティ「Digital Signature Tool for Asian Integrity」(用于亚洲诚信数字签名工具)を具体的に挙げています。ただし理論的には、HookSignTool はどんなコード署名ユーティリティとも組み合わせることができます。Microsoft Detours を使用すれば、汎用的な互換性が得られます。これは、Windows API コールをインストルメントして監視するためのソフトウェアパッケージです。
HookSignTool を使用するには、いくつか手順を踏んでツールが機能するようにしておく必要があります。まず HookSignTool をコンパイルして、「HookSigntool.dll!attach」として正規の署名ツールのインポートテーブルに手動で追加する必要があります。偽造する日付を指定するには、コマンドライン引数として日付を渡すか、コード署名ツールと同じディレクトリに設定ファイルを作成します。これで、正規のコード署名ツールの実行時に HookSignTool がプロセスにロードされ、対象のドライバの署名処理に割り込んで日付を変更できるようになります。
HookSignTool を使用するにあたっては、もう 1 つ必要な編集があります。正規のコード署名ツールに埋め込まれているタイムスタンプの認証局の URL 文字列を 16 進数の文字列「{CustomTimestampMarker-SHA1}」に置き換え、さらに各文字の間に 0x00 を付加する必要があるのです。URL が「http[:]//timestamp.digicert.com」であれば、次の 16 進数に置き換えることになります。
7b 00 43 00 75 00 73 00 74 00 6f 00 6d 00 54 00 69 00 6d 00 65 00 73 00 74 00 61 00 6d 00 70 00 4d 00 61 00 72 00 6b 00 65 00 72 00 2d 00 53 00 48 00 41 00 31 00 7d 00 00 00 00 00
HookSignTool は署名処理中にこのタグを検索し、「https://pki[.]jemmylovejenny[.]tk/」に置き換えます。また、ドライバに署名するシステム上に、EV ルート CA 証明書である JemmyLoveJenny をインストールしておく必要もあります。この証明書は、以下に示すように作者の個人 Web サイトで入手できます。
必要な証明書が提供されている JemmyLoveJenny の個人 Web サイト
HookSignTool は 2 つのパラメータ(アタッチする Windows API 関数へのポインタと、detour(迂回)関数へのポインタ)を使用して Detours 関数「DetourAttach」を呼び出します。HookSignTool の実装を以下に示します。
HookSignTool での Detours の実装
HookSignTool と FuckCertVerifyTimeValidity がアタッチする最も重要な Windows API 関数の 1 つは、後者の名前からも明らかなように CertVerifyTimeValidity です。この関数は、所定のファイルの署名日が有効かどうかを検証します。
CertVerifyTimeValidity のプロトタイプ
HookSignTool は CertVerifyTimeValidity 関数にアタッチすることによって、NewCertVerifyTimeValidity という CertVerifyTimeValidity のカスタム実装への「迂回」を実行します。これによって HookSignTool が「pTimeToVerify」パラメータにカスタムの日付を渡すことが可能になり、無効な日付でも有効だと検証されるようになります。
実行中に署名タイムスタンプを変更するために、HookSignTool はもう一度 DetourAttach 関数を使用して Windows API 関数 GetLocalTime にアタッチし、NewGetLocalTime という別の関数に迂回します。この迂回では、ユーザーが指定する日付(使用される証明書の有効期間内の日付)でローカルの日付を置き換えます。GetLocalTime と CertVerifyTimeValidity の両方が迂回されると、HookSignTool が対象のバイナリに無効なタイムスタンプを提供し、有効なタイムスタンプだと検証できるようになります。
デフォルトでは、偽造された署名に HookSignTool のアーティファクトが残るため、所定のドライバで HookSignTool が使用されたことをユーザーが特定できます。そうしたアーティファクトの 1 つが「JemmyLoveJenny」で、これは HookSignTool の作者を表しています。残されるアーティファクトには「Fake Timestamp Responder」というものもあります。本物のタイムスタンプの認証局名を置き換えていることが推測されるので、この名前はかなり目立ちます。ただし攻撃者にスキルがあれば、これらのアーティファクトの名前を手動で変更できるため、HookSignTool が使用されていることを特定するのは難しくなります。
FuckCertVerifyTimeValidity
2018 年 12 月 13 日に初めて GitHub で公開された FuckCertVerifyTimeValidity(別名 FuckCertVerify)は、署名タイムスタンプを偽造するという結果は同じであるものの、HookSignTool ほどの機能はありません。このツールは、ゲームのチートソフトウェアに署名するために開発された可能性が高く、公開以来、GitHub のさまざまなリポジトリにコピーされ、アップロードされています。
Microsoft Detours パッケージを使用して「CertVerifyTimeValidity」API コールにアタッチする点、また、タイムスタンプを選択した日付に設定するという点で、FuckCertVerifyTimeValidity は HookSignTool と同じような方法で機能します。HookSignTool と同様に、正規の署名ツールのインポートテーブルに関数を追加する必要がありますが、この場合の関数は「FuckCertVerifyTimeValidity.dll!test」です。HookSignTool とは違い、FuckCertVerifyTimeValidity が署名したバイナリにはアーティファクトが残らないため、このツールが使用されたことを特定するのは非常に困難です。
Windows API にアタッチする FuckCertVerifyTimeValidity
偽造ツールで頻繁に使用される、盗まれた証明書と期限切れの証明書
HookSignTool と FuckCertVerifyTimeValidity を使用して署名を偽造するには、2015 年 7 月 29 日以前に失効した、あるいはそれまでに発行されていた、まだ取り消されていないコード署名証明書と、秘密鍵、パスワードが必要になります。FuckCertVerifyTimeValidity のフォークの 1 つを調査していたところ、Talos は GitHub でホストされている PFX ファイルに、期限切れのコード署名証明書が 10 個以上含まれていることを確認しました。それらの証明書は、署名を偽造するために両方のツールで頻繁に使用されていました。期限切れの証明書の多くは取り消されておらず、悪意のあるドライバだけでなく、ゲームのチートソフトウェアの署名を偽造する場合にも広く使用されています。Talos が発見した PFX ファイルには、2015 年に発生した Hacking Team のデータ流出事件で盗まれた証明書と、中国のソフトウェア クラッキング フォーラムに流出した証明書が含まれています。しかしこれらの証明書が、データ流出の前にどのようにして入手されたのかは明らかになっていません。以下は、これらの証明書に含まれている所有者名の全リストです。
Hacking Team の証明書:
- Open Source Developer, William Zoltan
- Luca Marcone
- HT Srl
その他の証明書:
- Beijing JoinHope Image Technology Ltd.
- Shenzhen Luyoudashi Technology Co., Ltd.
- Jiangsu innovation safety assessment Co., Ltd.
- Baoji zhihengtaiye co.,ltd
- Zhuhai liancheng Technology Co., Ltd.
- Fuqing Yuntan Network Tech Co.,Ltd.
- Beijing Chunbai Technology Development Co., Ltd
- 绍兴易游网络科技有限公司
- 善君 韦
- NHN USA Inc.
ここに挙げている名前は証明書から直接取得したものであるため、大文字小文字の表記は統一されていません。検出の目的で使用する場合、これらの不一致は修正せず、記載している名前をそのまま使用してください。
「Digital Signature Tool for Asian Integrity」にインポートされた PFX ファイル
前述の PFX ファイルには含まれていなかったものの、他にも署名の偽造に使用されていた証明書を確認しています。
- 北京汇聚四海商贸有限公司(Beijing Shihai Trading Co Ltd)
偽造ツールを主に使用しているのは中国語を話すユーザー
HookSignTool は 2019 年に一般公開されましたが、主に中国語を母国語とするユーザーの間で人気を博し、利用されているようです。それ以外のユーザーにあまり人気が広がらなかったのは、おそらく言葉の壁が一因ではないかと思われます。HookSignTool と FuckCertVerifyTimeValidity の作者は、GitHub のそれぞれのリポジトリで使用されている言語から、中国語を母国語とする人物だと考えられます。HookSignTool のアーティファクトが含まれているランダムサンプルを 300 件調査した結果、メタデータに「Chinese (Simplified)」の言語コードが含まれていたのは 30%、「English (US)」が含まれていたのは 10%、「English (British)」が含まれていたのは 1% で、51% には言語コードが含まれていませんでした。言語コードが含まれていたサンプルのうち、「Chinese (Simplified)」がサンプルセットの 71% を占めています。
再署名したクラック版ドライバを使用した DRM のバイパス
こうしたツールが存在することで生じる問題は、悪意のあるドライバの署名だけではありません。今回の調査で、デジタル著作権管理(DRM)をバイパスするためにパッチを適用した後、HookSignTool を使用してドライバに再署名していることが確認されました。具体的に言うと、中国のソフトウェア クラッキング フォーラム「bbs[.]wuyou[.]net」で、「Juno_Jr.」というユーザーが 2022 年 11 月 9 日に「PrimoCache」のクラック版を公開しています。
公開されたクラック版 PrimoCache(中国語からの翻訳)
クラック版の作成にあたっては、PrimoCache ドライバにパッチを適用してから再署名し、Windows の整合性チェックをパスする必要がありました。前述のフォーラムに公開されたクラック版では、もともと「Shenzhen Luyoudashi Technology Co., Ltd.」に対して発行された証明書(GitHub の PFX ファイルに含まれていた証明書)で、パッチ適用後のドライバが再署名されていました。
正規の PrimoCache ドライバの署名
再署名された PrimoCache ドライバの署名
上記のデジタル署名の詳細で警告が表示されているにもかかわらず、クラック版の PrimoCache のドライバは、Windows 10 にインストールすると正常に機能します。このようにクラック版のドライバを再署名できるため、署名付きドライバの DRM チェックをバイパスしようとする際の大きな障害がなくなります。一般的には、署名付きドライバが改ざんされている場合、Windows オペレーティングシステムの整合性チェックによって改ざんが検出されるため、そのドライバは実行されません。
影響、リスク、防御
悪意のあるドライバをインストールすると、攻撃者がカーネルレベルでシステムにアクセスできるようになるため、HookSignTool と FuckCertVerifyTimeValidity は深刻な脅威となります。両ツールは、クラック版のドライバに再署名して DRM をバイパスするために使用される可能性もあり、ソフトウェアの違法コピーによって組織の売上損失につながるリスクもあります。そうしたリスクとは別に、ドライバのコードが適切に記述されていない場合、たとえ悪意がないドライバであっても、未検証のドライバを実行することでシステムに損害を与える可能性があります。
Cisco Talos では、このブログ記事で取り上げた証明書をブロックすることを推奨しています。というのも、悪意のあるドライバを推測に基づいて検出することは困難であり、ファイルハッシュまたはドライバの署名に使用された証明書に基づいてブロックすることが最も効果的だからです。署名のタイムスタンプをドライバのコンパイル日付と比較することは、タイムスタンプの偽造を検出する効果的な手段となる場合があります。ただし、署名のタイムスタンプと一致させるために、コンパイルの日付が変更されることがあるので注意が必要です。
Microsoft 社は Talos の通知を受けて、このブログ記事で取り上げたすべての証明書をブロックしました。対応の詳細については、同社が発表したアドバイザリを参照してください。
Microsoft 社はドライバブロックリストを Windows に導入して管理していますが、ブロックする対象は悪意のあるドライバではなく、脆弱性のあるドライバです。そのため、ルートキットや悪意のあるドライバをブロックするには、このブロックリストだけに頼るべきではありません。
Cisco Talos は、このブログで取り上げた証明書のカバレッジを作成しました。引き続きこの脅威の活動状況を監視し、今後の保護対策に役立てていきます。また、この脅威について新たな発見があった場合は、Microsoft 社に報告する予定です。
カバレッジ
Cisco Secure Endpoint(旧 AMP for Endpoints)は、この記事で説明したマルウェアの実行を阻止するのに最適です。Cisco Secure Endpoint の無料トライアルはこちらからお申し込みください。
Threat Defense Virtual、適応型セキュリティアプライアンス、Meraki MX など、Cisco Secure Firewall(旧次世代ファイアウォールおよび Firepower NGFW)アプライアンスは、この脅威に関連する悪意のあるアクティビティを検出できます。
Cisco Secure Malware Analytics(Threat Grid)は悪意のあるバイナリを特定し、Cisco Secure のすべての製品に保護機能を組み込みます。
オープンソースの Snort サブスクライバルールセットをお使いであれば、Snort.org で購入可能な最新のルールパックをダウンロードすることで、最新状態を維持できます。この脅威を検出する Snort SID は、Snort 2 では 61805 ~ 61831、Snort 3 では 300555 ~ 300568 です。
ClamAV で、次の脅威を検出できます。
- Revoked.CRT.HookSignTool-9999982-1
- Revoked.CRT.HookSignTool-9999983-1
- Revoked.CRT.HookSignTool-9999979-1
- Revoked.CRT.HookSignTool-10000379-0
- Revoked.CRT.HookSignTool-10000385-0
- Revoked.CRT.HookSignTool-10000392-0
- Revoked.CRT.HookSignTool-10000396-0
- Revoked.CRT.HookSignTool-10000400-0
- Revoked.CRT.HookSignTool-10000420-0
- Revoked.CRT.HookSignTool-10000424-0
- Revoked.CRT.HookSignTool-10000428-0
本稿は 2023 年 07 月 11 日に Talos Group のブログに投稿された「Old certificate, new signature: Open-source tools forge signature timestamps on Windows drivers」の抄訳です。