ファイルシステム フィルタドライバ (MiniFilter) が存在しないと FMFn の Paged Pool がリークする - Paged Pool memory with pool tag FMFn will leak if no MiniFilter exists.

Last Update: feedback 共有

English follows Japanese

こんにちは、Windows プラットフォーム サポートです。
今回は特定の条件で FMFn の Paged Pool がリークしてしまう事象についてご説明いたします。

概要

Windows OS に、一つ以上のファイルシステム フィルタドライバ (MiniFilter) が存在しない場合には、任意の新しいプロセスが生成される度に、Filter Manager が管理する Paged Pool(FMFn)がリークします。一般的には、セキュリティ対策ソフトが導入された環境や、UAC が有効な環境では、MiniFilter が存在するので現象は発生しません。MiniFilter が存在しているかどうかは、以下の手順から確認可能です。

  1. 管理者権限でコマンド プロンプトを開きます。
  2. fltmc instances コマンドを実行します。
  3. システム ボリューム (C:) にアタッチされている、MiniFilter (※ Legacy を除く) が 1 つ以上存在していることを確認してください。

リークが発生しないパターン

以下の例では、システム ボリューム (C:) に MiniFilter (luafv) がアタッチされているため、リークが発生しません。

1
2
3
4
5
フィルター            ボリューム名                              階層        インスタンス名      フレーム   SprtFtrs  Vl 状態
-------------------- ------------------------------------- ------------ ---------------------- ----- -------- --------
luafv C: 135000 luafv 0 00000003
npsvctrig \Device\NamedPipe 46000 npsvctrig 0 00000000

リークが発生するパターン #1

以下の例では、システム ボリューム (C:) に MiniFilter が一つもアタッチされていないため、リークが発生します。

1
2
3
4
フィルター            ボリューム名                              階層        インスタンス名      フレーム   SprtFtrs  Vl 状態
-------------------- ------------------------------------- ------------ ---------------------- ----- -------- --------
npsvctrig \Device\NamedPipe 46000 npsvctrig 0 00000000

リークが発生するパターン #2

以下の例では、システム ボリューム (C:) に Legacy Filter だけがアタッチされているため、リークが発生します。

1
2
3
4
5
フィルター            ボリューム名                              階層        インスタンス名      フレーム   SprtFtrs  Vl 状態
-------------------- ------------------------------------- ------------ ---------------------- ----- -------- --------
test C: 329998.99 <Legacy> 00000000
npsvctrig \Device\NamedPipe 46000 npsvctrig 0 00000000

現象発生 OS

  • Windows Server 2012/2012 R2

本現象は、UAC が無効化されており、セキュリティ対策ソフトを導入していない、または、Legacy Filter のみを含む Windows Server 2012 R2 の環境で発生した事例が報告されています。Windows 10 や Windows Server 2016 以降の OS でも、MiniFilter が存在しない環境では現象が発生すると考えられますが、既定で OS 標準の MiniFilter が複数存在しますため、同事象が発生した事例は報告されておらず、現時点で OS の動作変更の予定はございません。

原因

Filter Manager はファイル システムのフィルタ ドライバ (MiniFilter) が利用するカーネル ドライバであり、システムにロードされている MiniFilter が存在する場合に、アクティブになります。また、Filter Manager では、自身が利用するメモリ領域(FMFn)を管理しており、利用されなくなったメモリを確認し、解放する処理を行います。

一方で、新しいプロセスを生成する処理では、フィルタ ドライバ (MiniFilter) の役割を持っていない TCPIP ドライバの処理の中で、特定の目的のために Filter Manager が間接的に呼び出される場合があり、生成したプロセスのファイル名に関する情報が、Filter Manager のメモリ領域(FMFn)に確保されます。この時、システムにロードされた MiniFilter が一つも存在しない場合には、Filter Manager がアクティブ化されておらずメモリ解放が進まないのでリークが発生します。

回避策

上記確認手順で、一つ以上の MiniFilter が存在しない場合には、以下の手順で UAC を有効にして問題を回避できます。

