threat-research

CVE-2020-0796 Windows 10 SMB Serverにおけるメモリ破損の脆弱性

FortiGuard Labsによる脅威分析レポート
影響を受けるプラットフォーム: Windows 10
影響受けるユーザー: すべてのWindowsユーザー
影響: 不正な攻撃者がこのワームに対する脆弱性を悪用してメモリの破損を引き起こし、リモートから任意のコードを実行する可能性があります。
深刻度: High(高)
解決策: すべてのWindows 10ユーザーはCVE-2020-0796のパッチをすぐに適用することを強く推奨

はじめに

マイクロソフトはこのほど、Windows 10に影響するSMB Serverの重大な脆弱性であるCVE-2020-0796のパッチをリリースしました。

この脆弱性では、不正な攻撃者が悪用してメモリを破損させ、リモートから任意コードを実行する可能性があります。

このSMBの脆弱性は、ワームに悪用されて急速に拡散する可能性もあります。2017年、ランサムウェアのWannaCryによってSMB Serverの脆弱性CVE-2017-0144が悪用され、20万台以上のコンピュータが感染し、数十億ドルに及ぶ損害が発生しました。フォーティネットは、Windows 10を実行するコンピュータのすべてのユーザーに対して、今すぐパッチを適用することを強く推奨します。


影響を受けるバージョン

Windows 10 バージョン1903: 32ビットシステム用
Windows 10 バージョン1903: x64ベースシステム用
Windows 10 バージョン1903: ARM64ベースシステム用
Windows Server バージョン1903(Server Coreインストール)
Windows 10 バージョン1909: 32ビットシステム用
Windows 10 バージョン1909: x64ベースシステム用
Windows 10 バージョン1909: ARM64ベースシステム用
Windows Server バージョン1909(Server Coreインストール)


概要

FortiGuard Labsでは、Windows 10 x64バージョン1903を使用してこの脆弱性の分析を実行しました。このブログでは、不正な形式のヘッダーを含む圧縮データパケットによってSMB Serverに引き起こされる整数オーバーフローについて説明します。このオーバーフローは、解凍したデータを保持できないサイズの小さなバッファを割り当てるカーネルにおいて発生し、メモリ破損を引き起こします。


技術分析

srv2.sysのSrv2DecompressData関数には、整数オーバーフローのバグがあります。この脆弱性は、SMB Serverが不正な形式のSMB2_Compression_Transform_Headerを受信した時にトリガーされる可能性があります。

図1:Wiresharkでキャプチャした不正な形式のSMB2_Compression_Transform_Header

図1:Wiresharkでキャプチャした不正な形式のSMB2_Compression_Transform_Header

このテストは、0xFFFFFFFF(4294967295)OriginalSize/OriginalCompressedSegmentSizeと0x64 (100) Offsetを含む、不正なSMB2_Compression_Transform_Headerを作成して実施しました。このデータは、単純なLZ77アルゴリズムを使用して圧縮しました。

図2:IDAのスクリーンショット:サイズの大きいOriginalSize + Offsetが、srv2.sysのSrv2DecompressData関数において整数オーバーフローをトリガーする可能性がある

図2:IDAのスクリーンショット:サイズの大きいOriginalSize + Offsetが、srv2.sysのSrv2DecompressData関数において整数オーバーフローをトリガーする可能性がある

上のスクリーンショットは、srv2.sysのSrv2DecompressData関数で整数オーバーフローが発生する場所を示しています。この関数によって、解凍したデータを保持するバッファが作成されます。この関数は「Offset」に「OriginalSize」を加算してバッファサイズを計算し、ECXレジスタで整数オーバーフローを発生させます。

計算されたバッファサイズはSrvNetAllocateBuffer関数に渡され、そのサイズのバッファが割り当てられます。

図3:Windbgのスクリーンショット:整数オーバーフロー発生の前後

図3:Windbgのスクリーンショット:整数オーバーフロー発生の前後

上の例では、EAX(RAXの下位8バイト)がOriginalSize 0xFFFFFFFFを保持し、ECX(RCXの下位8バイト)がOffset 0x64を保持しています。バッファサイズは0xFFFFFFFF + 0x64と計算されており、0x63にオーバーフローされました。この関数は、次にSrvNetAllocateBufferを呼び出し、サイズ0x63(99)バイトのバッファが割り当てられます。このオーバーフローでは、意図したよりも小さなサイズのバッファがカーネルによって割り当てられました。

図4:Windbgのスクリーンショット:LZ77データの解凍とntoskrnl.exeのRtlDecompressBufferXpressLz関数のバッファオーバーフロー

図4:Windbgのスクリーンショット:LZ77データの解凍とntoskrnl.exeのRtlDecompressBufferXpressLz関数のバッファオーバーフロー

その後、RtlDecompressBufferXpressLz関数が呼び出されてLZ77データが解凍されました。上のスクリーンショットは、カーネルが「rep movs」命令を使用し、先に割り当て済の0x63(99)バイトのバッファに、0x15f8f(89999)バイトのデータをコピーしたプロセスを示しています。これによってサイズの小さいバッファがオーバーフローし、メモリが破損してカーネルがクラッシュすることが明らかになりました。


終わりに

このブログでは、以上のようにCVE-2020-0796の脆弱性の根本原因を解説しました。このSMBメモリ破損の脆弱性は極めて深刻です。ランサムウェアのWannaCryが2017年にSMBサーバーの脆弱性を悪用したように、ワームが今回の脆弱性を悪用して攻撃を仕掛け、ネットワークを通じて感染が拡散する可能性があるからです。Windows 10のすべてのユーザーは、パッチを適用することが極めて重要です。


ソリューション

Windows 10のCVE-2020-0796脆弱性に対して、マイクロソフトが提供している最新のパッチを今すぐ適用することをすべてのお客様に強く推奨します。

IPSシグネチャ「MS.SMB.Server.Compression.Transform.Header.Memory.Corruption」を使用することにより、この脆弱性を悪用する攻撃を検知することが可能です。


FortiGuardセキュリティサービスのポートフォリオの詳細をご覧いただき、毎週お届けしている脅威インテリジェンスブリーフ(英語)をぜひご購読ください。

FortiGuardセキュリティレーティングサービスは、セキュリティ監査とベストプラクティスを提供することで、お客様に最適なセキュリティ態勢の設計、実装、維持を支援します。