Linux ホストが CVE-2026-98432 に晒されている可能性があるかどうかをチェックします。これはカーネルの IPv4 TCP ハンドシェイクにおける use-after-free です。shouldipanic.ch の一部です。
IPv4 オプション(Record Route、Timestamp)を含む SYN が、すでに解放された可能性のあるオプションを読み取るコードに到達します。開いている IPv4 TCP ポートが1つあれば十分で、ログインは不要です。これは 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 リスナーを持つサーバーに対する動作するリモート root エクスプロイトが報告されています(未公開)。修正はネットワーク上では見えません: 修正済みカーネルは未パッチのものとまったく同じように応答します。
このことが各モードで言える内容を形作っています:
--on-host はマシン自体で実行中のカーネルを読み取ります: そのバージョン、パッケージの changelog、そして新しいカーネルが再起動を待っているかどうか。Server ヘッダーから Linux ディストリビューションを読み取り、そのディストリビューションが修正済みカーネルをまだリリースしているかどうかを表示します。これは強いヒントであり、判定ではありません: リバースプロキシの背後やコンテナ内では、カーネルは別のマシンのものです。kernel98scan には2つの形態があります:
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 | カーネルの changelog に CVE が記載されている、または素のアップストリームカーネルが修正バージョンである |
ベンダーカーネル(Ubuntu、RHEL、Proxmox)は修正を古いバージョン番号にバックポートするため、
それらについては changelog のみが判断材料となります。また、MPTCP が有効かどうか(報告された
exploit は 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 オプションを載せた接続を 1 つ行う(下記参照) |
-o FILE | すべての結果を CSV にも書き出す |
-a / -v | 非表示の結果を表示 / 根拠を表示 |
-d | デバッグ:すべてのリクエスト、ヘッダー、マッチを表示 |
-q | バナーなし(スクリプト向け) |
-V | バージョンを表示 |
-h | すべてのオプションを表示 |
--ip-options(オプトイン、コマンドラインのみ)通常の接続を 1 つと、SYN に空の Record-Route IP オプションを載せた接続を 1 つ開き、そのような
パケットがホストに到達するか(reach)、途中で破棄されるか(filtered)、ポートが閉じているか
(noport)を報告します。これはバグに到達するためのパケット形状であるため、デフォルトでは
オフで、Web ページ上では決して実行されません。自分のホストで使用し、たとえばファイアウォールが
IP オプションを破棄することを確認するのに使ってください。単一の connect ではバグに必要な
レースに勝つことはできず、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 TCPパケットでIPオプションを含むものをドロップします。再起動後は永続化されず、修正済みカーネルの代替にはなりません。
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サイト、政府サイト、制裁対象国)、および制裁対象国からのアクセス不可。Web ページはスタートページのみを読み込み、IP オプションを送信することは決してありません。
スキャナーエンジン(フェッチ、フィンガープリンティング、ポートスキャン、vhost 検出、Web サーバー)は 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)。