// UAC 有効化
(1) コントロール パネルを開き、[表示方法] を [小さいアイコン] にします。
(2) [ユーザー アカウント] をクリックします。
(3) [ユーザーアカウント制御設定の変更] をクリックします。
(4) [アプリがコンピューターに変更を加えようとする場合のみ通知する (既定)] を選択して、[OK] をクリックします。
(5) OS を再起動します。

参考情報

Filter Manager Concepts - Windows drivers | Microsoft Docs
https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/filter-manager-concepts

特記事項

本情報の内容(添付文書、リンク先などを含む)は作成日時点でのものであり、予告なく変更される場合があります。

Symptom

If there is no File System minifilter loaded in Windows, Paged Pool memory (with pool tag FMFn), which is managed by the Filter Manager, will leak every time when a new process is created. This problem does not occur in such environments where some Anti-Virus security software is installed or where UAC (User Access Control) is enabled. You can check the existence of filesystem minifilter by the following steps.

  1. Open the elevated command prompt with the Admistrator priviledge.
  2. Input “fltmc instances” and press Enter key.
  3. Confirm if any MiniFilter (except ‘Legacy’) is attached on your system volume (C:).

Example1 (FMFn Paged Pool will ‘not’ leak in the following environment)

The following output shows that there is a MiniFilter (luafv.sys) attached on C:, which will not cause the issue.

1
2
3
4
5
Filter                Volume Name                            Attitude      Instance Name           Frame   SprtFtrs  VlStatus
-------------------- ------------------------------------- ------------ ---------------------- ----- -------- --------
luafv C: 135000 luafv 0 00000003
npsvctrig \Device\NamedPipe 46000 npsvctrig 0 00000000

Example2 (FMFn Paged Pool will leak in the following environment)

The following output shows that there is no MiniFilter attached on C:, which will cause the issue.

1
2
3
4
Filter                Volume Name                            Attitude      Instance Name           Frame   SprtFtrs  VlStatus
-------------------- ------------------------------------- ------------ ---------------------- ----- -------- --------
npsvctrig \Device\NamedPipe 46000 npsvctrig 0 00000000

Example3 (FMFn Paged Pool will leak in the following environment)

The following output shows that there is a Legacy Filter attached on C:. However this is not a MiniFilter so the issue will occur.

1
2
3
4
5
Filter                Volume Name                            Attitude      Instance Name           Frame   SprtFtrs  VlStatus
-------------------- ------------------------------------- ------------ ---------------------- ----- -------- --------
test C: 329998.99 <Legacy> 00000000
npsvctrig \Device\NamedPipe 46000 npsvctrig 0 00000000

Affected OS version

  • Windows Server 2012/2012 R2

This issue is usually reported on Windows Server 2012 R2, specifically where both UAC is disabled and no Anti-Virus security software is installed.Currently there is no plan to change this behavior.
Windows 10 / Windows Server 2016 or newer versions of Windows include multiple minifilters by default, so the issue does not occur.

Root Cause

Filter Manager is a kernel driver which is usually activated when File Sytem minifilter drivers are loaded. Filter Manager will manage pool usage of FMFn tag and frees them accordingly. However, TCPIP.sys driver, which is not acting as a minifilter driver, calls Filter Manager interfaces that results in the Filter Manage allocating pool memory with tag FMFn to store the name information about newly created processes. In this case, if there is no minifilter loaded, the Filter Manager is not “activated” so it will not free , those FMFn pool memory blocks, causing pool memory leak.

Workaround

If there is no minifilter loaded in the environment, you can work around this issue by enabling ‘User Access Control (UAC)’ which loads its minifilter (luafv.sys).

// Steps to enable UAC
(1) Open the Control Panel.
(2) Click ‘User Accounts’.
(3) Click ‘Change User Acoount Control settings’.
(4) Select ‘Notify me only when apps try to make changes to my computer (default)’ and press OK button.
(5) Reboot your Operating System.

References

Filter Manager Concepts - Windows drivers | Microsoft Docs
https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/filter-manager-concepts

Other

This contents may change without notice.