
Linux 호스트가 CVE-2026-98432에 노출되어 있습니까?
Linux 호스트가 커널의 IPv4 TCP 핸드셰이크에서 발생하는 use-after-free인 CVE-2026-98432에 노출될 수 있는지 확인합니다. shouldipanic.ch의 일부입니다.
IPv4 옵션(Record Route, Timestamp)을 포함한 SYN이, 옵션이 이미 해제되었을 수 있는 이후에 해당 옵션을 읽는 코드에 도달합니다. 열려 있는 IPv4 TCP 포트 하나면 충분하며, 로그인이 필요하지 않습니다. 이는 4.4(2016) 이후 모든 커널에 존재하며, 각 트리의 수정 릴리스까지 이어집니다: 5.10.272, 5.15.223, 6.1.190, 6.6.159, 6.12.113, 6.18.56, 7.2.10, 7.3. 커널 CNA는 이를 9.8로 평가하며, MPTCP 리스너가 있는 서버를 대상으로 한 동작하는 원격 루트 익스플로잇이 보고되었습니다(공개되지는 않음). 수정 사항은 네트워크상에서 보이지 않습니다: 수정된 커널은 패치되지 않은 커널과 정확히 동일하게 응답합니다.
이는 각 모드가 말할 수 있는 내용을 규정합니다:
--on-host**는 머신 자체에서 실행 중인 커널을 읽습니다: 버전, 패키지 체인지로그, 그리고 재부팅을 기다리는 더 새로운 커널이 있는지 여부.Server 헤더에서 Linux 배포판을 읽고 해당 배포판이 아직 수정된 커널을 릴리스했는지 보여줍니다. 이는 강력한 힌트일 뿐 판정은 아닙니다: 리버스 프록시 뒤나 컨테이너 내부에서는 커널이 다른 머신에 속합니다.kernel98scan은 두 가지 형태로 제공됩니다:
kernel98scan.py: 의존성이 없는 단일 Python 파일입니다. 호스트에서 --on-host는 실제 판정을 제공하며, 주소를 지정하면 IP 범위에 걸쳐 배포판 핑거프린팅을 수행하고, 포트 스캔과 vhost 탐색을 함께 합니다.
curl -LO https://github.com/akaihigurashi/kernel98scan/releases/latest/download/kernel98scan.py
python3 kernel98scan.py --on-host # real verdict for THIS machine
Python 3.8 이상, 설치할 필요 없음. 예시:
python3 kernel98scan.py --on-host # read the running kernel
python3 kernel98scan.py 203.0.113.10 # outside: distribution + fix status
python3 kernel98scan.py 203.0.113.0/24 # a whole range from outside
python3 kernel98scan.py 203.0.113.10 --ip-options # + do IP-options packets get through?
python3 kernel98scan.py 203.0.113.10 -o out.csv # CSV output
python3 kernel98scan.py -h # all options
호스트에서 (--on-host, 종료 코드 2 / 1 / 0 / 3):
| 상태 | 의미 |
|---|---|
VULNERABLE | 실행 중인 커널에서 수정 사항을 보여주는 것이 없음 |
CHECK | 수정된 커널이 설치되어 있지만, 이전 커널이 여전히 실행 중임: 재부팅 필요 |
FIXED | 커널 변경 로그에 CVE가 명시되어 있거나, 일반 업스트림 커널이 수정된 버전임 |
벤더 커널(Ubuntu, RHEL, Proxmox)은 수정 사항을 이전 버전 번호에 백포트하므로,
이들에 대해서는 변경 로그만이 유효합니다. 또한 MPTCP가 켜져 있는지(보고된
익스플로잇은 MPTCP 리스너를 통해 이루어짐)와 tcp_migrate_req 여부도 보여줍니다.
외부에서:
| 상태 | 의미 |
|---|---|
POSSIBLY VULNERABLE | 배너에 Linux 배포판이 표시됨: 아직 수정된 커널이 없거나(Ubuntu, RHEL 및 현재의 리빌드) 수정된 커널이 있지만 설치 및 부팅이 필요함 |
UNKNOWN | 배포판이 보이지 않거나, 프록시/CDN이 응답함 |
NOT LINUX | Server 헤더가 비-Linux 호스트를 가리킴 |
VULNERABLE과 PATCHED는 외부에서 절대 보고되지 않습니다. 배포판별 수정
상태는 check.py의 표(FIX_STATUS, FIXED_TABLE)에 있으며,
각 벤더 릴리스에 맞춰 갱신됩니다.
| 옵션 | 기능 |
|---|---|
--on-host | 이 머신에서 실행 중인 커널을 읽고 실제 판정을 제공 |
--ip-options | SYN에 Record-Route IP 옵션을 실은 연결 하나 (아래 참조) |
-o FILE | 모든 결과를 CSV로도 기록 |
-a / -v | 숨겨진 결과 표시 / 증거 표시 |
-d | 디버그: 모든 요청, 헤더, 매치 |
-q | 배너 없음 (스크립트용) |
-V | 버전 출력 |
-h | 모든 옵션 |
--ip-options (옵트인, 명령줄 전용)일반 연결 하나와 SYN에 빈 Record-Route IP 옵션을 실은 연결 하나를 열고, 그러한
패킷이 호스트에 도달하는지(reach), 도중에 드롭되는지(filtered), 또는 포트가
닫혀 있는지(noport)를 보고합니다. 이것이 버그에 도달하는 패킷 형태이므로
기본적으로 꺼져 있으며 웹 페이지에서는 절대 실행되지 않습니다: 예를 들어
방화벽이 IP 옵션을 드롭하는지 확인하기 위해 자신의 호스트에서 사용하십시오.
단일 연결로는 버그가 필요로 하는 경쟁 조건을 이길 수 없으며, filtered 결과는
중간의 어떤 네트워크일 수도 있습니다.
nft add table ip cve98432
nft add chain ip cve98432 pre '{ type filter hook prerouting priority -300; }'
nft add rule ip cve98432 pre meta l4proto tcp ip hdrlength != 5 drop
sysctl -w net.mptcp.enabled=0 # if you don't need MPTCP
IPv4 옵션을 포함한 IPv4 TCP 패킷을 드롭합니다. 재부팅 후에도 유지되지 않으며, 수정된 커널을 대체하지 않습니다.
docker run -d --name kernel98scan --restart unless-stopped \
-p 127.0.0.1:8092:8092 \
-e PANIC_ORIGIN=https://kernel98scan.example.ch \
-v kernel98scan-data:/data \
ghcr.io/akaihigurashi/kernel98scan:latest
또는 Compose를 사용하는 경우: docker-compose.yml을 다운로드하고 PANIC_ORIGIN을 설정한 다음 docker compose up -d를 실행하세요. 컨테이너는 localhost에서만 수신하므로, 앞단에 TLS를 적용한 리버스 프록시를 배치하세요
(nginx 예시).
| 변수 | 기본값 | 용도 |
|---|---|---|
PANIC_ORIGIN | – | 공개 주소. 다른 오리진에서의 요청은 거부됩니다. 반드시 설정하세요. |
PANIC_OPERATOR / PANIC_CONTACT | – | 페이지 하단의 선택적 연락처 섹션 |
PANIC_IMPRINT_URL | – | 기존 임프린트로 연결되는 선택적 링크 |
PANIC_TRUSTED_PROXY | 127.0.0.1,::1 | X-Real-IP 헤더가 신뢰되는 프록시 |
PANIC_DENY_HOSTS / PANIC_DENY_IPS | – | 절대 검사하지 않을 도메인 / 주소 |
PANIC_AUDIT_DIR | /data/audit | 일별 감사 로그 파일 |
PANIC_RETENTION_DAYS | 30 | 이 기간보다 오래된 감사 파일은 삭제됨 |
이 페이지는 php2scan과 동일한 보호 기능을 갖추고 있습니다: 동의 체크박스, 감사 로그, VPN/Tor/데이터센터 클라이언트 거부, 속도 제한, 결과 캐시, 연결이 검사 대상 주소에 고정된 공개 호스트명만 허용, 절대 검사하지 않는 호스트 (잘 알려진 서비스, 가장 많이 방문한 상위 100개 사이트, 정부 사이트, 제재 대상 국가), 그리고 제재 대상 국가로부터의 접근 차단. 웹 페이지는 시작 페이지만 로드하며, IP 옵션을 전송하지 않습니다.
스캐너 엔진(가져오기, 핑거프린팅, 포트 스캔, vhost 탐색, 웹
서버)은 panic-core에 있습니다.
CVE-2026-98432에 특화된 모든 것은 check.py에 있습니다.
kernel98scan.py와 web.py는 둘 모두로부터 생성됩니다:
git clone https://github.com/akaihigurashi/panic-core ../panic-core
python3 ../panic-core/bundle.py check.py
GPL-3.0, LICENSE 참조. 폰트: Bricolage Grotesque, Instrument Sans 및 JetBrains Mono (SIL Open Font License).