리눅스 커널 취약점 CVE-2026-98432: 임시 차단과 커널 패치 적용

CVE-2026-98432는 IPv4 TCP 연결을 받는 커널 코드에서 해제된 메모리를 다시 읽는 리눅스 커널 취약점으로, 리눅스 커널 CVE 팀이 Critical 등급으로 평가했습니다. 원격에서 인증 없이 공격할 수 있는 결함이라 Nginx와 Apache 구성의 AlmaLinux 9.8 라이트세일 서버에서 고친 커널 패키지로 업데이트하고 재부팅한 뒤, 실행 중인 커널 버전으로 패치를 확인하게 되었습니다.
1️⃣ 리눅스 커널 취약점 CVE-2026-98432: 결함 원리와 영향 범위
TCP 연결 요청(SYN)에 IPv4 옵션이 붙어 들어오면, 커널은 응답(SYN-ACK)에 그 옵션을 되돌려 보내기 위해 사본을 대기 중인 연결과 함께 보관합니다. 연결이 맺어지면 이 사본은 복제 없이 새 연결의 소켓으로 그대로 넘어갑니다.
그 사이 클라이언트가 SYN을 다시 보내면 다른 CPU가 같은 옵션으로 SYN-ACK를 만드는 중일 수 있습니다. 이때 새 연결이 닫히면서 커널이 옵션 메모리를 곧바로 해제하면, SYN-ACK를 만들던 코드가 이미 해제된 메모리를 읽는 use-after-free가 생깁니다.
이 코드는 애플리케이션이 연결을 보기 전, 커널이 연결 요청을 처리하는 단계에서 실행됩니다. 그래서 어떤 서비스가 열어 둔 포트든 IPv4 TCP로 듣고 있으면 원격에서 자격 증명 없이 공격이 닿고, 점수는 CVSS 3.1 기준 9.8입니다.
결함은 Linux 4.4부터 있어 대부분의 리눅스 서버가 해당합니다. AWS 안내는 라이트세일 블루프린트 가운데 AlmaLinux 9, CentOS Stream 9, Debian, openSUSE Leap, Ubuntu와 Amazon Linux 2, Amazon Linux 2023을 꼽았습니다. AlmaLinux 공지는 8, 9, 10 모두를 대상으로 밝혔고, 라이트세일의 워드프레스와 LAMP 같은 애플리케이션 블루프린트도 Debian이나 Ubuntu 위에서 실행되어 같은 대상입니다.
리눅스 커널을 사용하지 않는 FreeBSD와 Windows Server는 대상에서 빠집니다.
MPTCP(Multipath TCP)를 끈 서버도 패치 대상입니다. 공개된 공격은 MPTCP 리스너가 열린 서버를 노렸지만, 결함 자체는 일반 IPv4 TCP 코드에 있어 AlmaLinux 공지도 MPTCP가 없는 시스템 역시 고쳐야 한다고 밝혔습니다.
고친 커널은 옵션 메모리를 RCU 유예 시간(grace period)이 지난 뒤에 해제해, 다른 CPU가 SYN-ACK를 만들며 옵션을 읽는 동안에는 메모리를 남겨 둡니다.
2️⃣ 리눅스 커널 버전 확인: 고친 커널인지 보기
패치가 필요한지는 실행 중인 커널 버전으로 정해지므로, 업데이트 전에 배포판과 커널 버전부터 확인했습니다.
cat /etc/os-releaseNAME="AlmaLinux"
VERSION="9.8 (Olive Jaguar)"
ID="almalinux"
ID_LIKE="rhel centos fedora"
VERSION_ID="9.8"
PLATFORM_ID="platform:el9"
PRETTY_NAME="AlmaLinux 9.8 (Olive Jaguar)"
ANSI_COLOR="0;34"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:almalinux:almalinux:9::baseos"
HOME_URL="https://almalinux.org/"
DOCUMENTATION_URL="https://wiki.almalinux.org/"
BUG_REPORT_URL="https://bugs.almalinux.org/"
ALMALINUX_MANTISBT_PROJECT="AlmaLinux-9"
ALMALINUX_MANTISBT_PROJECT_VERSION="9.8"
REDHAT_SUPPORT_PRODUCT="AlmaLinux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.8"
SUPPORT_END=2032-06-01uname -r5.14.0-687.55.1.el9_8.x86_64nft --version-bash: nft: 명령어를 찾을 수 없음배포판은 AlmaLinux 9.8, 실행 중인 커널은 5.14.0-687.55.1.el9_8이었습니다. 임시 차단 규칙에 쓰는 nft 명령도 없어, nftables 패키지가 설치되어 있지 않은 상태였습니다.
rpm -q kernelkernel-5.14.0-611.30.1.el9_7.x86_64
kernel-5.14.0-687.49.1.el9_8.x86_64
kernel-5.14.0-687.55.1.el9_8.x86_64[rpm -q kernel]은 설치된 커널 목록을 출력하며, 재부팅 전까지 실제로 동작하는 것은 [uname -r]에 나온 하나입니다. 이 버전을 AlmaLinux 공지의 고친 버전과 비교합니다.
| 배포판 | 고친 커널 버전(이 버전 이상) |
|---|---|
| AlmaLinux 8 | kernel-4.18.0-553.182.1.el8_10 |
| AlmaLinux 9 | kernel-5.14.0-687.64.1.el9_8 |
| AlmaLinux 10 | kernel-6.12.0-211.72.1.el10_2 |
5.14.0-687.55.1.el9_8은 AlmaLinux 9의 고친 버전 5.14.0-687.64.1.el9_8보다 낮아 업데이트 대상이었습니다.
공격이 닿는 길이 열려 있는지 보려고, 듣고 있는 IPv4 TCP 포트와 MPTCP 상태를 확인했습니다.
ss -lnt4State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*sysctl net.mptcp.enablednet.mptcp.enabled = 0ss -lnMState Recv-Q Send-Q Local Address:Port Peer Address:Port모든 주소(0.0.0.0)에서 듣는 IPv4 TCP 포트는 웹 서버의 80, 443과 SSH 22였습니다.
[net.mptcp.enabled]가 0이고 MPTCP 소켓도 없어, 공개된 공격이 사용한 MPTCP 경로는 닫혀 있었습니다. 결함은 일반 IPv4 TCP 연결에서 시작되므로, IPv4 포트 세 개를 듣는 서버는 그대로 패치 대상입니다.
3️⃣ 리눅스 커널 업데이트: 커널 패키지 일곱과 재부팅
커널을 바꾸기 전에 라이트세일 콘솔에서 인스턴스의 수동 스냅샷을 만들었습니다. 라이트세일에는 부팅할 커널을 고르는 화면이 없어, 새 커널로 서버가 올라오지 않으면 이 스냅샷으로 새 인스턴스를 만들어 되돌리게 됩니다.
🔲 라이트세일 스냅샷 시뮬레이터
Linux 기반 블루프린트를 사용하는 인스턴스에 취약점(CVE-2026-98432)이 발생할 수 있습니다. 인스턴스가 영향을 받는지 확인하고 사용 중인 Linux 배포판에 최신 보안 업데이트를 적용하는 것이 좋습니다.
(us-east-1a)
스냅샷을 생성하여 인스턴스, 해당 시스템 디스크 및 연결된 디스크를 백업할 수 있습니다.
일일 스냅샷 시간은 오전 5:00 GMT+0입니다.Amazon은 가장 최근의 스냅샷 7개를 저장합니다.
🔲 리눅스 커널 업데이트와 재부팅 확인
저장소에 올라온 고친 커널 버전은 dnf 목록으로 확인했습니다.
dnf --showduplicates list available kernel kernel-core kernel-modules kernel-modules-core kernel-tools kernel-tools-libs kernel-headerskernel.x86_64 5.14.0-687.64.1.el9_8 baseos
kernel-core.x86_64 5.14.0-687.64.1.el9_8 baseos
kernel-modules.x86_64 5.14.0-687.64.1.el9_8 baseos
kernel-modules-core.x86_64 5.14.0-687.64.1.el9_8 baseos
kernel-tools.x86_64 5.14.0-687.64.1.el9_8 baseos
kernel-tools-libs.x86_64 5.14.0-687.64.1.el9_8 baseos
kernel-headers.x86_64 5.14.0-687.64.1.el9_8 appstreamdnf download kernel-core-5.14.0-687.64.1.el9_8kernel-core 패키지 파일만 현재 폴더에 내려받고, 설치는 하지 않습니다.
rpm -Kv kernel-core-5.14.0-687.64.1.el9_8.x86_64.rpm V4 RSA/SHA256 Signature, key ID b86b3716: OKrpm -qp --changelog kernel-core-5.14.0-687.64.1.el9_8.x86_64.rpm | grep CVE-2026-98432- ipv4: free inet_opt and ireq_opt after an RCU grace period (CKI Backport Bot) [RHEL-295635] {CVE-2026-98432}서명은 OK였고, 변경 기록에 CVE-2026-98432를 고친 줄이 있었습니다. 11월 3일 확인한 dnf 보안 공지(updateinfo)에는 이 CVE가 아직 없어, [dnf upgrade --security]로는 이 커널을 받을 수 없는 상태였습니다.
그래서 커널 패키지 일곱 개를 버전까지 지정해 설치했습니다.
dnf install -y kernel-5.14.0-687.64.1.el9_8 kernel-core-5.14.0-687.64.1.el9_8 kernel-modules-5.14.0-687.64.1.el9_8 kernel-modules-core-5.14.0-687.64.1.el9_8 kernel-tools-5.14.0-687.64.1.el9_8 kernel-tools-libs-5.14.0-687.64.1.el9_8 kernel-headers-5.14.0-687.64.1.el9_8================================================================================
꾸러미 구조 버전 저장소 크기
================================================================================
설치 중:
kernel x86_64 5.14.0-687.64.1.el9_8 baseos 1.1 M
kernel-core x86_64 5.14.0-687.64.1.el9_8 baseos 17 M
kernel-modules x86_64 5.14.0-687.64.1.el9_8 baseos 40 M
kernel-modules-core x86_64 5.14.0-687.64.1.el9_8 baseos 31 M
향상 중:
kernel-headers x86_64 5.14.0-687.64.1.el9_8 appstream 2.6 M
kernel-tools x86_64 5.14.0-687.64.1.el9_8 baseos 1.3 M
kernel-tools-libs x86_64 5.14.0-687.64.1.el9_8 baseos 1.1 M
삭제 중:
kernel x86_64 5.14.0-611.30.1.el9_7 @baseos 0
kernel-core x86_64 5.14.0-611.30.1.el9_7 @baseos 64 M
kernel-modules x86_64 5.14.0-611.30.1.el9_7 @baseos 33 M
kernel-modules-core x86_64 5.14.0-611.30.1.el9_7 @baseos 27 M
연결 요약
================================================================================
설치 4 꾸러미
향상 3 꾸러미
삭제 4 꾸러미
전체 내려받기 크기: 94 M
완료되었습니다!새 커널 패키지 네 개가 설치되고 kernel-headers, kernel-tools, kernel-tools-libs 세 패키지가 올라갔으며, 다른 패키지는 바뀌지 않았습니다. 설치된 커널을 세 개까지 남기는 [installonly_limit=3] 설정 때문에 가장 오래된 5.14.0-611.30.1.el9_7 패키지 넷이 삭제되었고, 내려받기부터 완료까지 74초가 걸렸습니다.
AlmaLinux 공지가 안내하는 공식 기준 명령은 저장소 정보를 새로 받은 뒤 업데이트가 있는 패키지를 모두 올립니다.
sudo dnf clean metadata && sudo dnf upgrade커널 말고 다른 패키지까지 함께 올라가므로, 배포판 버전 전체를 올리는 순서는 Alma Linux 업데이트: 9.4 → 9.8 in LightSail에서 확인할 수 있습니다.
새 커널은 재부팅해야 적용됩니다.
systemctl reboot서버가 다시 켜진 뒤 실행 중인 커널과 설치된 커널, 기본 커널을 차례로 확인했습니다.
uname -r5.14.0-687.64.1.el9_8.x86_64rpm -q kernelkernel-5.14.0-687.49.1.el9_8.x86_64
kernel-5.14.0-687.55.1.el9_8.x86_64
kernel-5.14.0-687.64.1.el9_8.x86_64grubby --default-kernel/boot/vmlinuz-5.14.0-687.64.1.el9_8.x86_64서버는 재부팅 명령 뒤 1분이 안 되어 다시 켜졌고, 실행 중인 커널과 다음 부팅에 쓸 기본 커널이 모두 5.14.0-687.64.1.el9_8로 바뀌었습니다. 이전 커널 5.14.0-687.55.1.el9_8은 남아 있어, 새 커널에 문제가 생기면 기본 커널을 되돌릴 수 있습니다.
| 항목 | 패치 전 | 패치 뒤 |
|---|---|---|
| 실행 중인 커널(uname -r) | 5.14.0-687.55.1.el9_8 | 5.14.0-687.64.1.el9_8 |
| 기본 커널(grubby) | 5.14.0-687.55.1.el9_8 | 5.14.0-687.64.1.el9_8 |
| 설치된 커널(rpm -q kernel) | 5.14.0-611.30.1.el9_7, 5.14.0-687.49.1.el9_8, 5.14.0-687.55.1.el9_8 | 5.14.0-687.49.1.el9_8, 5.14.0-687.55.1.el9_8, 5.14.0-687.64.1.el9_8 |
4️⃣ 재부팅 전 임시 차단: nft 규칙과 한계
재부팅을 바로 할 수 없을 때는 고친 커널을 올리기 전까지 임시 규칙으로 결함이 시작되는 패킷을 차단할 수 있습니다. 이 장의 명령은 직접 실행하지 않은 공식 기준(AlmaLinux와 AWS 공지)입니다.
Nginx와 Apache 구성의 AlmaLinux 9.8 라이트세일 서버는 재부팅이 몇 분이면 끝나므로, 임시 차단 없이 바로 커널을 업데이트했습니다.
결함은 IPv4 옵션이 붙은 TCP 연결 요청으로만 시작됩니다. 일반 트래픽은 IPv4 옵션을 거의 사용하지 않아, 옵션이 붙은 IPv4 TCP 패킷만 차단해도 평소 연결은 그대로 유지됩니다.
sudo dnf install -y nftablesnft 명령은 firewalld와 함께 설치되는 nftables 패키지에 들어 있습니다. 명령이 없는 서버라면 먼저 설치합니다.
sudo nft -f - <<'EOF'
add table ip cve_2026_98432
delete table ip cve_2026_98432
table ip cve_2026_98432 {
chain prerouting {
type filter hook prerouting priority -300; policy accept;
meta l4proto tcp ip hdrlength > 5 counter drop
}
}
EOFIPv4 헤더 길이가 5를 넘는 TCP 패킷, 즉 IPv4 옵션이 붙은 패킷을 prerouting 단계에서 차단하는 테이블을 만듭니다. AlmaLinux가 8, 9, 10에서 시험한 규칙이며, firewalld와 함께 사용할 수 있고 여러 번 실행해도 안전합니다.
sudo nft list table ip cve_2026_98432규칙이 들어갔는지 확인하며, 출력의 counter 값이 지금까지 차단한 패킷 수입니다.
sudo nft delete table ip cve_2026_98432고친 커널로 재부팅한 뒤에는 이 명령으로 테이블을 지웁니다.
이 규칙은 재부팅하면 사라지므로, 고친 커널을 넣기 전에 재부팅했다면 테이블을 만드는 명령을 다시 실행합니다.
IPv4 옵션에 기대는 애플리케이션이 있는 서버에는 이 규칙이 맞지 않습니다. IPv4 옵션에 실리는 CIPSO 보안 레이블(NetLabel)을 사용하는 네트워크가 그 예이며, 기본 설정에서는 사용하지 않습니다.
규칙은 호스트와, 호스트를 거쳐 트래픽을 받는 컨테이너(Podman과 Docker의 기본 방식)를 보호합니다. 같은 호스트의 컨테이너끼리 주고받는 트래픽은 이 규칙을 비켜 갈 수 있습니다.
Debian, Ubuntu, openSUSE에서는 AWS 안내의 iptables 규칙 한 줄을 사용합니다. AlmaLinux 9와 CentOS Stream 9 커널에는 이 규칙이 사용하는 u32 매치가 없어 위 nft 규칙으로 진행합니다.
sudo iptables -I INPUT 1 -p tcp -m u32 --u32 '0>>24&0x0f=6:15' -j DROPu32 식은 IPv4 헤더 길이 칸을 읽으며, 값이 5보다 크면 IPv4 옵션이 붙은 패킷입니다. 고친 커널을 넣은 뒤에는 아래 명령으로 이 규칙을 지웁니다.
sudo iptables -D INPUT -p tcp -m u32 --u32 '0>>24&0x0f=6:15' -j DROP라이트세일 방화벽에서 사용하지 않는 포트를 닫고 남은 포트를 믿을 수 있는 IP 주소로만 좁히는 것도 AWS 안내가 함께 권하는 방법입니다.
🔢 FAQ & 추천 콘텐츠
커널 버전
리눅스 커널 버전 확인 명령어 및 배포판 버전 확인 방법
리눅스에서 커널 버전은 uname 명령어로 확인할 수 있습니다.
ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.