Inside WSL
Who am I?
 三村 聡志 a.k.a. 親方
 Twitter : @mimura1133
 Website : http://mimumimu.net/
 最近アプリ診断してる
 Windows + Visual Studio が
いつものスタイル。
Inside WSL
WSL でできること
WSL の仕組み
WSL 1
WSL 2
Hacking WSL
WSL でできること
WSL とは?
Windows Subsystem for Linux の
略
Windows 10 Fall Creators Update
(1709) 以降で
利用可能
WSL で出来ること
WSL1, WSL2
Linux のユーザモード環境の提供
64bit ELF のネイティブ実行
WSL2
Linux のカーネルモード環境
Linux カーネルを利用した高度な処理
iftop, mount などなど.
Linux の資産がつかえる!
WSL で出来ること
他にもこういうことができます:
WSL 内からの Win32 プログラムの
実行
WSL で稼働している Linux への
ファイルアクセス
WSL 内からの Windows への
ファイルアクセス
WSL を使ってみる
WSL を使ってみる - 1
ストアからインストール
WSL を使ってみる – 2
インストールが終わったら
あとは楽しむ。
WSL の仕組み – WSL1
WSL1 の仕組み
Windows 10 の “Pico Process”
という仕組みを利用して
Windows 上で ELF を実行する
Windows の1プロセスの扱いのため
プロセスがタスクマネージャーから見える
Pico Process?
From MSDN
Pico Process?
Windows のプロセスには下記3タイプがある
Minimal Process
プロセスID は付与されるが
PEB,TEB, NTDLL のリンク等は行われない
NT Process
通常の Windows プロセス
Pico Process
Pico Provider と関連付いた Minimal Process.
WSL1 の仕組み
WSL1 の仕組み
ELF ファイルを pico プロセスとして起動
Pico Provider は lxss.sys
(%SYSTEMROOT%SYSTEM32DRIVERSLXSS.SYS)
起動されると Windows 側では
LX Session Manager Service が起動する
(%SYSTEMROOT%SYSTEM32LXSSLxssManager.dll)
(%SYSTEMROOT%SYSTEM32LXSSwslhost.exe)
(%SYSTEMROOT%SYSTEM32wsl.exe)
表示側は conhost.exe (コマンドプロンプト等と
同じ)
WSL1 の仕組み
ELF ファイルを pico プロセスとして起
動
Pico Provider は lxss.sys
(%SYSTEMROOT%SYSTEM32DRIVERSLXSS.SYS)
Pico Provider が適宜システムコールを
理解し
Windows Kernel に指示を出す
WSL1 の仕組み
なおファイルについては
すべてそのまま保存されている
WSL の仕組み – WSL2
WSL2 の仕組み
From channel 9.
WSL2 の仕組み
カスタマイズされた Linux Kernel を利
用する
ELF ファイルはその上で実行する
Kernel Image:
通常は %SYSTEMROOT%System32lxsstools 以下のものを利用
余談ですが
Windows 10 では
Windows Hypervisor Platform が提供
Hyper-V の仕組みを利用して
VM を実行できる API 群
管理者権限は不要
C#, C++ 向けの API 実装は存在する
https://github.com/mimura1133/WHVPSharp
WSL2 を利用するために
現時点で WSL2 用の
ディストリビューションは出ていな
い
既存のものを変換して作る
wsl --set-version ubuntu 2
WSL2 の仕組み
WSL2 の仕組み
起動時に Linux VM (Optimized) を
起動
Lightweight VM が立ち上がる
WSL1 同様、起動されると Windows 側では
LX Session Manager Service が起動する
(%SYSTEMROOT%SYSTEM32LXSSLxssManager.dll)
(%SYSTEMROOT%SYSTEM32LXSSwslhost.exe)
(%SYSTEMROOT%SYSTEM32wsl.exe)
WSL2 の仕組み
WSL を起動すると
下記のように “WSL” という名前の
Docker が起動する
WSL を閉じても走り続ける
wsl --terminate で止められる.
WSL2 の仕組み
ファイルは VHDX の下に保存され
る
Hyper-V の仮想ディスクイメージ
(ext4)
Win – Linux は
9p Protocol.
(Plan9)
Hacking WSL –
WSL を使いやすくしよう
コマンドを使いやすくする
利用したい Linux コマンドと同じ名
前の
バッチファイルを作成する
下記の内容を書く:
@bash -c "%~n0 %*"
コマンドを使いやすくする
コマンドを使いやすくする
あとは PATH を通す
Windows と Linux のコラボ
ができる
ユーザディレクトリを合わせる
Linux の userdir を
Windows の %userprofile%
に
リンクさせる
/mnt/c/Users 以下に通常存在する
“ln –s” でリンクを張れば OK.
Hacking WSL –
WSL の深い挙動の違いを見る
挙動の違いを見る
WSL1 と WSL2 は
VM か Pico Process かの違いが
ある
それに合わせていくつかの挙動が異な
る
プロセスの見え方
WSL1
Pico Process のため
1つ1つがタスクマネージャから見え
る
WSL2
VM のため vmmem, vmwp.exe が
起動する
Processes (WSL1)
Windows 上からプロセスが見える
WSL が起動すると
wslhost.exe がドライバと通信し
結果を conhost.exe が描画する
Processes (WSL2)
Windows 上からはこれしか見えない
ただし hcsdiag からは下記のように見
える
mount の挙動の違い
WSL1
root は wslfs (実体は NTFS 上に
ある)
マウントできない
WSL2
root は ext4 (実体は VHDX 上に
ある)
mount (WSL1)
mount (WSL2)
Tcpdump の挙動の違い
WSL1
Pico Provider (lxss.sys) に
ローパケット処理が実装されていない
WSL2
動作する
同じ理由で iptables, nmap 等も動作する
tcpdump (WSL1)
tcpdump (WSL2)
ip addr の挙動の違い
WSL 1
Windows とアドレス・ポートを共有
WSL 2
Windows 側で NAPT される
ip addr (WSL1)
Windows とおなじアドレスが
付与されていることが分かる
ip addr (WSL2)
NAPT されている
GDB の挙動の違い
WSL1
Pico Process で Emulation してい
るため
アドレスが Linux らしいものとは異なる
WSL2
Linux 上のためアドレスがキッチリ
gdb (WSL1)
gdb (WSL2)
WSL まとめ
WSL まとめ
Windows Subsystem for Linux は
Windows 上で Linux の資産を活かす技術
WSL1 は 直接 Windows で実行
WSL2 は Docker 上で実行
再現度は WSL2 が高く、気軽さは WSL1
が高い
余談集
フォレンジックしたい
WSL1
NTFS 上にファイルが書かれる
基本的にはWindows のフォレンジックでよい
WSL2
vhdx ファイルを読む
こういうツールを使って raw にすればあとは楽
http://euee.web.fc2.com/tool/nhc.html
フォレンジックしたい
プロセスのログとしては下記の起動ログを
追う
wslhost.exe
検知システムを書きたい! (WSL1)
 PsSetCreateProcessNotifyRoutineEx2
 PsSetCreateThreadNotifyRoutineEx
