一、概述
調試內核漏洞時需要搭建調試環境,經常到處搜命令,或者是忘記了哪個流程然后臨時使用搜索引擎,難成體系。因此在此處進行記錄,把編譯內核過程梳理一下,后續遇到什么問題再接著補充。
二、下載內核源碼
首先通過內核下載地址下載內核源碼,下面做了一張圖主要介紹一下官網主頁上下載包帶的各個參數含義。

通過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,選擇第一個:

切換內核成功:

五、總結
本文主要是對內核編譯的整體流程進行一個梳理,針對編譯流程中進行記錄,后續對內核漏洞進行復現與分析。
安全圈
看雪學苑
系統安全運維
一顆小胡椒
安全圈
安全圈
安全圈
安全圈
一顆小胡椒
安全圈
看雪學苑
一顆小胡椒