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
このオプションは、脆弱性ステータスによってオーケストレーションジョブが失敗しないようにしながらレポートを収集する場合に便利です。
| オプション | 説明 |
|---|---|
--format text | 人間が読めるターミナル出力。デフォルトです。 |
--format json | JSON 形式の完全な構造化レポート。 |
--format markdown | 技術的な Markdown レポート。 |
--json | --format json のエイリアス。 |
--output PATH | レポートを標準出力ではなくファイルに書き込みます。 |
--mitigation-only | 生成された緩和策セクションのみを返します。 |
--no-package-query | ローカルのパッケージマネージャーの更新クエリをスキップします。 |
--no-exit-status | 出力生成後、常にステータス 0 で終了します。 |
-h, --help | コマンドのヘルプを表示します。 |
スキャナーは以下の順序で証拠を評価します。
スキャナーは以下を判定します:
環境検出により、パッケージおよび再起動データの解釈が変わります。
例えば、コンテナはホストのカーネルを確認できますが、通常はコンテナのファイルシステムからホストのカーネルパッケージを特定することはできません。
スキャナーは、実行中のカーネル設定を以下から探します:```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. アップストリームバージョンの比較
解析されたカーネルバージョンは、スキャナの固定ベースラインテーブルと比較されます。
バージョン比較は、以下の理由からヒューリスティックな結果を生成します: