ドライバーが必要なアプリがあります。実験として、またテスト目的で、mcr.Microsoft.com/windows/servercore:1903-AMD64
に基づくDockerイメージを使用してデプロイすることを考えました。ホストオペレーティングシステムは、開発用ラップトップであるWindows 101903です。ドライバーはミニフィルターファイルシステムドライバーで、インストールは問題ないようですが、起動に失敗します。アプリケーション自体は、x64/x86で実行される32ビットのポータブル実行可能ファイルです。
Windows Server Dockerイメージにミニフィルターファイルシステムドライバーをインストールして実行することは可能ですか?
Dockerインスタンスで実行されているsc
コマンドの出力は次のとおりです。
C:\>sc start foo
SERVICE_NAME: foo
TYPE : 2 FILE_SYSTEM_DRIVER
STATE : 1 STOPPED
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
PID : 0
FLAGS :
C:\>sc query foo
SERVICE_NAME: foo
TYPE : 2 FILE_SYSTEM_DRIVER
STATE : 1 STOPPED
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
C:\>fltmc
The FltMgr.sys driver is not currently loaded.
現在、Windowsコンテナにドライバをインストールする方法はありません。
ただし、Windowsのコンテナーは、ホストOSに存在するドライバーを利用できます。
Windowsコンテナのリバースエンジニアリングに関するUnit42のブログ投稿では、Windowsコンテナの内部動作について説明しています。これは、フィルタリングがシステムコールレベルで発生することを示しています。
危険なシステムコールがたくさんあり、呼び出しプロセスまたはスレッドがサイロ内にあるかどうかを判断するための複数のカーネル関数があります。コンテナ内にドライバをロードする特定のケースでは、Windowsがカーネルに十分なチェックを持っていることがわかりました。これは、他の多くのシステムコールにも関連しています。この場合、
IopLoadDriverImage
が実際にカーネルドライバーイメージをロードするために呼び出す関数であるNtLoadDriver
は、呼び出しプロセスがサイロ内にあるかどうかを示す値を返すだけです。
詳細については、ブログ投稿全体をここで見つけることができます: Windowsコンテナのリバースエンジニアリングから学んだこと