一、概述


調試內核漏洞時需要搭建調試環境,經常到處搜命令,或者是忘記了哪個流程然后臨時使用搜索引擎,難成體系。因此在此處進行記錄,把編譯內核過程梳理一下,后續遇到什么問題再接著補充。

二、下載內核源碼

首先通過內核下載地址下載內核源碼,下面做了一張圖主要介紹一下官網主頁上下載包帶的各個參數含義。

 

通過log頁面,可以搜索指定的版本進行下載。

三、編譯內核

docker與VM編譯內核對比

docker消耗資源少,部署和遷移方便,VM隔離性更強。總的來說docker和VM的編譯流程沒有太大區別,因為我習慣在VM環境下進行操作,因此下文的編譯流程都是在VMware17 Pro中進行操作的。

編譯流程

我是在VMware中編譯內核,步驟如下:

1.創建一個虛擬機并安裝操作系統。(此處使用的是ubuntu 20)

Linux ubuntu 5.15.0-69-generic #76~20.04.1-Ubuntu SMP Mon Mar 20 15:54:19 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

2.下載并解壓內核源代碼。(此處使用的是5.16.12)

3.打開終端并切換到內核源代碼目錄。

4.運行以下命令以配置內核:

(1)make menuconfig

此處為配置設置,選擇save

(2)make -j$(nproc)

開始進行編譯,我選擇的j4

(3)sudo make modules_install #將編譯生成的內核模塊復制到指定的系統目錄中,以供內核使用

`make -j4 #需要再編譯一下`
`sudo make install #這個命令會將新的內核設置為默認啟動內核` 
這會將編譯后的內核和模塊復制到系統文件夾中,并更新啟動加載程序以引導新內核。在這個過程中會遇到一系列錯誤,下面是我遇到的錯誤及解決方案,希望能給大家幫助

(4)dpkg --list | grep linux-image #列出已安裝內核版本

rc表示軟件包已被卸載但未完全清除;
ii表示軟件包已經安裝;

(5)vim /etc/default/grub #修改默認啟動的內核版本

修改`GRUB_DEFAULT`選項設置為所需的內核版本編號,此步驟也可直接GRUB設置

(6)reboot

編譯報錯及解決方案

◆運行sudo make modules_install報錯:

$ sudo make modules_install
arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support
sed: can't read modules.order: No such file or directory
make: *** [Makefile:1479: __modinst_pre] Error 2

解決方案:

這個報錯原因是 `CONFIG_X86_X32 enabled but no binutils support`,選擇重新編譯binutils或者禁用CONFIG_X86_X32,我選擇禁用,編輯.config文件,將CONFIG_X86_X32=y改為CONFIG_X86_X32=n。重新運行`make -j4`,不再報此處錯誤。

◆運行sudo make modules_install報錯:

$ sudo make modules_installsed: can't read modules.order: No such file or directorymake: *** [Makefile:1479: __modinst_pre] Error 2

解決方案:

sudo depmodsudo make modules_prepare

◆使用make -j4后報錯:

make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.

解決方案:

編輯.config文件,修改CONFIG_SYSTEM_TRUSTED_KEYS
修改CONFIG_SYSTEM_TRUSTED_KEYS,將其賦空值。
修改前:原變量有值
CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
修改后:將該變量賦空值,將該項原有內容刪掉即可,如下:
CONFIG_SYSTEM_TRUSTED_KEYS=""
修改CONFIG_SYSTEM_REVOCATION_KEYS(可選),如果CONFIG_SYSTEM_REVOCATION_KEYS的值不為空的話,也將其賦空值。
修改前:原變量有值
CONFIG_SYSTEM_REVOCATION_KEYS="debian/canonical-revoked-certs.pem"
修改后:將該變量賦空值
CONFIG_SYSTEM_REVOCATION_KEYS=""

◆使用make -j4后報錯:

BTF: .tmp_vmlinux.btf: pahole (pahole) is not available Failed to generate BTF for vmlinux Try to disable CONFIG_DEBUG_INFO_BTF make: *** [Makefile:1161: vmlinux] Error 1

解決方案:

(1) BTF(BPF Type Format)提供了一種可以在運行時訪問內核類型信息的方法,允許編寫運行在內核空間中的工具和程序來進行調試、性能分析和安全審計等操作,`make menuconfig`,然后在配置界面中找到“Kernel hacking”選項,找到“Compile-time checks and compiler options”,然后禁用“Compile the kernel with BTF type information”,保存退出。【這種是暴力方法,遇到報錯就修改config,后續可能會遇到一些問題】(2) sudo apt-get install dwarvesBTF報錯一般是系統缺少dwarves軟件包導致,因此安裝軟件包

◆使用make -j4后報錯:

zstd: not found

解決方案:

sudo apt-get install zstdzstd是一種用于數據壓縮的快速壓縮算法,可以用于將單個文件壓縮成單個文件或將多個文件壓縮成一個文件。與zip不同,zstd不包括任何目錄結構,僅用于對數據進行壓縮,這個錯誤提示是因為編譯內核時缺少zstd壓縮庫,內核編譯時會使用到這個工具,所以需要apt安裝。

四、切換內核版本

sudo make install運行成功后,此時通過dpkg --list | grep linux-image也看不到最新的5.16.12,因為我們需要選擇重啟選擇新內核。此處可以進入GRUB或者修改配置文件設置。

進入GRUB設置啟動內核

VMware下重啟,長按shift,選擇Advanced options或者Advanced選項,進入內核選項頁面。(如果Ubuntu安裝只有一個內核版本,則不會出現GRUB菜單,虛擬機將直接啟動Ubuntu。)

進入GRUB:

進入Advanced options,選擇第一個:

切換內核成功:

五、總結

本文主要是對內核編譯的整體流程進行一個梳理,針對編譯流程中進行記錄,后續對內核漏洞進行復現與分析。