Record the Process of Changing WSL2 Kernel
I'm about to start looking into Kernel Pwn recently, but it seems that the kernel of WSL2 is not the original one, so I decided to replace it.
Prerequisites
Make sure you are using WSL2 instead of WSL, and your Windows version meets the requirement of Windows build 19041 or higher.
Check Kernel Version
First, let's check your current kernel version.
I have installed neofetch, so I used neofetch directly, but you can also use commands like cat /proc/version or uname -a to check.
The original kernel version is 5.15.79.1.

Choose Kernel Version
When I installed WSL2, the Ubuntu version was 22.04.1 LTS. As of 2023/02/13, the latest kernel version is 6.1.9, which is compatible with my Ubuntu version, so I chose to upgrade to the latest version.
If there are compatibility issues: for example, if you want to install version 6.X kernel for Ubuntu16, you need to upgrade the Ubuntu version first; otherwise, it won't work.
Download the kernel from The Linux Kernel Archives. I used a mirror site.
# Replace the filename and the folder name according to your cases!
curl -LO https://mirrors.edge.kernel.org//pub/linux/kernel/v6.x/linux-6.1.9.tar.gz
tar xf linux-6.1.9.tar.gz
cd linux-6.1.9
Use WSL2-Linux-Kernel Configuration File
This .config file has been adjusted and optimized for wsl2. Although the branch was still linux-msft-wsl-5.15.y when I installed it, which is compiled for the 5.15 kernel, it still works for the 6.1.9 kernel I installed.
curl https://raw.githubusercontent.com/microsoft/WSL2-Linux-Kernel/linux-msft-wsl-5.15.y/Microsoft/config-wsl >> .config
(Optional) Adjust the Configuration File
I modified the CONFIG_LOCALVERSION field in the .config file to indicate the kernel characteristics, and you can make more modifications as needed.
Compile the Kernel
Since we already have the .config file, we can just run make to compile the kernel.
Before that, make sure you have installed all the dependencies. You can install them using the following commands.
sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev
# Go to https://github.com/microsoft/WSL2-Linux-Kernel#build-instructions for the latest build dependencies
Here, adjust the number of jobs based on your own configuration.
My CPU i7-12700F has 12 cores and 20 threads, so I can use the -j20 option.
sudo make -j20 && sudo make modules -j20 && sudo make modules_install -j20 && sudo make install -j20
Before compilation, there will be many configuration options (i.e., new kernel configuration options not specified in the .config) that you need to specify. Unless you have specific requirements, you can just press Enter all the way through.
Wait patiently for the installation to finish. You can find a similar field in the standard output indicating the kernel path after Kernel:.
Kernel: arch/x86/boot/bzImage is ready (#2)
DESCEND objtool
DESCEND bpf/resolve_btfids
CALL scripts/checksyscalls.sh
DEPMOD /lib/modules/6.1.9-linux-standard-WSL2
INSTALL /boot

Modify the Kernel
Copy it to the desired location. In my case, I copied it to E:\Ubuntu-2204LTS\linux_kernel_6.1.9.
Note that this location should be on your main hard drive, not inside WSL.
cp arch/x86/boot/bzImage /mnt/E/Ubuntu-2204LTS/linux_kernel_6.1.9
Open your user directory and modify the .wslconfig file. Add a kernel field under the [wsl2] tag, with the value being the Windows path with escaped backslashes.
For example, in my case, the .wslconfig file looks like this.
[wsl2]
kernelCommandLine = vsyscall=emulate
kernel=E:\\Ubuntu-2204LTS\\linux_kernel_6.1.9
[user]
default=root
You can open your user directory by pressing Win+R and entering %USERPROFILE. Typically, it is located in C:\Users\<YOUR_USER_NAME>\.
If the .wslconfig file does not exist, then create it.
If the [wsl2] tag does not exist, then create it.
Restart WSL
Now, restart your WSL2 and check the kernel version again.
If everything goes well, your kernel should have been successfully updated.
wsl --shutdown
wsl
