환경 구축

[리눅스 커널 취약점 분석] 리눅스 커널 퍼징용 커널 빌드

xmin 2025. 11. 1. 01:52

본 블로그는 로컬 환경에서 실시되었으며, wsl과 로컬 환경 동일합니다.

linux-6.17.6 버전을 기준으로 작성 되었으며, 모든 설치 과정은 동일하니 linux-6.17.6 부분만 각자 다운받은 버전으로 변경하면 됩니다.

 

먼저 아래 링크에서 커널 소스를 다운 받는다.

https://kernel.org/

 

The Linux Kernel Archives

 

kernel.org

 

다운을 다 받고, 터미널에서 다음 명령어를 실행 시킨다.

sudo mkdir /usr/src/kernel
cd /usr/src/kernel
sudo cp ~/Downloads/linux-linux-6.17.6.tar.xz ./

/usr/src/kernel 경로가 작업 디렉토리가 될 것이다.

 

이어서 커널 소스가 복사 되었다면 다음 명령어를 실행시킨다.

# 이후부터 작업 편의성을 위해 root 계정 접속
sudo su
tar -xvf linux-6.17.6.tar.xz
cp ./linux-6.17

다음으로 의존성 관련 설치를 진행한다.

sudo apt update
sudo apt install -y build-essential libncurses-dev bison flex libssl-dev libelf-dev dwarves libdw-dev libdwarf-dev zlib1g-dev libiberty-dev bc fakeroot cpio kmod rsync curl clang llvm lld gawk

의존성 설치 완료 후 퍼징에 필요한 옵션 등을 만져준다.

make menuconfig
# 만약 오류나면 화면을 키우고, 뭔 퍼런 창 뜨면 ESC 두번 입력
# 다음 빌트인 방법으로 ./config 파일에 값 입력

# 퍼징/보안 서명 관련 설정
scripts/config --disable SYSTEM_TRUSTED_KEYS
scripts/config --disable SYSTEM_REVOCATION_KEYS
scripts/config --disable SYSTEM_BLACKLIST_KEYRING
scripts/config --set-str SYSTEM_BLACKLIST_HASH_LIST ""

# KCOV (커버리지 수집)
scripts/config --enable KCOV
scripts/config --enable KCOV_INSTRUMENT_ALL
scripts/config --enable KCOV_ENABLE_COMPARISONS

# KASAN (Heap overflow 등 탐지)
scripts/config --enable KASAN
scripts/config --set-str KASAN_MODE "inline"

# KMSAN (Uninitialized memory 탐지)
scripts/config --enable KMSAN
scripts/config --enable KMSAN_KCOV

# UBSAN (Undefined behavior 탐지)
scripts/config --enable UBSAN
scripts/config --enable UBSAN_SANITIZE_ALL

# Lockdep (Lock debugging)
scripts/config --enable PROVE_LOCKING
scripts/config --enable DEBUG_LOCK_ALLOC
scripts/config --enable LOCKDEP

# Debug info (syzkaller용 커버리지 심볼 필요)
scripts/config --enable DEBUG_INFO
scripts/config --enable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT
scripts/config --enable DEBUG_KERNEL
scripts/config --enable DEBUG_FS
scripts/config --enable GDB_SCRIPTS

# 기타 빌드 관련 최적화 옵션
scripts/config --disable CONFIG_DEBUG_INFO_REDUCED
scripts/config --disable CONFIG_LTO_CLANG
scripts/config --disable CONFIG_STACK_VALIDATION
scripts/config --enable CONFIG_CONFIGFS_FS

#################################################
# 선택사항 : 퍼징 대상 모듈 선택
scripts/config --module DRIVERS_MISC
scripts/config --module DRIVERS_INPUT
scripts/config --module DRIVERS_NET
scripts/config --module DRIVERS_USB
scripts/config --module DRIVERS_BLOCK
scripts/config --module DRIVERS_CHAR
scripts/config --module FILE_SYSTEMS
scripts/config --module NETFILTER
#################################################

# 설정 반영
make olddefconfig

설정 반영까지 완료 후 빌드를 진행한다.

make -j$(nproc)

이 과정에서 적으면 10분 내외, 길면 1시간도 걸린다. 오류가 뜨면 make -j$(nproc)를 다시 입력해서 뜨는 로그 그대로 복사해서 GPT랑 오붓한 데이트 하면 해결 될겁니다.

빌드 성공시 출력

 

위와 같은 Kernel: arch/x86/boot/bzImage is ready 문구가 나온다면 성공한 것이다.

 

이어서 모듈을 설치 하도록 하겠다.

make modules
sudo make modules_install
sudo make install

모듈 설치 출력

이렇게 done가 나오면 잘 설치 된 것이다.

이제 ls /boot/ 해보면

ls /boot/ 결과

다음과 같이 vmlinuz-6.17.6가 존재 한다는 것을 알 수 있다. 잘 빌드가 된 것이다. 이제 이 커널로 부팅이 가능하다.