更新履歴(初版のみ・2026年09月16日公開)
- 初版公開
一般社員の佐藤さんは会社のアカウントでログオンできます。でも、管理者専用の共有フォルダーは開けません。本人だと分かったことと、管理者として扱ってよいことは別だからです。
MS14-068で崩れたのは、後者を判断するための情報の信頼性でした。
1. 概要
MS14-068は、一般のドメインユーザーが偽った権限情報をWindowsのKDCに受け入れさせ、ドメイン管理者権限へ昇格できる問題を修正したセキュリティ情報です。 脆弱性の番号はCVE-2014-6324。KDCは、ドメインコントローラー上でKerberosのチケットを発行する機能です。1
| 項目 | 内容 |
|---|---|
| CVE | CVE-2014-6324 |
| セキュリティ情報 | MS14-068、更新はKB3011780 |
| 公開日 | 2014年11月18日(米国の告知日) |
| 対象機能 | Windows Kerberos KDCのPAC署名検証 |
| 問題の性質 | 偽造された権限情報の受け入れ |
| 直接の影響 | 一般ドメインユーザーからの権限昇格 |
| 悪用実績 | 公開時点で限定的な標的型攻撃を確認 |
表は当時のMicrosoftの告知に基づきます。日本のJPCERT/CCの注意喚起は翌19日です。以下では佐藤さん、認証を担当するDC、ファイルサーバーを例に、所属情報が権限へ変わる流れを追います。23
2. 対象
当時の対象OSにはWindows Server 2003、2008、2008 R2、2012、2012 R2が含まれます。特に問題になるのはドメインコントローラー(DC)として動く機械です。各エディションとサービスパックは、MS14-068の対象製品表で確認できます。4
有効なドメイン資格情報を持ち、対象のKDCへ要求を送れることが攻撃の前提です。管理者の資格情報は要りませんが、匿名の外部利用者や、PCのローカルアカウントだけで攻撃できるわけではありません。5
flowchart TB
accTitle: 一般ユーザーからドメインの権限発行機能へ届く
accDescr: 一般のドメイン資格情報を持つ利用者がKDCへ要求を送り、その結果がドメイン内のサービス利用へ影響します。
U["一般ドメインユーザー"] -->|"チケットを要求"| K["DC上のKDC"]
K -->|"権限情報を含むチケット"| S["ドメイン内のサービス"]
図1: 入口は一般ユーザーでも、判断する相手はドメインの認証基盤です。6
当時確認された攻撃は2008 R2以前の経路を狙っていました。ただしMicrosoftは2012以降にも、悪用が難しい関連経路があると説明しています。「手元の検証コードが失敗したから2012は対象外」とは判断できません。一方、DCではないWindowsへの更新は多層防御のためで、この問題への直接の脆弱性とは区別されています。7
3. 詳細
チケットは、名前だけを運んでいるわけではない
佐藤さんがファイルサーバーへ接続する場合、まずKDCからTGTを受け取ります。TGTは、その後サービス用のチケットを求めるために使うチケットです。ファイルサーバーへ渡すのは、そのサーバー向けに発行されたサービスチケットになります。8
このチケットには、PAC(Privilege Attribute Certificate)という認可用のデータも入ります。そこには「誰か」だけでなく、「どのセキュリティグループに属するか」などが記録されます。プロキシ設定のPACファイルとは別物です。9
実際のPACでは、KERB_VALIDATION_INFOのUserIdやGroupIdsなどが、その情報を保持します。人間向けの表にすると、例えば次のような違いです。これは構造を説明するための要約で、実際のPACのバイト列ではありません。10
| 情報 | 正当な内容 | 攻撃者が主張したい内容 |
|---|---|---|
| 利用者 | 佐藤さん | 佐藤さん |
| 所属グループ | 一般の利用者グループ | 管理者グループも含む |
Windowsは、受け取ったPACの情報を利用者のログオントークンへ反映します。トークンはユーザーやグループのSID、特権などを持つ、アクセス判断のためのオブジェクトです。サーバーが「管理者グループに許可する」と設定していれば、トークンにどのグループが入ったかが、開けるかどうかを変えます。11
flowchart TB
accTitle: PACのグループ情報がアクセス判断へ使われる
accDescr: サービスチケットのPACからログオントークンへ利用者とグループの情報が反映され、サーバーのアクセス許可と照合されます。
P["チケット内のPAC"] --> T["利用者のログオントークン"]
T --> G["グループなどの情報"]
G --> A["対象のアクセス許可と照合"]
図2: チケットとトークンは同じものではありません。運ばれた情報がサーバー側の判断に使われます。1211
所属欄を勝手に変えられないよう、鍵で保証する
利用者が自分で「管理者」と書けるだけなら、この仕組みは成立しません。そこでPACには署名を付け、内容が正当に作られたものかを検証します。PACの仕様で使う署名は、公開鍵の証明書ではなく、秘密の共有鍵を使ったチェックサム、つまり鍵付きの検査値です。13
この区別が今回の核心です。普通のハッシュ値なら、元データを知る人は自分でも計算できます。所属欄を書き換えた後、新しいハッシュ値も計算し直せば、データと検査値のつじつまは合います。それだけでは、権限ある発行者が作った証拠になりません。
鍵付きのメッセージ認証コード(MAC)は、内容に加えて共有する秘密鍵を使います。正しい検査値を作るには、内容だけでなく鍵が必要です。利用者が持つ自分のログオン資格情報と、KDCがPACを保証するための鍵は、役割が違います。1413
flowchart TB
accTitle: 内容だけで計算できる値と秘密鍵が必要な値
accDescr: 普通のハッシュは内容だけで再計算できますが、MACの生成には内容に加えて秘密鍵が必要です。
D["内容"] --> H["ハッシュ値"]
M["内容と秘密鍵"] --> C["MAC"]
図3: 改ざん後の内容と検査値が一致していても、秘密を持つ発行者が作ったとは限りません。14
検証器が、鍵の要らない方式も受け入れた
MS14-068では、このPACの署名検証に欠陥がありました。KDCは、攻撃者の作ったPACを正しいものとして扱い、そこに記載された高い権限を受け入れてしまいます。6
どんな検査値が問題だったかは、Rapid7が公開している検証コードからも確かめられます。MS14-068用の実装はPACのチェックサム種別にRSA_MD5を指定しています。その型のchecksum実装は、引数の鍵を使わず、データから通常のMD5値を返します。名前にRSAとあっても、この処理でRSA署名を作っているわけではありません。1516
つまり、攻撃者が「自分は管理者グループの一員だ」というPACを作り、それに自分で計算した検査値を付けることができました。本来なら鍵を知らない相手には作れない保証を要求すべき場所で、鍵なしでも作れる値を受け入れたのです。MD5の衝突を見つけたり、管理者のパスワードを解読したりする話ではありません。151614
flowchart TB
accTitle: 自分で作った権限情報がKDCの検証を通ってしまう
accDescr: 攻撃者は偽のグループ情報と鍵なしで作れる検査値を用意でき、脆弱なKDCがそのPACを受け入れてしまいます。
F["偽のグループ情報"] --> C["攻撃者が検査値も計算"]
C --> V["脆弱なKDCのPAC検証"]
V --> A["正当な情報として受け入れる"]
図4: 問題は計算の不一致ではなく、その方式を権限の証明として認めたことです。616
暗号文を直すのではなく、KDCに受け入れさせる
ここで「TGTは暗号化されているのに、中の所属欄をどう変えるのか」という疑問が残ります。単に手持ちのTGTをテキスト編集する、という説明では不正確です。
公開された検証では、チケットの要求に偽のPACを含め、脆弱なKDCに処理させる経路を使います。Rapid7の実装説明も、TGS要求中のPAC検証を利用して、偽のPACを含むTGTを取得するものとしています。チケット全体の暗号化を破る代わりに、発行側が攻撃者の権限情報を信じてしまう点を利用します。17
その結果、佐藤さんは本人の資格情報を出発点にしながら、管理者グループを主張する情報で扱われ得ます。最初からADのグループ登録を変更する権限があったのではなく、PACを通じた権限の主張が通ってしまったのです。6
4. 影響
直接の結果は、一般ユーザーからドメイン管理者への権限昇格です。そこから、ドメインコントローラーを含むドメイン内のコンピューターの侵害へ進めます。単なる一台のアプリの権限判定ミスではありません。18
佐藤さんのPCで管理者パスワードを当てたわけでも、ファイルサーバーの暗号を破ったわけでもありません。サーバーが信頼している認証基盤に、偽の権限情報を承認させたため、被害が他の機械へ及びます。実際のアクセスは各資源の許可にも依存しますが、ドメイン管理権限まで得られることが問題の重大さです。1118
flowchart TB
accTitle: 一般ユーザーの侵害から認証基盤の侵害へ広がる
accDescr: 一般のドメイン資格情報からPACの偽造が受け入れられ、ドメイン管理権限を得ると、DCや他のドメイン資源へ被害が広がり得ます。
U["一般ドメイン資格情報"] --> P["偽のPACが受理される"]
P --> D["ドメイン管理権限"]
D --> R["DC・ドメイン資源の侵害"]
図5: 認証基盤の判断を共有する複数の機械が、同じ偽の情報を信用することになります。18
Microsoftは公開時点で限定的な標的型攻撃を把握していました。後に公開された検証コードだけから、当時すべての攻撃が同じ経路・同じ対象で行われたとは判断できません。2
5. 対策
すべてのDCで検証の欠陥を塞ぐ
2014年の修正はKB3011780です。Microsoftは、WindowsのKerberosで署名を検証する動作を修正したと説明しています。KDCが受け取ったPACを正しく検証することが対策の中心で、当時のセキュリティ情報に回避策は示されていません。19
更新の優先順位も、2008 R2以前のDC、2012以降のDC、その他のWindowsの順でした。よく使うDCだけ直して終わりにせず、認証を担うDCを把握して対応します。20
これは2014年の更新の解説です。現在の環境を点検する際に、古いKBの番号が一覧にあるかだけを合否判定にせず、対象OS・役割・修正を含む更新状態を管理情報で確認する必要があります。古い攻撃コードが動かないことも、修正済みの証明にはなりません。
検知の手がかりと、分からないこと
Microsoftの当時の案内では、更新前の既知攻撃に、ログのSecurity IDとAccount Nameの不一致という手がかりがありました。ただし、その検知を回避する方法もあると明記されています。21
更新後のWindows Server 2008 R2以降では、監査が有効ならイベント4769の失敗コード0xfが調査の手がかりになります。別のまれな原因でも記録され得るため、1件だけで攻撃を断定しません。記録がない場合も、監査設定や保存期間を確認せずに「攻撃はなかった」とは言えません。22
更新と侵害からの復旧は別の作業
既に管理権限を得た攻撃者は、別の侵入経路を残せます。パッチを適用しても、作られたアカウントや変更された設定まで元へ戻るわけではありません。Microsoftの2014年の説明も、ドメイン侵害後の高い確度での復旧には再構築が必要になるほどの問題だと警告しています。23
flowchart TB
accTitle: 脆弱性の修正と既に行われた変更の調査は別
accDescr: 更新でPAC検証の欠陥を修正する作業と、侵害時に残されたアカウントや設定を調査して復旧する作業を分けます。
P["修正更新を適用"] --> F["検証の欠陥を塞ぐ"]
I["既存の侵害を調査"] --> R["残された変更から復旧"]
図6: 更新済みという事実だけでは、侵害前の状態へ戻った証拠にはなりません。23
6. 教訓
この問題を「Kerberosの暗号が弱かった」とだけ覚えると、直すべき場所を取り違えます。鍵が必要な証明を要求する場面で、鍵なしでも作れる検査値を受け入れた。暗号ライブラリが計算できる方式と、その用途で許可してよい方式を分ける必要がありました。
自作の認可処理でも、入力の形式と検査値が合うだけでは足りません。誰がその値を作れるのか。その人に権限情報を決めさせてよいのか。 この二つを検証側で決める必要があります。一般社員として認証済みの相手にも、自分の所属を自由に宣言させてよいわけではありません。
本稿は公開資料と公開検証実装の読み取りによる解説です。未修正Windowsへの攻撃、チケットの生成・注入、実環境での再現は行っていません。佐藤さんとサーバーの構成は説明用です。
図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全6件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle
関連記事
参考リンク
-
CERT/CC, VU#213119. 2014年11月18日公開、19日改訂。参照箇所: Overview。認証された非特権ドメインユーザーからの権限昇格という全体像。 ↩
-
Microsoft, Security Bulletin MS14-068. 2014年11月18日、v1.0。参照箇所: 冒頭の公開日とKB番号、Executive Summary末尾の標的型攻撃の記述。 ↩ ↩2
-
JPCERT/CC, JPCERT-AT-2014-0048. 2014年11月19日。参照箇所: 文頭の日付、I. 概要。日本の告知日と問題の要約。 ↩
-
Microsoft, MS14-068の対象製品. 参照箇所: Affected Softwareの製品表と脚注[1]。クライアントOSの更新は多層防御であり、同じ意味で脆弱ではない点もここで確認する。 ↩
-
Microsoft, MS14-068の前提条件. 参照箇所: Executive Summaryの有効なドメイン資格情報と、ローカル資格情報だけの利用者を区別する記述。 ↩
-
CERT/CC, VU#213119の技術説明. 参照箇所: Description。チケット要求中のPAC署名検証が不十分で、偽った所属情報が受け入れられる点。 ↩ ↩2 ↩3 ↩4
-
Microsoft MSRC, Additional information about CVE-2014-6324. 2014年11月18日。参照箇所: Vulnerability Detailsの第2段落。2008 R2以前の既知経路、2012以降の関連経路、非DCへの多層防御更新の区別。 ↩
-
Microsoft MSRC, 同技術説明. 参照箇所: Vulnerability Details、TGTからサービスチケットへPACをコピーする段落。ここでは当時の基本経路を説明している。 ↩
-
Microsoft, MS-PAC §2.5 KERB_VALIDATION_INFO. 参照箇所: 冒頭の定義。DCが供給するユーザーログオン・認可情報を表す構造。現行公開仕様はデータ構造の説明に使い、2014年の未修正動作の証拠とはしていない。 ↩
-
Microsoft, MS-PAC §2.5の各フィールド. 参照箇所: UserId、GroupCount、GroupIds、LogonDomainId。表の氏名・グループ名は筆者による読みやすい要約で、実際の符号化形式ではない。 ↩
-
Microsoft Learn, Access Tokens. 参照箇所: Access token contentsのユーザーSID・グループSID・特権の一覧と、保護対象へのアクセスにトークンを使う説明。 ↩ ↩2 ↩3
-
Microsoft MSRC, PACからトークンへの反映. 参照箇所: Vulnerability Details、サービスの検証とログオントークン生成の段落。SueとDomain Adminsの例を、佐藤さんの構成へ置き換えて説明した。 ↩
-
Microsoft, MS-PAC §2.8.4 Server Signature および §2.8.5 KDC Signature. 参照箇所: 各節冒頭の鍵付きハッシュの計算と鍵の説明。前者は対象サービスと共有する鍵、後者はkrbtgtの鍵を使う。現行仕様の説明であり、後年追加された署名を2014年へ遡って適用してはいない。 ↩ ↩2
-
IETF, RFC 2104 §1–2. 参照箇所: §1の秘密の共有鍵によるMACの説明、§2のHMACの定義。普通のハッシュとMACの違いを説明するために参照し、古いアルゴリズム選択を現在の推奨として紹介してはいない。 ↩ ↩2 ↩3
-
Rapid7, MS14-068検証実装. 参照箇所: run内のchecksum_typeへのRSA_MD5の指定。公開実装の静的な読み取りであり、本稿では攻撃を実行していない。参照コミットを固定した。 ↩ ↩2
-
Rapid7, RsaMd5の実装. 参照箇所: checksumメソッドと、keyを使わないことを記したコメント。dataのみからMD5値を返すことを確認した。 ↩ ↩2 ↩3
-
Rapid7, MS14-068検証モジュールの説明. 参照箇所: Description。TGS要求のPAC検証を利用してTGTを取得すること、作者側でのWindows 2008検証の記述。作者の検証結果と、本稿の実行実績は区別する。 ↩
-
CERT/CC, VU#213119の影響. 参照箇所: Impact。DCを含むドメイン内コンピューターの侵害に至る権限昇格。本文の図は影響関係を筆者が整理したもの。 ↩ ↩2 ↩3
-
Microsoft, MS14-068の修正と回避策. 参照箇所: Executive Summaryの署名検証修正、Workaroundsの回避策なしという記述。KB3011780は当時の更新番号。 ↩
-
Microsoft MSRC, 更新の優先順位. 参照箇所: Update Priorityの3項目。特定のDCだけの修正で済ませない運用上の説明へ使用した。 ↩
-
Microsoft MSRC, 更新前の検知情報. 参照箇所: Detection Guidanceの前半。Security IDとAccount Nameの不一致、および既知攻撃だけを拾い回避可能であるという注意。 ↩
-
Microsoft MSRC, 更新後の検知情報. 参照箇所: 同節のイベント4769、対象OS、Failure Code 0xfに関する段落。別の原因でも記録され得る点を含む、2014年時点の案内。 ↩
-
Microsoft MSRC, 侵害後の復旧. 参照箇所: Remediation。更新後も攻撃者がアクセスを維持できる変更を残せることと、ドメイン再構築に関する当時の警告。 ↩ ↩2
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
Zerologonはなぜ認証を突破できたのか? ── Netlogonでゼロが正解になった理由
Zerologon(CVE-2020-1472)では、パスワードを知らない相手がコンピューターになりすませました。AES-CFB8の計算を1バイトずつ追い、ゼロが認証の正解になる理由と、ドメイン全体に被害が広がる仕組みを解説します。
PrintNightmareはなぜSYSTEM権限を奪えたのか? ── 印刷スプーラーとドライバー導入の境界
PrintNightmare(CVE-2021-34527)は、印刷スプーラーのドライバー導入機能からSYSTEM権限のコード実行に至る脆弱性でした。通常の印刷との違い、DLLが実行される過程、Point and Printとの関係、2021年の対策を解説します。
SMB署名とLDAPチャネルバインディング ── NTLM対策の「残り半分」を実務で締める
NTLMを止めるまでの間、リレー攻撃の被害を抑える防御がSMB署名とLDAP署名・チャネルバインディングです。OSごとの既定値、監査イベントの読み方、強制へ進める手順、業務アプリと機器の直し方までを実務目線で整理します。
図解でわかるNTLMとKerberos ── なぜ認証はNTLMに「落ちる」のか
NTLMとKerberosの違いを図解で整理します。チャレンジ/レスポンス、TGTとサービスチケット、SPNが引けないときにNegotiateがNTLMへ落ちる条件、リレー攻撃とPass-the-Hashが成立する理由、NTLMv1の削除までを公式ドキュメントの裏付けつきで...
NTLM廃止で業務アプリは止まるか ── 監査ログの取り方と、依存を潰す順番
NTLM廃止に向けて、自社のWindows環境と業務アプリがどこでNTLMに依存しているかを洗い出す手順をまとめます。監査ポリシー、NTLM/Operationalログのイベント8001〜8004の追い方、NTLMに落ちる典型パターンと直し方、SMBのNTLMブロックまでを...
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
よくある質問
この記事のテーマについて、相談時によくある質問をまとめています。
- MS14-068とCVE-2014-6324は何が違いますか?
- MS14-068は2014年11月18日に公開されたMicrosoftのセキュリティ情報の番号で、CVE-2014-6324はそこで扱われたKerberosの脆弱性の識別子です。更新プログラムはKB3011780として案内されました。
- 攻撃にはドメイン管理者のパスワードが必要でしたか?
- 必要ありませんでした。一般の有効なドメイン資格情報が前提で、管理者の秘密を破る代わりに、偽ったPACをKDCに受け入れさせます。匿名の外部利用者やローカルアカウントだけで成立する、という意味ではありません。
- PACには何が入っていますか?
- Kerberosチケットで運ばれる認可用のデータで、ユーザーや所属グループの識別情報などを含みます。Windowsはその情報をログオントークンへ反映し、アクセス判断に使います。プロキシ設定のPACファイルとは別物です。
- 暗号化されたチケットを書き換える攻撃ですか?
- 単に既存のTGTの暗号文を編集する説明では不正確です。公開された検証では、チケット要求に含めた偽のPACの検証を通す経路が使われました。PACの署名検証とチケット全体の暗号化は、別の保護です。
- 更新後にイベント4769の0xfがなければ安全ですか?
- その判断はできません。Microsoftの当時の案内には対象OS・更新・監査設定の条件があり、修正前の検知にも限界がありました。また0xfは別の理由でも記録され得ます。記録の有無だけで侵害を断定したり否定したりせず、更新状況と他の証拠を確認します。