리눅스 커널 취약점 분석을 위해 커널에 퍼징 돌릴 것이다.
이를 위해서는 커널에 대해 알 필요가 있으며, 커널에 대하여 알아보도록 하겠다.
커널이란?
아래 블로그를 참고하여 공부하였다.
리눅스 시스템 부팅 프로세스(리눅스 부팅과정)
요약 리눅스 시스템이 올바로 시동하려면 일련의 과정이 올바로 수행되어야 한다. PC 아키텍처에 직접 설치된 리눅스 시스템은 다음 과정을 거쳐 시동한다. 전원을 켬 하드웨어를 시작함(BIOS 또
yonlog.tistory.com
커널은 운영체제의 핵심으로서 사용자 공간과 하드웨어 사이를 중재하는 소프트웨어 계층이다.
리눅스 커널은 모놀리식 구조이되 모듈을 통해 드라이버와 기능을 동적으로 로딩/언로드하도록 설계되었다.
이러한 역할은 부팅 과정에서 명확히 드러난다.
리눅스의 부팅 과정을 요약하자면 다음과 같다.
1단계 펌웨어 단계: 전원이 인가되면 CPU는 리셋 벡터(x86 기준 물리 0xFFFFFFF0)에서 실행을 시작해 펌웨어 코드를 수행한다. POST로 CPU, RAM, 칩셋, 주변 장치를 점검하고 가상화 확장과 보안 옵션 상태를 확인한다. BIOS뿐 아니라 UEFI 펌웨어도 일반적이다.
2단계 부트로더 단계: 펌웨어는 부팅 대상에서 로더를 찾는다. BIOS 환경이면 디스크의 MBR을 통해 GRUB 같은 2단계 로더로 넘어가고, UEFI 환경이면 ESP의 부트 매니저(GRUB2, systemd-boot 등)를 직접 실행한다. 부트로더는 커널 이미지(bzImage)와 initramfs, 커맨드라인을 메모리에 로드하고 커널 엔트리로 점프한다.
3단계 커널 단계: 커널은 자체 압축을 해제하고 메모리 관리자와 스케줄러를 초기화하며 ACPI/장치트리를 파싱해 기본 장치를 올린다. 콘솔 출력을 준비해 부팅 로그를 표시한다. 내장 드라이버는 즉시 활성화되며, 추가 모듈(.ko) 로딩은 대개 다음 단계의 초기 유저스페이스에서 이루어진다.
4단계 초기화 단계: initramfs의 /init이 실행되어 필요한 모듈을 로딩하고 실제 루트 파일시스템을 마운트한다. 이어서 switch_root 또는 pivot_root로 루트를 전환하고 PID 1(systemd 등)을 기동한다. PID 1이 서비스들을 올리며 사용자 로그인 환경까지 완성한다.
커널의 동작 방식
아래 문서들을 참조하여 작성했다.
https://docs.kernel.org/process/development-process.html
A guide to the Kernel Development Process — The Linux Kernel documentation
docs.kernel.org
https://man7.org/linux/man-pages/man2/syscalls.2.html?utm_source=chatgpt.com
syscalls(2) - Linux manual page
syscalls(2) — Linux manual page syscalls(2) System Calls Manual syscalls(2) NAME top syscalls - Linux system calls SYNOPSIS top Linux system calls. DESCRIPTION top The system call is the fundamental interface between a
man7.org
https://www.kernel.org/doc/Documentation/filesystems/vfs.rst?utm_source=chatgpt.com
커널의 동작 방식은 다음과 같다.
1. 커널이 제어권을 얻을 때 까지
펌웨어(BIOS/UEFI)가 하드웨어를 초기화한 뒤 부트로더를 실행하고, 부트로더가 커널 이미지와 initramfs, 커맨드라인을 메모리에 올려 커널 엔트리로 제어를 넘긴다.
2. 커널 초기화
커널은 스스로 압축을 해제하고 메모리 관리자·스케줄러를 세팅하며 ACPI/디바이스 트리를 파싱해 기본 장치를 올린다. 이어 콘솔을 준비해 부팅 로그를 출력한다.
3. 초기 유저스페이스
커널은 initramfs의 /init을 실행해 필요한 모듈 로딩·장치 노드 생성·실제 루트FS 마운트를 수행하게 하고, 이후 switch_root/pivot_root로 실제 루트로 전환한 뒤 PID 1(systemd 등)을 기동한다.
4. 스케줄링과 타이밍
런타임에서 커널은 스케줄러(CFS 등)로 실행 가능한 태스크를 선택해 CPU에 배치하고, 필요에 따라 NO_HZ(틱리스)로 불필요한 주기 인터럽트를 줄인다.
5. 유저 → 커널 경로(시스템 콜)
프로세스가 시스템 콜을 호출하면 커널은 시스템 콜 테이블에 따라 해당 sys_* 핸들러로 진입해 작업을 수행하고, 결과를 유저 공간으로 반환한다.
6. 비동기 사건 처리(인터럽트)
디바이스가 IRQ를 발생시키면 커널의 generic IRQ 레이어가 등록된 핸들러를 호출해 하드웨어 이벤트를 처리하고, 필요 시 소프트IRQ/워크큐로 후속 작업을 넘긴다.
7. 파일·입출력 경로(VFS)
open/read/write 등 호출은 VFS에서 경로 탐색과 dentry/inode 캐시를 거쳐 실제 파일시스템 드라이버로 내려가 디바이스 드라이버와 I/O를 수행한다.
8. 메모리 관리
커널은 가상 메모리로 주소 공간을 제공하고, 매핑이 없을 때 페이지 폴트를 처리해 페이지를 준비한다. 유저 주소공간은 VMA로 추적되며, 동적 할당은 SLAB/SLUB 등으로 관리되고, 부족 시 OOM killer가 동작한다.
9. 프로세스 수명주기
새 태스크는 fork/clone으로 만들어지고, execve로 새로운 프로그램 이미지로 교체된다. 종료 시 정리 작업을 수행하고 부모가 wait로 수거한다.
10. 보안과 정책
권한은 capabilities로 세분화되고, LSM(SELinux/AppArmor 등)이 훅을 통해 접근 통제를 적용하며, 필요 시 seccomp로 시스템 콜을 필터링한다.
11. 드라이버와 모듈
리눅스는 모놀리식 구조지만 LKM(.ko)로 드라이버/기능을 동적 로딩/언로드할 수 있고, 보통 udev 등 초기 유저스페이스가 자동 로딩을 트리거한다.
이러한 과정들을 통해 커널이 동작한다.
정리는 GPT가 도와줬다..
너무 졸리니까 다음 게시물로 퍼징에 대해 다루겠다.