CVE-2026-31694(LinuxカーネルのFUSE readdirキャッシュにおける領域外書き込み)向けのパッシブなLinuxホスト評価ツールです。
このスキャナは、実行中のカーネル、FUSEの露出状況、ローカルのパッケージメタデータ、カーネルソースの証跡、実行環境、OSファミリーを評価します。ホストが影響を受ける可能性がある場合、検出されたディストリビューションに合わせた緩和策ガイドを生成します。
作者: Aung Myat Thu [w01f]
cve_2026_31694_scanner.py は、ローカルで動作する非エクスプロイト型の脆弱性評価ユーティリティです。
影響を受けるFUSEコードパスを実行して脆弱性を確認するものではありません。代わりに、複数のパッシブ指標を組み合わせます。
CONFIG_FUSE_FS カーネル設定;/dev/fuse の存在と現在のユーザーのアクセス権;結果はエクスプロイトに基づく証明ではなく、曝露評価です。
CVE-2026-31694 は、LinuxカーネルのFUSE readdirキャッシュに影響を与えます。
脆弱なロジックは、サーバーが制御する名前長からディレクトリエントリのシリアライズ後のサイズを計算し、そのレコードを単一のページキャッシュページにコピーします。名前長が 4095 のディレクトリエントリは、シリアライズ後のサイズが 4120 バイトになる可能性があります。
4096 バイトのページを使用するシステムでは、そのレコードは1ページを 24 バイト超えます。
上流の修正では、キャッシュコピーが行われる前に、単一のページ内に収まらないディレクトリレコードを拒否します。
fs/fuse/readdir.c fuse_add_dirent_to_cache()
### スキャナのベースラインデータ
スキャナには、以下の上流の安定版修正ベースラインが含まれています:
| カーネルシリーズ | 修正済みベースライン |
|---|---:|
| 5.10 | 5.10.258 |
| 5.15 | 5.15.209 |
| 6.1 | 6.1.175 |
| 6.6 | 6.6.136 |
| 6.12 | 6.12.84 |
| 6.18 | 6.18.25 |
| 7.0 | 7.0.2 |
| Mainline | 7.1 以降 |
これらのバージョンは評価入力の 1 つとして使用されます。ディストリビューションベンダーが修正をバックポートしつつ、より古い上流バージョン番号を維持する場合があるため、これらは唯一の情報源とは見なされません。
---
## セキュリティモデル
スキャナは、脆弱な操作を呼び出さないように設計されています。
### スキャナが行わないこと
- FUSE ファイルシステムをマウントしません。
- `/dev/fuse` を開いたり通信したりしません。
- FUSE サーバを起動しません。
- 細工されたディレクトリレコードを送信しません。
- ページ配置テスト用のメモリを割り当てません。
- カーネルアロケータを操作しません。
- `/etc/passwd` を変更しません。
- カーネル設定を変更しません。
- カーネルモジュールをロードまたはアンロードしません。
- `/dev/fuse` のパーミッションを変更しません。
- パッケージをインストールまたは削除しません。
- システムを再起動しません。
- 権限昇格を試みません。
### スキャナが行う場合があること
- `/proc`、`/boot`、`/lib/modules`、`/usr/lib/modules`、`/usr/src` 配下のファイルやパッケージメタデータディレクトリを読み取ります。
- 制限付きの読み取り専用パッケージクエリを実行します。
- アクティブなマウントとファイルシステム登録を検査します。
- `--output` が明示的に指定された場合のみレポートを書き込みます。
- 管理者が確認するための緩和策コマンドを出力します。
緩和策コマンドはドキュメント出力です。自動的に実行されることはありません。
---
## 機能
### ホストとカーネルの識別
- `platform.release()` を読み取り、上流スタイルのカーネルバージョンを解析します。
- `/etc/os-release` または `/usr/lib/os-release` を読み取ります。
- CPU アーキテクチャとメモリページサイズを検出します。
- スキャン対象のカーネルが現在のオペレーティングシステムに属しているかどうかを識別します。
### FUSE エクスポージャ評価
- 利用可能なカーネル設定ソースから `CONFIG_FUSE_FS` を読み取ります。
- 組み込みの FUSE サポートとロード可能モジュール設定を検出します。
- `/proc/filesystems` を読み取ります。
- `/dev/fuse` のメタデータと現在のユーザーの読み取り/書き込みアクセスを確認します。
- `fusermount3` または `fusermount` を特定します。
- `/proc/self/mountinfo` からアクティブな FUSE マウントを解析します。
### パッチの証拠
- 実行中のバージョンを上流の修正済みベースラインと比較します。
- インストール済みのカーネルソース内で oversized-record ガードを検索します。
- ローカルの RPM または Debian パッケージのチェンジログで以下を確認します:
- `CVE-2026-31694`;
- 上流パッチのタイトル。
### パッケージと再起動状態
- 実行中のカーネルを所有するパッケージを特定しようとします。
- リポジトリを更新せずにローカルのパッケージマネージャメタデータを照会します。
- ホスト環境が信頼できる場合に、より新しいインストール済みカーネルを検出します。
- 該当する場合、`/var/run/reboot-required` を確認します。
### 環境認識
- Docker 互換コンテナを検出します。
- Podman 互換コンテナを検出します。
- コンテナ関連の cgroups を検出します。
- WSL を検出します。
- 利用可能な場合は `systemd-detect-virt` を使用して仮想マシンを検出します。
### レポート
- 人間が読み取れるテキスト出力。
- 機械可読な JSON 出力。
- Markdown レポート出力。
- 緩和策のみの出力。
- 任意のファイル出力。
- 意味のあるプロセス終了コード。
---
## 要件
### 必須
- カーネル評価のための Linux。
- Python 3.9 以降。
- 通常のシステムメタデータへの読み取りアクセス。
スキャナは Python 標準ライブラリのみを使用します。
### オプションのコマンド
次のツールが存在する場合、追加の証拠が収集されます:
| Tool | Purpose |
|---|---|
| `dpkg-query` | Debian/Ubuntu カーネルパッケージの所有者とチェンジログの発見 |
| `rpm` | Fedora/RHEL/SUSE パッケージの所有者とチェンジログの検査 |
| `pacman` | Arch 系カーネルパッケージと更新メタデータ |
| `apt` | Debian 系のキャッシュ済み更新クエリ |
| `dnf` or `dnf5` | Fedora/RHEL のキャッシュ済み更新クエリ |
| `zypper` | SUSE のキャッシュ済み CVE パッチクエリ |
| `apk` | Alpine のパッケージ/更新クエリ |
| `systemd-detect-virt` | コンテナと仮想マシンの検出 |
通常のスキャンには root 権限は必要ありません。
システム固有のファイルパーミッションにより、一部の証拠は非特権アカウントでは利用できない場合があります。
---
## インストール
スキャナを作業ディレクトリに配置します:```bash
chmod +x cve_2026_31694_scanner.py
直接実行:```bash ./cve_2026_31694_scanner.py
または Python で呼び出します:```bash
python3 cve_2026_31694_scanner.py
Pythonパッケージのインストールは不要です。
python3 cve_2026_31694_scanner.py
### JSON出力```bash
python3 cve_2026_31694_scanner.py --format json
以下の互換エイリアスも同じ形式を生成します:```bash python3 cve_2026_31694_scanner.py --json
### Markdown レポート```bash
python3 cve_2026_31694_scanner.py --format markdown
python3 cve_2026_31694_scanner.py
--format markdown
--output cve-2026-31694-report.md
### 修復ガイダンスのみを出力```bash
python3 cve_2026_31694_scanner.py --mitigation-only
python3 cve_2026_31694_scanner.py --no-package-query
### 報告後は常に成功を返す```bash
python3 cve_2026_31694_scanner.py --no-exit-status
このオプションは、脆弱性ステータスによってオーケストレーションジョブが失敗しないようにしながらレポートを収集する場合に便利です。
スキャナーは以下の順序で証拠を評価します。
スキャナーは以下を判定します:
環境検出により、パッケージおよび再起動データの解釈が変わります。
例えば、コンテナはホストのカーネルを確認できますが、通常はコンテナのファイルシステムからホストのカーネルパッケージを特定することはできません。
スキャナーは、実行中のカーネル設定を以下から探します:```text /proc/config.gz /boot/config-$(uname -r) /lib/modules/$(uname -r)/build/.config /usr/lib/modules/$(uname -r)/build/.config
以下を評価します:```text
CONFIG_FUSE_FS=y
CONFIG_FUSE_FS=m
CONFIG_FUSE_FS is not set
解釈:
| 値 | 意味 |
|---|---|
y | FUSE はカーネルに組み込まれています。モジュールのブラックリスト登録では無効化できません。 |
m | FUSE はロード可能なモジュールとして利用できます。 |
n | FUSE は検出された設定では無効になっています。 |
| unknown |
スキャナーは以下を確認します:```text /proc/filesystems /dev/fuse PATH for fusermount3 or fusermount /proc/self/mountinfo
`/dev/fuse` または `fusermount3` が存在しない場合、現在の環境からの即時的な利用可能性は低下しますが、カーネルがパッチ適用済みであることを証明するものではありません。
### 4. ページサイズの幾何学的性質
文書化された過大レコードは `4120` バイトです。
ホストのページサイズが少なくとも `4120` バイトである場合、文書化されたレコードはページ境界をまたぎません。スキャナは、文書化されたページ幾何学的性質によってシステムが露出していないと報告する場合があります。
この結論は、文書化されたレコードと評価された実装の動作にのみ適用されます。これは、より大きなページのシステムで FUSE のメモリ安全性の問題がすべて不可能であるという一般的な声明ではありません。
### 5. インストール済みソースの検査
インストール済みソースが利用可能な場合、スキャナは以下を検索します。```text
fs/fuse/readdir.c
影響を受ける関数と、reclen > PAGE_SIZE を拒否するのに相当するガードを探します。
直接のソース証拠は、バージョン比較よりも信頼性が高いです。
結果が信頼できるものとなるには、検査対象のソースが実行中のカーネルに対応している必要があります。/usr/src 配下のディストリビューションソースツリーは、インストールされている別のカーネルを表している可能性があります。
スキャナは、検出されたディストリビューションのパッケージデータベースを使用して、実行中のカーネルイメージをその所有者パッケージにマッピングしようとします。
考えられるメカニズムは次のとおりです:```text dpkg-query -S rpm -qf pacman -Qo apk info -W
パッケージが特定された場合、ローカルの変更ログメタデータを調べて、CVE ID またはパッチタイトルを確認できる場合があります。
変更ログの一致がないことは、脆弱性の証明にはなりません。ベンダーは、ローカルにインストールされた変更ログに個々の CVE 参照を常に含めるとは限らないためです。
### 7. アップストリームバージョンの比較
解析されたカーネルバージョンは、スキャナの固定ベースラインテーブルと比較されます。
バージョン比較は、以下の理由からヒューリスティックな結果を生成します:
- ベンダーカーネルにはバックポートが含まれる場合がある;
- カーネルパッケージのリリースリビジョンはディストリビューション固有である;
- クラウド、リアルタイム、ハードニング、およびハードウェアイネーブルメントカーネルには、それぞれ別のパッチタイムラインがある場合がある;
- バージョン文字列は、変更されていないアップストリームリリースではなく、ベンダーがメンテナンスするブランチを表す場合がある。
### 8. パッケージ更新メタデータ
サポートされている場合、スキャナは既存のローカルメタデータに対して読み取り専用クエリを実行します。
リポジトリは更新されません。
例:```text
apt list --upgradable
pacman -Qu
dnf --cacheonly --quiet check-upgrade
zypper --no-refresh list-patches --all --cve=CVE-2026-31694
apk version -l <
通常のホストまたは仮想マシンでは、スキャナは実行中のカーネルを検出されたインストール済みカーネルと比較し、Debian系システムで使用される再起動マーカーを確認します。
コンテナまたはWSLゲスト内では、このチェックはゲストファイルとホストカーネルを比較する代わりに、ホスト管理としてマークされます。
エビデンスの優先順位はおおよそ次のとおりです。
PATCHED直接的なローカルエビデンスが修正の存在を示しています。
例:
信頼度は通常高いですが、ソースと実行中カーネルの整合性は依然として検証する必要があります。
NOT_EXPOSED検出された実行中カーネルの構成ではFUSEが無効になっています。
これは露出の結果であり、カーネルソース自体に修正が含まれているというエビデンスではありません。
NOT_EXPOSED_BY_DOCUMENTED_PAGE_GEOMETRYメモリページサイズが、文書化された4120バイトのレコードをページ境界を越えずに収めるのに十分な大きさです。
この判定は文書化された脆弱性のジオメトリに限定されます。
UPSTREAM_BASELINE_SAFE解析された実行中バージョンは、既知の修正済みアップストリームベースラインを満たしているか、影響を受ける実装より前のものです。
ベンダーパッケージの検証が依然として推奨されます。
POTENTIALLY_VULNERABLE解析されたカーネルは影響を受けるアップストリームの範囲内にあり、直接的なローカルパッチのエビデンスは見つかりませんでした。
この結果は、インストール済みカーネルを脆弱と宣言する前に、オペレーティングシステムベンダーのアドバイザリを確認する必要があることを意味します。
INCONCLUSIVEスキャナは十分なエビデンスを取得できませんでした。
一般的な原因:
NOT_APPLICABLE現在のオペレーティングシステムはLinuxではありません。
| コード | 意味 |
|---|---|
0 | パッチ済みのエビデンス、安全なアップストリームベースライン、または文書化された露出なし |
1 | 潜在的に脆弱 |
例:```bash python3 cve_2026_31694_scanner.py status=$?
case "$status" in 0) echo "No actionable exposure detected by the scanner" ;; 1) echo "Potential exposure detected" ;; 2) echo "Assessment inconclusive" ;; 3) echo "Scanner execution failed" ;; esac
When `--no-exit-status` is specified, the scanner returns `0` after producing the report.
---
## 検出ソース
スキャナは、利用可能な場合に以下のローカルソースを使用します:
| ソース | 情報 |
|---|---|
| `/etc/os-release` | ディストリビューションの識別情報 |
| `/usr/lib/os-release` | ディストリビューション識別情報のフォールバック |
| `/proc/version` | カーネルおよび WSL の指標 |
| `/proc/config.gz` | 実行中カーネルの構成 |
| `/boot/config-*` | カーネル構成 |
| `/lib/modules/*/build/.config` | カーネルビルド構成 |
| `/proc/filesystems` | 登録済みファイルシステム |
| `/proc/self/mountinfo` | アクティブな FUSE マウント |
| `/proc/1/cgroup` | コンテナの指標 |
| `/dev/fuse` | デバイスの存在と権限 |
| `/usr/src/*/fs/fuse/readdir.c` | 任意のソースレベルパッチの証拠 |
| `/lib/modules` | インストール済みカーネルの一覧 |
| `/usr/lib/modules` | インストール済みカーネルの一覧 |
| `/boot/vmlinuz-*` | インストール済みカーネルの一覧 |
| `/var/run/reboot-required` | Debian 系の再起動が必要なことを示す指標 |
| package database | カーネルパッケージの所有情報 |
| package changelogs | 任意のローカルバックポートの証拠 |
| package cache | 任意の更新利用可能性の証拠 |
---
## ディストリビューションのサポート
### ディストリビューションファミリーの検出
| ファミリー | 認識されるディストリビューション |
|---|---|
| Ubuntu | Ubuntu, Linux Mint, Pop!_OS, elementary OS, Zorin OS |
| Debian | Debian, Kali Linux, Raspbian, Parrot OS |
| Arch | Arch Linux, Manjaro, Garuda Linux, EndeavourOS, CachyOS |
| Fedora | Fedora Linux |
| RHEL | RHEL, CentOS, Rocky Linux, AlmaLinux, Oracle Linux, Amazon Linux |
| SUSE | openSUSE Tumbleweed, openSUSE Leap, SLES, SLED |
| Alpine | Alpine Linux |
| Gentoo | Gentoo Linux |
| Void | Void Linux |
| NixOS | NixOS |
| 不明 | 一般的な Linux 向けガイダンス |
### ローカル更新クエリのサポート
| ファミリー | 読み取り専用の更新クエリ |
|---|---|
| Debian/Ubuntu | `apt list --upgradable` |
| Arch | `pacman -Qu` |
| Fedora/RHEL | キャッシュされた `dnf check-upgrade` |
| SUSE | `zypper` によるキャッシュされた CVE パッチ一覧 |
| Alpine | `apk version -l <` |
| Gentoo | 未実装 |
| Void | 未実装 |
| NixOS | 未実装 |
| 不明 | 未実装 |
ローカルで更新が見つからないからといって、修正済みパッケージが利用できないわけではありません。リポジトリのメタデータが古いか、ディストリビューションがまだパッケージを公開していない可能性があります。
---
## 緩和策の生成
緩和策のガイダンスは以下に基づいて選択されます:
- ディストリビューションファミリー;
- パッケージマネージャー;
- コンテナまたは WSL の状態;
- FUSE 構成;
- `/dev/fuse` の利用可否;
- アクティブな FUSE マウント;
- 再起動状態;
- 最終判定。
スキャナはコマンドを表示するだけで、実行することはありません。
### Debian および Ubuntu ファミリー
一般的に生成される一連のコマンド:```bash
sudo apt update
sudo apt full-upgrade
sudo reboot
承認する前に、提案されたパッケージトランザクションを確認してください。
再起動後:```bash uname -r python3 cve_2026_31694_scanner.py
### Arch および Manjaro 系
典型的な生成シーケンス:```bash
sudo pacman -Syu
sudo reboot
Arch 系システムは完全なシステムアップグレードが必要です。pacman -Sy でパッケージデータベースを更新してから、アップグレードを完了せずに選択したパッケージをインストールしないでください。
通常生成されるシーケンス:```bash sudo dnf upgrade --refresh sudo systemctl reboot
`yum` を使用するシステムでは、対応する `yum` コマンドが提供される場合があります。
### SUSE ファミリー
典型的な生成シーケンス:```bash
sudo zypper refresh
sudo zypper patch --cve=CVE-2026-31694
sudo zypper patch --category security
sudo systemctl reboot
CVE固有のパッチは、すべてのSUSE製品またはリポジトリ状態で個別のトランザクションとして利用できるとは限りません。
典型的な生成シーケンス:```bash doas apk update doas apk upgrade doas reboot
権限プレフィックスは、スキャナーが `sudo`、`doas`、または既にrootのセッションのいずれを検出するかによって異なります。
### Gentoo Linux
典型的に生成されるシーケンス:```bash
sudo emaint sync -a
sudo emerge --ask --update --deep --newuse @world
カーネルのインストールと有効化は、ホストの設定済みGentooカーネルワークフローに依存します。
典型的な生成シーケンス:```bash sudo xbps-install -Suv sudo reboot
### NixOS
典型的な生成シーケンス:```bash
sudo nixos-rebuild switch --upgrade
sudo systemctl reboot
パッチをすぐに適用できない場合、スキャナは一時的な制御を提案することがあります。
推奨される可能性のある対策は次のとおりです。
/dev/fuseを制限する;/dev/fuseを削除する;CAP_SYS_ADMINを削除する;--privilegedコンテナを避ける.これらの制御は、次のような正規のワークロードを妨げる可能性があります。
一時的な制限は、ベンダーが修正したカーネルのインストールを置き換えてはなりません。
コンテナは通常、ホストカーネルを共有します。
コンテナ内で実行されるスキャナは、以下を検出する可能性があります。
/dev/fuseがない.このため、スキャナはホスト依存の証拠を非権威のものとしてマークし、緩和策をコンテナホストに指示します。
権威あるパッケージと再起動の評価を行うには、ホスト上でスキャナを直接実行してください。
コンテナの堅牢化ガイドラインには、次の削除が含まれます。```text --device /dev/fuse --cap-add SYS_ADMIN --privileged
同等のCompose設定も確認する必要があります:```yaml
devices:
- /dev/fuse:/dev/fuse
cap_add:
- SYS_ADMIN
privileged: true
Let's proceed with translating the chunk. We have a small piece of Markdown content from a Kitploit tool README chunk. The source language is en, target is ja. Rules: translate only natural language, preserve Markdown structure exactly, no preamble etc.
Input chunk:
### WSL
The WSL kernel is managed by Windows rather than the Linux guest distribution's kernel package.
Typical generated guidance:
Let's parse it. It's a heading level 3 "WSL" (a technical term, should remain untranslated), followed by a paragraph, followed by a line "Typical generated guidance:" which is also natural language, ends with a colon. The line after "Typical generated guidance:" is presumably where a code block or list would follow in the original, but in this chunk there's no more content. We shouldn't add ellipsis or anything. Just translate the natural language text.
Translate:
"The WSL kernel is managed by Windows rather than the Linux guest distribution's kernel package." → "WSL カーネルは、Linux ゲストディストリビューションのカーネルパッケージではなく、Windows によって管理されます。" or more natural: "WSL カーネルは Windows によって管理され、Linux ゲストディストリビューションのカーネルパッケージによって管理されるわけではありません。" Let's keep concise and idiomatic. Something like "WSL カーネルは、Linux ゲストディストリビューションのカーネルパッケージではなく、Windows によって管理されます。"
"Typical generated guidance:" → "典型的に生成されるガイダンス:" or "典型的な生成ガイダンス:" Hmm. "Typical generated guidance" – guidance generated typically. I'd say "典型的に生成されるガイダンス:" since it's a label before a sample output.
Note heading "### WSL" – keep "WSL" untranslated. "### WSL" stays as is.
Preserve blank line between heading and paragraph? In source: there's a blank line after "### WSL", then paragraph, then blank line, then "Typical generated guidance:". Actually input shows:
### WSL
The WSL kernel is managed by Windows rather than the Linux guest distribution's kernel package.
Typical generated guidance:
There's a blank line after the heading, and after the paragraph, then the line "Typical generated guidance:" and then presumably EOF (chunk ends). No trailing blank line specified after that? The blank line is between paragraph and "Typical...". Preserve exactly.
So output:
### WSL
WSL カーネルは、Linux ゲストディストリビューションのカーネルパッケージではなく、Windows によって管理されます。
典型的に生成されるガイダンス:
Need to make sure not to add anything else. Just return this.
Double-check punctuation: The original sentence ends with a period. We keep a period. The "Typical generated guidance:" keeps colon, Japanese full-width colon? The source has ":" ASCII colon. Should we preserve punctuation exactly? Rule says preserve all Markdown syntax exactly; punctuation that doesn't change code. Natural language translation can adjust punctuation for idiomatic Japanese. Using ":" vs ":" – probably keep ASCII colon to match structure. Let's use "典型的に生成されるガイダンス:" with ASCII colon.
Ensure no leading/trailing whitespace changes. The output should start with the heading.### WSL
WSL カーネルは、Linux ゲストディストリビューションのカーネルパッケージではなく、Windows によって管理されます。
典型的に生成されるガイダンス:```powershell wsl --update wsl --shutdown
これらのコマンドをWindows PowerShellから実行し、ディストリビューションを再起動して、スキャナーを再実行してください。
`apt`、`dnf`、または別のLinuxパッケージマネージャーでゲストパッケージのみを更新しても、WSLカーネルは置き換えられません。
### 仮想マシン
仮想マシンは通常、ゲストカーネルを所有しています。ディストリビューション固有のパッケージおよび再起動チェックは、ゲスト内で引き続き適用されます。
ハイパーバイザーホストは別途評価する必要があります。
---
## レポート形式
### テキスト
テキスト出力は、直接ターミナルで使用することを目的としています。```bash
python3 cve_2026_31694_scanner.py --format text
レポートには以下が含まれます:
JSON出力には、完全なdataclassベースのレポートが含まれます。```bash
python3 cve_2026_31694_scanner.py
--format json
--output report.json
フィールド選択の例:```bash
python3 cve_2026_31694_scanner.py --format json --no-exit-status |
python3 -c '
import json
import sys
report = json.load(sys.stdin)
print(report["hostname"])
print(report["verdict"])
print(report["confidence"])
print(report["kernel_release"])
'
Markdown 出力は、技術記録、チケット、および評価レポートに適しています。```bash
python3 cve_2026_31694_scanner.py
--format markdown
--output report.md
### 緩和策のみのレポート```bash
python3 cve_2026_31694_scanner.py \
--mitigation-only \
--format markdown
JSON形式の場合、mitigation-onlyモードは完全なホストレポートではなく、mitigationオブジェクトを返します。
#!/usr/bin/env bash
set -u
report="cve-2026-31694-$(hostname)-$(date +%Y%m%d-%H%M%S).json"
python3 cve_2026_31694_scanner.py
--format json
--output "$report"
status=$?
case "$status" in 0) echo "Assessment completed without a potential-vulnerability verdict" ;; 1) echo "Potential CVE-2026-31694 exposure detected: $report" >&2 ;; 2) echo "Assessment inconclusive: $report" >&2 ;; *) echo "Scanner failure: $report" >&2 ;; esac
exit "$status"
### ジョブを失敗させずにレポートを収集```bash
python3 cve_2026_31694_scanner.py \
--format json \
--output /var/tmp/cve-2026-31694.json \
--no-exit-status
30 3 * * * /usr/bin/python3 /opt/security/cve_2026_31694_scanner.py --format json --output /var/log/cve-2026-31694.json --no-exit-status
これは同じレポートファイルを上書きします。履歴レポートが必要な場合は、ラッパースクリプトを使用してください。
### Systemdサービスの例```ini
[Unit]
Description=Passive CVE-2026-31694 assessment
After=local-fs.target
[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /opt/security/cve_2026_31694_scanner.py --format json --output /var/log/cve-2026-31694.json --no-exit-status
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/log
スキャナーはカーネルとパッケージのメタデータへの読み取りアクセスが必要です。追加のサンドボックス制限により、証拠が隠され、結論が出ないレポートが生成される可能性があります。
フリート評価の場合:
コンテナイメージのビルドからのスキャンをホストカーネルの評価として扱わないこと。
POTENTIALLY_VULNERABLE への推奨対応実行中の正確なカーネルを特定する: ```bash uname -r
インストールされているディストリビューションとリリースを特定します: ```bash cat /etc/os-release
ディストリビューションベンダーのCVEステータスを、正確なカーネルパッケージとフレーバーについて確認します。
パッケージメタデータを更新します。
ベンダーがサポートする修正済みカーネルパッケージをインストールします。
ホストを再起動します。
実行中のカーネルが変更されたことを確認します: ```bash uname -r
スキャナーを再実行します。
INCONCLUSIVE に対する推奨対応不足している証拠を収集します:```bash uname -a getconf PAGE_SIZE cat /etc/os-release grep CONFIG_FUSE_FS /boot/config-"$(uname -r)" 2>/dev/null cat /proc/filesystems ls -l /dev/fuse 2>/dev/null findmnt -t fuse,fuseblk,fusectl
Then verify the exact kernel package against the vendor advisory.
### 再起動の検証
修正されたカーネルパッケージをインストールしても、現在実行中のカーネルは変更されません。
インストール済みカーネルと実行中カーネルの両方を検証し、必要に応じて再起動してください。
例:```bash
uname -r
ls -1 /lib/modules
Debian系システムでは、以下も提供される場合があります:```bash test -e /var/run/reboot-required && cat /var/run/reboot-required
### FUSE 依存関係のレビュー
FUSE を一時的にアンロードまたはブロックする前に:```bash
findmnt -t fuse,fuseblk,fusectl
lsmod | grep '^fuse'
ps aux | grep -E '[f]usermount|[s]shfs|[r]clone'
アクティブなFUSEファイルシステムがマウントされている間は、モジュールをアンロードしないでください。
スキャナは意図的に脆弱なコードパスをトリガーしません。
POTENTIALLY_VULNERABLE の判定は、利用可能なパッシブな証拠が曝露と整合していることを意味します。これはエクスプロイトが成功するという証明ではありません。
ディストリビューションのカーネルは、セキュリティ修正をバックポートすることがよくあります。
古く見えるアップストリームのバージョンでも、パッチが適用されている場合があります。
ベンダーのアドバイザリと正確なパッケージリリースが、ディストリビューション管理のカーネルにとっては信頼できる情報源です。
/usr/src 以下にあるソースツリーは、実行中のカーネルと一致しない場合があります。
ソースパッチの証拠は、以下に対して検証する必要があります:```bash uname -r
および、その正確なカーネルに使用されたソースパッケージまたはビルドディレクトリ。
### 古いパッケージメタデータ
スキャナーはリポジトリを更新しません。
パッケージ更新の確認は、既存のローカルキャッシュの状態に依存します。
最新のパッケージ決定を行うには、生成されたディストリビューション固有の更新およびアップグレードコマンドを使用してください。
### コンテナ
コンテナはホストのカーネルを参照しますが、通常は異なるパッケージメタデータを持ちます。
スキャナーはホスト上で実行してください。
### WSL
Linuxゲストのパッケージ状態は、WSLカーネルのパッチ状態を決定しません。
WSLはWindows側から更新してください。
### カスタムカーネル
カスタム、組み込み、アプライアンス、ベンダー、および自己ビルドのカーネルには、パッケージメタデータや認識可能なバージョン文字列がない場合があります。
実際のソースコミットまたはベンダーのリリースノートを確認してください。
### ライブパッチ
スキャナーは、ライブパッチフレームワークが実行中のカーネルにこの特定の修正を適用したかどうかを判定しません。
ライブパッチベンダーのステータスツールとアドバイザリデータを使用してください。
### セキュアブートとブートローダーの状態
スキャナーは以下を検証しません:
- ブートローダーが次にどのカーネルを選択するか;
- セキュアブートがインストールされたイメージを受け入れるかどうか;
- 新しいinitramfsが正しく生成されたかどうか;
- マシンが期待どおりのカーネルで正常に再起動したかどうか。
### 分散ファイルシステムと名前空間
スキャナーは現在のプロセス名前空間を評価します。
名前空間によって隠されたマウントやデバイスアクセスは、レポートに表示されない場合があります。
---
## トラブルシューティング
### `Kernel configuration could not be determined`
次のファイルのいずれかが存在するか確認してください:```bash
ls -l /proc/config.gz
ls -l /boot/config-"$(uname -r)"
ls -l /lib/modules/"$(uname -r)"/build/.config
一部のディストリビューションでは、実行中の設定が /proc/config.gz を通じて公開されていません。
Running kernel package could not be identified考えられる原因:
確認:```bash uname -r ls -l /boot ls -l /lib/modules/"$(uname -r)"
### パッケージ更新クエリが更新なしと報告する
生成された緩和ガイドを使用してパッケージメタデータを更新し、スキャナーを再実行してください。
パッシブスキャナーはリポジトリを自動的に更新しません。
### 更新インストール後の `POTENTIALLY_VULNERABLE`
新しいカーネルが実行されていることを確認してください:```bash
uname -r
インストール済みカーネルディレクトリと比較してください:```bash ls -1 /lib/modules
再起動が必要な場合があります。
また、修正されたバックポートがアップストリームのバージョン基準と一致しない可能性があるため、ベンダーのアドバイザリも確認してください。
### FUSE はカーネルに組み込まれている
レポートに次のように表示される場合:```text
CONFIG_FUSE_FS=y
modprobe -r fuse およびモジュールのブラックリスト登録では、FUSE を無効化できません。
パッチ適用済みカーネル、または FUSE サポートなしでビルドされたカーネルを使用してください。
スキャナーには以下への読み取りアクセスが必要な場合があります:```text /proc /boot /lib/modules /usr/lib/modules /usr/src package database directories package cache directories
これらのパスが読み取り可能なままとなるように、サービスのハードニングを調整します。
---
## ファイルレイアウト
推奨プロジェクトレイアウト:```text
cve-2026-31694-scanner/
├── README.md
└── cve_2026_31694_scanner.py
推奨インストールレイアウト:```text /opt/security/cve-2026-31694/ ├── README.md └── cve_2026_31694_scanner.py
例:```bash
sudo install -d -m 0755 /opt/security/cve-2026-31694
sudo install -m 0755 \
cve_2026_31694_scanner.py \
/opt/security/cve-2026-31694/
sudo install -m 0644 \
README.md \
/opt/security/cve-2026-31694/
Aung Myat Thu [w01f]
| オプション | 説明 |
|---|
--format text | 人間が読めるターミナル出力。デフォルトです。 |
--format json | JSON 形式の完全な構造化レポート。 |
--format markdown | 技術的な Markdown レポート。 |
--json | --format json のエイリアス。 |
--output PATH | レポートを標準出力ではなくファイルに書き込みます。 |
--mitigation-only | 生成された緩和策セクションのみを返します。 |
--no-package-query | ローカルのパッケージマネージャーの更新クエリをスキップします。 |
--no-exit-status | 出力生成後、常にステータス 0 で終了します。 |
-h, --help | コマンドのヘルプを表示します。 |
| 読み取り可能な設定ソースがありませんでした。 |
2| 結論が出ない |
3 | スキャナまたはレポート生成エラー |