この関数を使ってフックを掛ける
typedef enum _SUBSYSTEM_INFORMATION_TYPE {
SubsystemInformationTypeWin32,
SubsystemInformationTypeWSL,
MaxSubsystemInformationType
}

Inside wsl

Editor's Notes

  • #9 (電卓の起動と、ファイルアクセスをここでデモする)
  • #15 NT Process : 通常のプロセス Minimal Process : 通常のプロセスで行われる PEB や TEB, NTDLL のリンクなどが行われないプロセス。カーネルから見れば、プロセス ID が付与された、ただのメモリ空間に見える Pico Process : 先述の “Minimal Process” に、Pico Provider と呼ばれる処理器を関連付けたもの。 雑な表現にはなりますが、Minimal Process に Windows の処理を入れれば NT Process, それ以外のプロバイダによる処理器がつくと Pico Process という認識で良いと思います。
  • #22 Linux Kernel を入れて、まさに Docker のような構図で動かすようにしました。 Linux Kernel は MS 側で若干のパッチが当たっており、docker で動かすよりも軽量に動作するとのことです。
  • #24 今回の WSL や Docker 等も内部的にはこの機構を利用しています。
  • #26 基本的には仕組みは一緒。 ただ、繋がる先が VM か Pico Process の内部かの違い。