
IPv4 use-after-free CVE-2026-98432에 대한 업스트림 kfree_rcu 수정을 포함하는 패치된 Ubuntu 커널 .deb 패키지를 빌드하는 셸 스크립트입니다.
build-patched-kernel.sh는 CVE-2026-98432에 대한 업스트림 수정 사항을 포함하는
Ubuntu 커널 .deb 패키지를 빌드합니다:
e3f33b0a1d89 "ipv4: RCU 유예 기간 이후 inet_opt 및 ireq_opt 해제"
이 버그는 ip_options_build()의 use-after-free입니다. 한 CPU가 여전히
SYNACK을 전송하는 동안 다른 CPU가 TCP 소켓의 IPv4 옵션을 해제할 수 있습니다. 이 수정은
net/ipv4/af_inet.c와 net/ipv4/tcp_ipv4.c에서 두 개의 kfree() 호출을
kfree_rcu()로 대체합니다.
uname -r에서 가져옵니다
(예: 6.8.0-45-generic).deb-src 저장소를 활성화하고 컴파일러와 빌드 도구를 설치합니다.apt-get source로 이 커널을 빌드한 Ubuntu 소스 패키지를 다운로드합니다. 아카이브에
더 이상 해당 버전이 없으면 Launchpad의 pull-lp-source로 대체합니다. 그런 다음
빌드 의존성을 설치합니다.kfree_rcu()가 NULL을 허용하지 않는
5.7 이전 커널에서는 NULL 검사를 추가합니다.+cve202698432.1을 추가하여, 새 패키지가 동일한 ABI의 아카이브
패키지를 업그레이드하도록 합니다.debian/rules로 빌드하고 .deb 파일을 ./debs-<version>/에
복사합니다.스크립트를 다시 실행하면 다운로드한 소스를 재사용하며 두 번 패치하지 않습니다.
Ubuntu 머신 자체에서 (root 또는 sudo로 실행):
./build-patched-kernel.sh # uname -r의 커널
./build-patched-kernel.sh 6.8.0-45-generic # 특정 커널
Docker에서는 커널과 일치하는 Ubuntu 릴리스를 사용하세요 (6.8은 noble, 5.15는
jammy). 컨테이너 내부의 uname -r은 호스트의 커널을 보여주므로 버전을 명시적으로
전달해야 합니다:
docker run --rm -v "$PWD":/work -w /work -e WORKDIR=/build ubuntu:24.04 \
./build-patched-kernel.sh 6.8.0-45-generic
WORKDIR=/build는 커널 소스를 컨테이너 내부에 유지합니다. macOS처럼 마운트된
디렉터리가 대소문자를 구분하지 않는 경우에 필요합니다. 기타 설정(OUTDIR,
LOCAL_SUFFIX, SRC_PACKAGE/SRC_VERSION, JOBS)은 스크립트 상단에
설명되어 있습니다.
sudo apt install ./debs-<version>/linux-image-unsigned-<version>_*.deb \
./debs-<version>/linux-modules-<version>_*.deb \
./debs-<version>/linux-modules-extra-<version>_*.deb \
./debs-<version>/linux-headers-*.deb
sudo reboot
커널 이미지는 서명되지 않았으며 서명된 linux-image-<version> 패키지를
대체합니다. Secure Boot가 켜져 있으면 자체 MOK 키로 이미지에 서명하거나 Secure
Boot를 끄세요.