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 に指示を出す
実行権限は wsl.exe と同じ.
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