Post

[OS] Operating System Practice(1): Kernel Build

[OS] Operating System Practice(1): Kernel Build

๐Ÿ€ ์šด์˜์ฒด์ œ ์‹ค์Šต ์ˆ˜์—… ์ •๋ฆฌ

Build environment


Use virtual machine ubuntu version: 24.04LTS kernel์€ 5.5.13์„ ์„ค์น˜ํ•ด์•ผํ•จ

Build process


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 1. Update Packages and Install Required Packages
sudo apt update && sudo apt upgrade
sudo apt install build-essential libncurses6 libncurses-dev flex bison \
                 bc dwarves pahole libudev-dev libpci-dev \
                 libssl-dev libelf-dev libiberty-dev binutils-dev -y

# 2. Download the desired kernel version and decompress
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.5.13.tar.xz
tar xvf linux-5.5.13.tar.xz

# 3. Build kernel
cd linux-5.5.13

sudo cp -v /boot/config-$(uname -r) .config
sudo make menuconfig
* 1. Load -> .config
* 2. Save -> .config
* 3. Exit

sudo make -j$(nproc) # <- ์˜ค๋ฅ˜ ๋ฐœ์ƒ
sudo make modules_install
sudo make install

sudo reboot

์ฒซ๋ฒˆ์งธ ์˜ค๋ฅ˜


alt text

  • xrealloc ํ•จ์ˆ˜์—์„œ use-after-free ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•จ

  • ์›์ธ

    • Linux 5.5.13์€ ์ตœ์‹  gcc์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ: gcc์˜ ๋ฒ„์ „์„ 10๋กœ ๋‚ฎ์ถ”๊ธฐ๋กœ ๊ฒฐ์ •

1
2
3
4
5
6
# gcc 10 version ์„ค์น˜
sudo apt install gcc-10 g++-10

# gcc์˜ ์šฐ์„  ์ˆœ์œ„ ๋ณ€๊ฒฝ
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 1 # <-์šฐ์„ ์ˆœ์œ„๋ฒˆํ˜ธ
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 1

๋‘๋ฒˆ์งธ ์˜ค๋ฅ˜


alt text

  • objtool์ด thunk_64.o๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ missing symbol table์ด ๋ฐœ์ƒํ•จ

  • ๋ฐœ์ƒํ•˜๋Š” ์ด์œ :

    • objtool์ด symbol table์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์—์„œ missing symbol table ๋ฐœ์ƒ
    • Makefile.build์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น .o ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ๊ทœ์น™์ด ์ ์šฉ๋จ
    • ๋”ฐ๋ผ์„œ arch/x86/entry/thunk_64.o๊ฐ€ ์‚ญ์ œ๋จ

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ: CONFIG_STACK_VALIDATION ๋น„ํ™œ์„ฑํ™”(objtool์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜์—ฌ Stack Validation์„ ์ˆ˜ํ–‰ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์˜ต์…˜) -> ์ „์ฒด objtool ๊ฒ€์‚ฌ๋ฅผ ์šฐํšŒํ•˜์ง€ ๋ง๊ณ  thunk_64.oํŒŒ์ผ๋งŒ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•ด์„œ ์šฐํšŒ

  • arch/x86/entry/Makefile์—์„œ thunk_64.o ํŒŒ์ผ์„ objtool ๊ฒ€์ฆ์—์„œ ์ œ์™ธํ•˜๋„๋ก ํŽธ์ง‘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vim arch/x86/entry/Makefile

# SPDX-License-Identifier: GPL-2.0
#
# Makefile for the x86 low level entry code
#

OBJECT_FILES_NON_STANDARD_entry_64_compat.o := y
OBJECT_FILES_NON_STANDARD_thunk_64.o := y # ์ถ”๊ฐ€

CFLAGS_syscall_64.o		+= $(call cc-option,-Wno-override-init,)
CFLAGS_syscall_32.o		+= $(call cc-option,-Wno-override-init,)
obj-y				:= entry_$(BITS).o thunk_$(BITS).o syscall_$(BITS).o
obj-y				+= common.o

obj-y				+= vdso/
obj-y				+= vsyscall/

obj-$(CONFIG_IA32_EMULATION)	+= entry_64_compat.o syscall_32.o

CFLAGS_REMOVE_thunk_64.o := -fstack-validation # ์ถ”๊ฐ€

์ดํ›„ sudo make clean๋กœ ์บ์‹œ ์ดˆ๊ธฐํ™” ํ›„ ๋‹ค์‹œ ๋นŒ๋“œ

์„ธ๋ฒˆ์งธ ์˜ค๋ฅ˜


alt text

  • build ๊ณผ์ •์—์„œ debian/canonical-certs.pem ํŒŒ์ผ์ด ํ•„์š”ํ•˜์ง€๋งŒ ์กด์žฌํ•˜์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜
  • ์ด ํŒŒ์ผ์€ ๋ณดํ†ต ๋ฐฐํฌํŒ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธ์ฆ์„œ์ด์ง€๋งŒ, ์ปค๋„ ์†Œ์Šค์—๋Š” ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ: .configํŒŒ์ผ์—์„œ CONFIG_SYSTEM_TRUSTED_KEYS=""์œผ๋กœ ์ˆ˜์ •

This post is licensed under CC BY 4.0 by the author.