
2024年8月13日、MSTC(マイクロソフト・セキュリティ・レスポンス・センター)は、Windows TCP/IPスタックに存在する重大な脆弱性CVE-2024-38063を公表した。この脆弱性を悪用することで、オペレーティング・システム内の重要なネットワーク機能が危険にさらされる可能性がある。ここでは、OPSWAT Graduate Fellowship Programの参加者が、この欠陥の技術的詳細と潜在的影響、およびこの脆弱性に対する推奨される緩和策について徹底的な検証を行います。
OPSWAT フェローシップ・プログラム参加者ファム・ゴック・ティエン - ホーチミン情報技術大学
概要
CVE-2024-38063 は、Windows TCP/IP スタックに存在するCVSS スコア 9.8 の重要な脆弱性で、IPv6 パケットの処理に影響を及ぼします。リモートの攻撃者は、IPv6 拡張ヘッダーの処理時に整数アンダーフローを使用してこの脆弱性を悪用し、悪意のあるコードを実行したり DoS (サービス拒否) を引き起こす可能性があります。
IPv6はほとんどの最新システムでデフォルトで有効になっているため、このゼロクリックの欠陥はかなりのリスクをもたらす。その結果、IPv6が有効になっているWindows 10、Windows 11、およびWindowsServer 2008、2012、2016、2019、2022の未パッチのバージョンはすべて、このCVEに対して脆弱である。
キーコンセプト
ウィンドウズTCP/IPスタック
Windows TCP/IPスタックは、TCP/IP(Transmission Control Protocol/Internet Protocol)スイートを介したネットワーク通信を担う、基本的なオペレーティングシステムコンポーネントである。TCP/IPスタックは、ローカルおよびグローバルネットワーク上のデバイス間の通信を容易にし、すべてのネットワーク相互作用を処理します。
IPv6と拡張ヘッダー
IPv6はIPv4の限界に対処するために開発された。IPv6は、拡張ヘッダーによるモジュール性や柔軟性など、さまざまな機能強化を導入した。IPv6ヘッダーとペイロードの間に位置するヘッダーは、オプションのデータや高度な機能をサポートする。
主なIPv6拡張ヘッダーは以下の通り:
- ホップ・バイ・ホップ・オプション(ネクスト・ヘッダー = 0)
- ルーティングヘッダ(ネクストヘッダ=43)
- フラグメントヘッダー(ネクストヘッダー=44)
- デスティネーション・オプション・ヘッダー(ネクスト・ヘッダー=60)
- 認証ヘッダー(AH)(ネクストヘッダー=51)
- カプセル化セキュリティ・ペイロード(ESP)(ネクストヘッダ = 50)
各拡張ヘッダーはNext Headerフィールドを介して次の拡張ヘッダーを指し示し、シーケンシャルな連鎖を作る。このモジュール性によって、パケット処理プロセスが複雑になり、潜在的な悪用ベクトルが発生する。
整数アンダーフロー
整数のアンダーフローは、計算によってデータ型の表現可能な最小値よりも小さな値が生成される場合に発生します。例えば、符号なし整数に対して小さい値から大きい値を引くと、結果が非常に大きな正の値になることがあります。
整数オーバーフローは、値がデータ型の最大制限を超え、表現可能な最小値(例えば、0~10の範囲では0)まで「オーバーフロー」した場合に発生する。どちらのシナリオも、算術演算における境界条件の不適切な処理が原因で発生し、ソフトウェア・システムに深刻な脆弱性をもたらす。
脆弱性分析
IPv6処理のワークフロー
IPv6パケットを受信すると、WindowsはまずIPv6ヘッダーを解析する。次に、IppReceiveHeaderBatch関数がNext Headerフィールドの値をチェックし、後続のヘッダーに適切なハンドラーを選択する。チェーン内の各拡張ヘッダーに対して、IppReceiveHeaderBatchは対応するルーチンを呼び出して、その特定のヘッダーを処理します。
このメカニズムは柔軟でモジュール化された設計であるにもかかわらず、潜在的な攻撃ベクトルをもたらす。IPv6では、フラグメント化されたパケットは通常宛先で再アセンブルされるが、そこにはフラグメントの再アセンブルプロセスとヘッダー処理における脆弱性が存在する。
攻撃者は、拡張ヘッダを操作した不正なパケットを多数送信することで、メモリの誤操作を誘発し、バッファオーバーフローを引き起こすことができる。これにより、過剰なデータが意図しないメモリ領域を上書きし、任意のコードを実行される可能性があります。この脆弱性は CVE-2024-38063 として特定されています。
Windows TCP/IPスタックに重大な欠陥
CVE-2024-38063の脆弱性に対処するためのマイクロソフト社のパッチが、セキュリティ研究者のマーカス・ハッチンス氏によって徹底的に検証された。彼のテクニカル・ブログは、この脆弱性の根本的な原因に関する詳細な洞察を提供している。彼の発見を基に、私たちの仲間はこの問題をさらに調査し、エクスプロイトを徹底的に理解しました。
パッチ分析
このパッチには、Ipv6pProcessOptions 関数内の修正を含む、tcpip.sys ファイルの更新が含まれていた。1行の変更により、IppSendErrorList() の呼び出しが IppSendError() の呼び出しに置き換えられており、IppSendErrorList() が CVE に関与している可能性があることを示しています。
パケットサイズ0
IppSendErrorList()関数を詳しく調べると、IppSendError()関数をそれぞれ呼び出すことで、パケットのリンクリストを処理していることがわかった。IppSendError()関数は、欠陥のあるパケットにSTATUS_DATA_NOT_ACCEPTEDステータスを割り当てる。そして、問題のあるパケットに関する情報を含むICMPエラーメッセージを作成し、それを送り返す。しかし、複数のパケットに対して always_send_icmp = true で IppSendErrorList() を呼び出すと、各パケットの packet_size フィールドがゼロに設定される。
Ipv6pProcessOptions 関数は、Hop-by-Hop Options ヘッダーと Destination Options ヘッダーの両方を含む、オプション値フィールドを含む拡張ヘッダーを処理するように設計されている。Option Type を 0x80 より大きい値に設定することで、攻撃者はオプションヘッダ処理で特定のエラーを引き起こすことができる。
ゼロサイズのパケットは通常破棄されますが、攻撃者は元のIPv6パケットのNext Headerフィールドを操作することができます。この操作により、攻撃者はその後の処理段階でパケットの解釈方法を制御できるようになり、即時の拒否を回避して悪用の機会を作り出すことができる。
フラグメント処理における整数アンダーフロー
フラグメントヘッダーを示すNext Headerフィールドを44に設定することで、パケットはIPv6のフラグメンテーションまたは再組み立てルーチンによって処理される。パケットがフラグメント・パーサーであるIpv6pReceiveFragment()に到達すると、次のように指定される:
- パケットサイズはゼロ。
- フラグメントヘッダーは、処理すべき追加データが残っていることを示す。
Ipv6pReceiveFragment()関数では、fragment_sizeの割り当てサイズは、検証なしでパケットサイズから0x30(パケットヘッダ長)を差し引くことで計算される。パケットサイズがゼロの場合、この減算はアンダーフローし、結果として大きな16ビット値(0xFFD0または65488付近)となり、パーサーがパケットの有効境界外の過剰なメモリを処理する原因となり、メモリ破壊につながる。
アンダーフローからオーバーフローへ、そしてアロケーションのミスマッチ
Ipv6pReassemblyTimeout()関数は、バッファ・サイズとコピー操作を決定するために16ビット演算を使用して、指定された時間後に不完全なIPv6フラグメントをクリーンアップする責任を負う。packet_lengthまたはfragment_sizeが0xFFD0になる前のステップでのアンダーフローのため、割り当て中にオーバーフローが発生する。
計算の結果、レジスタはゼロにリセットされ、48バイトのメモリのみが割り当てられる。しかし、コピーされたデータ量(reassembly->payloadから65,488バイト)が割り当てられたメモリに対応しないため、制御可能なバッファオーバーフローがカーネルプールで発生する。
この相違により、攻撃者はIPv6処理の脆弱性を悪用した特別に細工されたパケットを介して悪意のあるコードを実行することができる。
CVE-2024-38963 概念実証
CVE-2024-38963の脆弱性を再現する試みとして、我々の仲間は欠陥を悪用するように設計された一連の不正なパケットを作成した。彼らがたどったプロセスは
1.不正なIPv6パケットの作成
ベースIPv6ヘッダーの後にIPv6宛先オプション拡張ヘッダー(タイプ60)を挿入し、無効なオプション(オプションタイプ0x81など)を埋め込む。
この操作により、Windowsカーネル(tcpip.sys)はalways_send_icmp = trueを設定し、IppSendErrorList()ルーチンを経由してICMPv6エラーを生成する。
2.ネットバッファリスト(NBL)処理の強制
このような不正なパケットをターゲットに大量に流すと、カーネルが複数のパケットを1つのネットバッファリスト(NBL)にグループ化する可能性が高まる。2つ以上のパケットがグループ化されると、脆弱性のあるIppSendErrorList()ループがアクティブになり、後続のフラグメントのDataLengthとOffsetメタデータが不正にリセットされる(パケットサイズがゼロになる)。
3.フラグメントされたIPv6パケットの注入
不正なパケットの送信に続いて、Fragment拡張ヘッダーを含むフラグメント化されたIPv6パケットが送信される。これらのフラグメントは、すでに壊れているDataLength値を使用して処理される。
4.再組み立てタイムアウトの悪用
カーネルはパケットの再組み立てを可能にするために、フラグメントを60秒間保持する(Ipv6pReassemblyTimeoutによって管理される)。このタイムアウトの間、破損した DataLength 値が Ipv6pReceiveFragment の整数アンダーフローを引き起こし、その結果、フラグメントサイズが正しく計算されない(過度に大きくなる)。
5.ヒープ・バッファ・オーバーフローのトリガー
カーネルはアンダーフローした値に基づいてヒープバッファを確保する。1つはメモリ割り当てサイズを決定し(16ビットのオーバーフローにより小さくなりすぎる)、もう1つはアンダーフローした大きな値を使用してコピー長を計算する。
このミスマッチは境界外書き込みを引き起こし、ヒープベースのバッファオーバーフローを引き起こし、これを悪用してサービス運用妨害(DoS)やリモートコード実行を引き起こす可能性があります。
この CVE を再現するために使用されたソースコードは、DoS 攻撃に使用されます:
この脆弱性が攻撃者に悪用されると、被害者のシステムが即座にクラッシュし、死のブルースクリーンが発生する可能性がある:
修復
オペレーティングシステムの定期的なアップデートを怠ると、CVE (Common Vulnerabilities and Exposures)に関連するものを含むセキュリティの脅威にデバイスをさらすことになります。このようなリスクを軽減するために、MetaDefender Endpoint™はOSのバージョンを検出し、CVE-2024-38063のような既知のCVEを含む脆弱性をチェックすることで、強固な保護を提供します。
MetaDefender Endpoint 、重要なIT/OTネットワーク内のデバイスを周辺機器やリムーバブルメディアの脅威から保護するように設計されています。OSやインストールされているアプリケーションが最新であることを確認し、古いバージョンや脆弱なバージョンにフラグを立て、既知の脆弱性やCVEを持つアプリケーションを推奨される修正と共にリストアップします。また、180以上のファイルタイプに対してDeep CDR™を実行しながら、複数のマルウェア対策エンジンを使用してスキャンし、クリーンであることが判明するまでUSB ドライブへのアクセスをブロックすることで、リムーバブルメディアのリスクからデバイスを保護します。
MetaDefender Endpoint 業界をリードするインテリジェンスによってどのように貴社のセキュリティ体制を変えることができるか、今すぐ弊社のエキスパートにご相談ください。