
Debian/Ubuntu 커널의 CVE-2026-98432 취약점을 감사하고 지속적인 nftables 및 sysctl 완화 조치를 적용한 후, 커널 업그레이드 및 롤백을 안내합니다.
스크립트는 커널이 CVE-2026-98432(IPv4 TCP 처리의 use-after-free, CVSS 9.8)에서 수정되었는지 확인합니다. 커널이 수정되지 않은 경우 즉시 임시 보호를 활성화하고 커널 업데이트 설치를 돕습니다.
보호는 위험을 줄이지만 취약점을 제거하지는 않습니다. 완전한 해결책은 하나뿐입니다: 수정된 커널을 설치하고 재부팅하는 것입니다. Red Hat의 평가에 따르면 IP 옵션이 포함된 패킷 필터링이 익스플로잇을 완전히 배제하지는 못합니다.
tcp_v4_syn_recv_sock()은 ireq_opt를 복사하지 않고 자식 소켓에 전달하며, inet_sock_destruct()는 이를 일반 kfree()로 해제합니다. 이 시점에 다른 CPU 코어에서 처리 중인 반복 SYN은 ip_options_build()에서 이미 해제된 메모리에 접근합니다.net.ipv4.tcp_migrate_req=1 또는 BPF 프로그램 BPF_SK_REUSEPORT_SELECT_OR_MIGRATE.ipv4: free inet_opt and ireq_opt after an RCU grace period (e3f33b0a1d89).| stable 브랜치 | 수정된 버전 |
|---|---|
| 5.10 | 5.10.272 |
| 5.15 | 5.15.223 |
| 6.1 | 6.1.190 |
| 6.6 | 6.6.159 |
| 6.12 | 6.12.113 |
| 6.18 | 6.18.56 |
| 7.2 | 7.2.10 |
| mainline | 7.3 |
2026년 11월 2일 기준 배포판 상태:
linux 6.1.190-1(DLA-4841-1) 및 linux-6.12 6.12.113-1~deb12u1(DLA-4850-1)에서 수정됨.linux 6.12.113-1(DSA-6568-1)에서 수정됨.prerouting 훅에서 raw 우선순위(−300)로, 즉 커널이 옵션을 파싱하기 전에 IP 옵션이 있는(IHL > 5) 수신 IPv4 TCP 패킷을 폐기합니다. nftables를 사용하며, 사용할 수 없는 경우 u32 모듈이 있는 iptables를 사용합니다.net.mptcp.enabled = 0으로 설정합니다. 이미 열려 있는 MPTCP 소켓은 이때에도 MPTCP로 유지되므로, 스크립트는 해당 서비스를 재시작할 수 있도록 이들을 나열합니다.net.ipv4.tcp_migrate_req = 0으로 설정합니다.nftables / netfilter-persistent / firewalld 재부팅 후 재적용, 그리고 5분마다 타이머로 확인.실행 중인 커널이 이미 수정되었다면 스크립트는 아무것도 변경하지 않으며 이전에 활성화한 보호를 해제하는 방법을 안내합니다.
nftables(권장) 또는 iptables. 영구 보호에는 systemd가 필요합니다.git clone https://github.com/IgrekLg/cve-2026-98432-mitigation.git
cd cve-2026-98432-mitigation
sudo bash mitigate-cve-2026-98432.sh # аудит, защита, предложение обновить ядро
sudo bash mitigate-cve-2026-98432.sh --status # только посмотреть, ничего не меняя
| 키 | 동작 |
|---|---|
--status | 상태만 표시 |
--uninstall | 보호를 해제하고 원래 sysctl 값으로 복원 (커널이 패치되지 않은 경우 확인을 요청) |
-y, --yes | 질문 없이: 커널 업데이트 설치, --uninstall 확인 |
--no-upgrade | apt에 접근하지 않음: 감사 및 보호만 수행 |
--force | 커널이 이미 패치되었더라도 보호 활성화 |
--keep-mptcp | MPTCP를 비활성화하지 않음 |
--keep-tcp-migrate | net.ipv4.tcp_migrate_req를 건드리지 않음 |
터미널이 없고(Ansible, cron, -t 없는 ssh) --yes가 지정되지 않은 경우에도 보호는 활성화되며, 커널 설치 단계는 안내 메시지와 함께 건너뜁니다.
| 코드 | 의미 |
|---|---|
| 0 | 실행 중인 커널이 패치되었거나 영향을 받지 않음 |
| 3 | 커널이 패치되지 않았고 보호가 활성 상태: 업데이트와 재부팅 필요 |
| 4 | 커널이 패치되지 않았고 보호가 비활성 상태 |
| 1 | 오류 |
| 2 | 잘못된 인수 |
Ansible 예시:
- name: CVE-2026-98432 mitigation
ansible.builtin.script: mitigate-cve-2026-98432.sh --yes
register: cve
failed_when: cve.rc not in [0, 3]
changed_when: false
검사는 다음 순서로 진행됩니다:
CVE-2026-98432 또는 수정 커밋의 제목이 언급되어 있으면 커널은 수정된 것입니다.6.1.190-1 형태의 버전을 사용하는 Debian 및 파생 배포판. 버전의 업스트림 부분을 위 표와 비교합니다. Debian은 stable 업데이트를 통해 수정 사항을 받으며, changelog에 CVE 번호가 항상 명시되는 것은 아닙니다.5.15.0-NNN)는 stable 브랜치를 반영하지 않으므로, changelog로만 커널이 수정된 것으로 간주합니다. changelog가 없으면 상태는 "수정 확인되지 않음"이 되며 보호가 활성화됩니다. 추가로 pro fix CVE-2026-98432 --dry-run이 출력됩니다.uname -r의 버전을 비교합니다. 후보 커널(-rc)은 알 수 없는 것으로 간주합니다.수정된 버전 표는 스크립트에 내장되어 있습니다(FIXED_IN, 2026-11-02 기준 데이터). 자체 커널을 사용하는 파생 배포판(Proxmox 등)의 경우 벤더 공지를 확인하십시오.
| 경로 | 용도 |
|---|---|
/usr/local/sbin/cve-2026-98432-fw | 도우미: apply / ensure / remove / check |
/etc/cve-2026-98432/mitigation.nft | nftables 규칙 (테이블 ip cve_2026_98432) |
/etc/systemd/system/cve-2026-98432-mitigation.service | 부팅 시 network-pre.target 이전에 규칙 적용 |
/etc/systemd/system/cve-2026-98432-mitigation-check.{service,timer} | 5분마다 검사하여 누군가 규칙을 삭제한 경우 복원 (syslog에 기록) |
/etc/systemd/system/{nftables,netfilter-persistent,firewalld}.service.d/50-cve-2026-98432.conf | 해당 서비스가 규칙을 (재)로드한 후 다시 적용; 설치된 서비스에 대해서만 생성됨 |
/etc/sysctl.d/99-zz-cve-2026-98432.conf | sysctl; /etc/sysctl.conf 이후에 파일이 읽히도록 이름이 선택됨 |
/var/lib/cve-2026-98432/sysctl.orig | --uninstall을 위한 원래 sysctl 값 |
이전 버전 스크립트의 파일(mitigate-CVE-2026-98432.service, 99-CVE-2026-98432.conf 및 중복된 iptables 규칙)은 자동으로 삭제됩니다.
tcp_v6_syn_recv_sock()는 옵션을 복사합니다.BPF_SK_REUSEPORT_SELECT_OR_MIGRATE 프로그램을 탐지할 수 없으므로 수동으로 확인하십시오.systemctl stop nftables(또는 서비스 외부에서의 모든 nft flush ruleset) 이후 규칙은 즉시가 아니라 타이머에 따라 5분 이내에 복원됩니다.GODEBUG=multipathtcp=0을 설정할 수 있습니다. Go 보안팀은 프로그램별 MPTCP 비활성화를 신뢰할 수 없는 조치라고 밝히고 있습니다.수정된 커널로 재부팅한 후:
sudo bash mitigate-cve-2026-98432.sh --uninstall
# логика определения версий, без изменений в системе
bash tests/test-logic.sh
# фильтр в изолированном сетевом пространстве имён (хост не затрагивается):
# ожидается plain=ok options=blocked при включённом правиле
sudo unshare -n sh -c 'python3 tests/netns-probe.py up && nft -f /etc/cve-2026-98432/mitigation.nft && python3 tests/netns-probe.py probe'