キーホール(Keyhole)– 独自の Windows Store ライセンス生成
(massgrave.dev)- Keyhole は、CLiP のライセンス検証フローを回避して Microsoft Store アプリ と最新の Windows エディション向けライセンスを作成できてしまう DRM 回避バグだった
- CLiP は、署名付き XML ライセンスを
clipsvc.dllで検証した後、SPLicenseBlockをclipsp.sysに渡してカーネルで再確認する 信頼チェーン を使用している clipup.exeには XML ライセンス署名用の ECDSA キー が難読化なしで含まれており、任意に署名した XML ライセンスを ClipSvc が受け入れてしまっていた- 実際の脆弱性は、ライセンスブロックの 署名ブロック後方のデータ が検証されないにもかかわらず、同じ型の先行ブロックを上書きできる点にあり、device-locked Windows ライセンスには device-locked アプリライセンスが必要だった
- Cisco TALOS は同じバグを 2024 年 4 月 8 日に Microsoft へ報告しており、修正後はパーサーが 署名ブロックに遭遇した時点で直ちに終了 し、後続ブロックを処理しない
Keyhole の性質と公開の背景
- Keyhole は Windows ライセンス検査の回避作業中に発見されたバグで、Microsoft Store アプリ または最新の Windows エディションにライセンスを付与できてしまう DRM 回避手法だった
- 一部のバグは将来のアクティベーション手法やテストツールとして残すため非公開にされていたが、CVE-2024-38184 が Cisco TALOS を通じて公開されたことで、Keyhole の内容も公開された
- このバグは、Microsoft に報告された時期とほぼ同じ頃に独立して発見されていた
CLiP のライセンス処理構造
- CLiP(Client Licensing Platform)は Windows 10 で導入されたシステムで、主に Microsoft Store アプリ DRM を実装し、Windows のアクティベーションとも統合されている
- Windows 内の主要コンポーネントは以下の通り
clipup.exe: Windows 8 Store ライセンス、正規チケット、プロダクトキーをデジタルライセンスへ移行するclipsvc.dll: アプリライセンスを管理するユーザーモードサービスclipc.dll: アプリケーションが CLiP と相互作用するための APIclipwinrt.dll: Windows Runtime を使う UWP アプリケーション向け APIclipsp.sys: ライセンスを検証するカーネルモードドライバー
- CLiP ライセンスアプリがインストールされると、署名付き XML ライセンスが
clipsvc.dllに渡され、XML 署名の検証後にデータが%PROGRAMDATA%\Microsoft\Windows\ClipSVC\tokens.datに保存される - その後、
SPLicenseBlockタグから署名済みライセンスブロックが抽出されてclipsp.sysに渡され、検証を経て CLiP ライセンスストアHKLM\SYSTEM\CurrentControlSet\Control\{7746D80F-97E0-4E26-9543-26B41FC22F79}に保存される - このストアは既定では見えないよう保護されているが、権限を変更すればアクセスできる
clipup.exe に残っていた署名キー
clipup.exeには、XML ライセンス署名に使用できる有効な ECDSA キー が難読化されずに保存されていた- このキーは本来、Microsoft Store に一時ライセンスを送ってデジタルライセンスを受け取るために使われるが、ClipSvc はアプリライセンスでも同じキーを受け入れていた
- その結果、任意の XML ライセンスに署名または再署名でき、ClipSvc のユーザーモード検査を回避して、任意のライセンスブロックを
clipsp.sysに直接渡せてしまった - この段階でユーザーモードレベルの 信頼チェーン は無力化され、残る争点は ClipSp を欺けるかどうかだった
ClipSp の解析と Warbird 難読化解除
- ClipSp の多くのコードは、Microsoft 独自の難読化ツール Warbird によって隠されていた
- ClipSp は難読化コード呼び出しを復号関数と暗号化関数で囲んでおり、その動作はユーザーモードプログラムでの Warbird の挙動に似ている
- Microsoft サーバー上にあった
clipsp.sysのシンボルが解析に役立ち、KiFilterFiberContext の手法 をもとに復号関数を手動実行することで、隠されたコードを確認できた - Warbird のユーザーモードでの動作は warbird-docs を参照できる
ライセンスブロック形式と Keyhole バグ
- CLiP で重要なライセンス情報は ライセンスブロック に入っており、その形式は CikExtractor に文書化されている
- ライセンスブロックは TLV(tag-length-value)形式を使用する
- 各サブブロックはデータ型、データ長、実データを持つ
- 例えば型
0xC9は License Information、長さ0xAは 10 バイトのデータを意味する
- ライセンスブロックの末尾には常に型
0xCCの 署名ブロック があり、このブロックには前方のすべてのデータに対する署名と、署名に使用されたキー情報が含まれる - 実験の結果、署名ブロックの後ろに付加されたデータは検証されず、同じ型のブロックが複数ある場合は最後のブロックが先行ブロックを上書きしていた
- そのため、署名ブロックの後ろに新しいライセンスデータを付加すれば既存のライセンス情報を変更でき、この手法が Keyhole と命名された
可能な範囲と制約
- この手法により、Microsoft Store で販売されている項目のライセンスを、別の Microsoft Store ライセンスから作成できてしまった
- 無料アプリにも多くのライセンスがあるため、目的の項目向けライセンスを多数生成できる状態だった
- ただし、device-locked ライセンスは device-unlocked ライセンスからは生成できなかった
- Windows デジタルライセンスは device-locked であるため、Windows ライセンスを作るには Roblox のような device-locked アプリライセンスが必要だった
- これにより、Enterprise LTSC をデジタルライセンスでアクティベートしたり、generic key で正規 KMS サーバーを有効化したりするなど、以前は不可能だった作業も可能になった
公開された再現フローと修正方式
- Windows ライセンスを作成する流れは、device-locked アプリのインストール、
https://licensing.mp.microsoft.com/v7.0/licenses/contentから来るライセンスの傍受、ライセンスのデコードとブロック抽出、新規データの追加、XML のパッケージ化と署名、C:\ProgramData\Microsoft\Windows\ClipSVC\Install\Migrationへのコピー、ClipSvc の再起動またはclipup -pの実行へと続く - Cisco TALOS の TALOS-2024-1964 は、同じバグを Microsoft に 2024 年 4 月 8 日に報告していた
- このバグは単なる DRM 問題に見えるかもしれないが、Keyhole が ClipSp のより深刻なバグ へ到達する入口になり得るため、TALOS の公開範囲に含まれた
- 修正後のライセンスブロックパーサーは、署名ブロックに遭遇した時点で直ちに終了 して署名後のブロックを処理せず、この変更によって Keyhole は防がれた
公開資料と Xbox One との関係
- Keyhole 公開後、Keyhole ライセンス生成コード と、解析を助けるシンボル入りの CLiP バイナリ集 が公開された
- ClipSp のコードのかなりの部分は Xbox One DRM システムからコピーされたものとみられる
- Xbox One には最新 PC の TPM に基づく SP、すなわち secure processor チップがあり、主な役割はコード署名の強制とライセンス検証である
- CLiP の XML ライセンス形式と TLV ベースのライセンスブロックの大半は、Xbox One DRM システムから持ち込まれた形式である
- Xbox SP にも ClipSp と同様のパースバグはあるが、データブロックと署名関連ブロックを別々にパースするため、Keyhole は Xbox では動作しない
1件のコメント
Hacker News のコメント
つまり、あとは細部を解明すれば Microsoft Store から Xbox ゲームを無料で直接ダウンロードできるということ?
要するに Xbox は現時点で PS Vita 並みに完全にハックされた状態ということなのか?
ただし、Xbox で自動更新を有効にしている人には残念ながら当てはまらない。最新のシステムソフトウェアには、collateral-damage エクスプロイトが対応しているものより高いカーネルバージョンが含まれているようだ
Windows Store に 2020 年まであった Lego Boost for Windows 10 アプリをインストールできるライセンスも取得できるといいのだが
私の理解では、ライセンスがあればまだダウンロードできるが、新規ユーザーにはもう提供されていない
正しく読めているなら、Microsoft は 一時ライセンス署名キーの適用範囲を狭められるはずなので、永続ライセンスを生成できる期間は長くない可能性が高い
これで Microsoft アカウントなしに HEVC 拡張機能を有効化できるのだろうか? 特許を包括ライセンスで処理できないのが本当に苛立たしい
0: https://massgrave.dev/unsupported_products_activation#hevc-v...
ms-windows-store://pdp?productId=9N4WGH0Z6VHQ
ms-windows-store://pdp?productId=9PMMSR1CGPWG
ms-windows-store://pdp?productid=9MVZQVXJBQ9V
ms-windows-store://pdp?productid=9N4D0MSMP0PT
ms-windows-store://pdp?productid=9N95Q1ZZPMH4
こういう類のものは、何十年もの間 Windows の配布とコミュニケーションチャネルとしては最も効果的だった
皮肉なことに、実際には物理ディスクを持っている Guitar Hero のゲームを正規ハードウェアでプレイするために真剣に使うことになりそうだ。ゲームはインストール済みだが、壊れた DVD ドライブにディスクが入っていないとプレイする「ライセンス」がない状態になる
さらに皮肉なのは、これが動作したとしても、コンソールの公開鍵が失効リストに載っていて自分のゲームセーブファイルを読めないかもしれない点だ。CON ファイルをデフォルト値 0 で再署名すれば回避はできる
3 つ目の皮肉もそのうち出てくるかもしれない。これらすべてが本当に見覚えのあるものに見える。実に素晴らしい
このバグは本質的に、サニタイズされていない入力とコンテキスト脱出が偶然結びつく日のための 遡及的なピボットプラットフォームに近い
表面的には単なるデジタルステッカーの差し替えに見えるが、Microsoft が成功を過度にレバレッジし、後方互換性と自社の技術的負債のために破壊的変更を拒み続けてきたせいで、ある種のミスは些細でも影響が大きく永続化する
ウイルス対策ソフトがページをブロックしているなら、こちらで見ればよい: https://archive.is/90XGW
Clip は Xbox One よりも前からあったのでは?
記事を読んで、特にこのエンジンが Xbox DRM エンジンからコピペされたという部分を見ると、Pluton も Xbox からコピーしてきたものなのに、まだエンドユーザーのセキュリティのためだと信じている人はいるのだろうか? 結局、Microsoft が PC 上で強制可能な DRM を持つためではないのか?
ちなみに Pluton は最新の Intel ノート PC 向けチップにも入っており、AMD にはしばらく前から入っていた。Windows がこれを必須にするまで、どれくらいかかるだろうか?
私は Microsoft 管理者なので、会社の人たちは Win11 や Intune のような最大限ロックダウンする構成を好む。私にとって Windows の本質はそういうものではなく、優れた管理ツールと後方互換性だ
Pluton もまた別の TPM になるだろう。導入して 5 年待ってから義務化する。Microsoft には時間がある
それでも、Windows がプリインストールされて販売された PC にいまだに Linux をインストールできるし、Store 以外から入手したサードパーティーソフトウェアも Windows にインストールできるし、Torrent でダウンロードした海賊版映画も見られる
デスクトップの壁紙を変更できないことを受け入れられるなら、登録も支払いもしていない Windows も実行できる
Microsoft が潜在的に利益を得られるか? もちろんだ。だが、それが本物のユーザーセキュリティ上の動機や、エンドユーザーに返ってくる利点を否定するわけではない
「署名ブロックの後ろにあるデータはまったく検査されず、場合によっては前に出てきたデータを上書きすることさえできる。同じ種類のブロックが一緒に保存されている場合、最後のブロックがそれ以前のすべてのブロックを上書きする。だからライセンスデータを変更したいなら、そのブロックを作って署名ブロックの後ろに置くだけでよい」
本当に驚きだ