
CISAが指定したアクティブなLinuxカーネルCVE(CVE-2025-39964、CVE-2026-53266、CVE-2025-39682)を、モダンeBPF、モジュール無効化、containerdユーザー名前空間によって無効化する。
サイバーセキュリティ・インフラストラクチャ・セキュリティ庁(CISA)が重大なLinuxカーネル脆弱性を**Known Exploited Vulnerabilities(KEV)**カタログに追加すると、インフラチームとSREリードにとって緊急の運用上の時計が動き始めます:
アップストリームパッチのギャップ:
ゼロデイが実際に悪用可能となってから、エンタープライズディストリビューション(Ubuntu HWE、Debian、RHEL)からテスト済みの署名付きバイナリカーネルパッケージが利用可能になるまでの期間は、通常7〜21日に及びます。
本番のKubernetesクラスタでは、ベンダーパッケージをただ待つことはシステムを能動的な悪用に晒すことになり、時期尚早なカーネルアップグレードや緊急再起動は運用停止のリスクを伴います。
このケーススタディでは、ホストの再起動を必要とせずに、3つの同時進行するLinuxカーネル脆弱性(CVE-2025-39964、CVE-2026-53266、CVE-2025-39682)をユーザー空間、カーネルローダー、ランタイム層にわたって管理するために設計された多層防御の補完コントロールフレームワークを文書化します。
運用上の正確性を確保するため、防御はそのセキュリティ特性(Prevention、Runtime Detection、Containment)によって厳密に分類されます:
| 脆弱性 | サブシステム | 攻撃メカニズム | 深刻度 | 防御モード | 実装メカニズム |
|---|---|---|---|---|---|
| CVE-2026-53266 | Netfilter Bridging (ebtables) | ブリッジARPテーブル書き換えルールにおける算術オーバーフロー | High (Memory Corruption) | Prevention (Disarmament) | RAMからの退避(modprobe -r)+ローダー上書き(/bin/true) |
| CVE-2025-39964 | Crypto Netlink (AF_ALG) | netlink暗号ソケット割り当てにおける整数切り捨て | High (LPE / Breakout) | Detection (eBPF) / Gating | モダンeBPF(sys_enter_socket、domain 38)+SECCOMP |
| CVE-2025-39682 | Kernel TLS (kTLS) | TCP ULPにおけるゼロ長レコード処理の欠陥 | High (Kernel Panic / Heap) | Detection (eBPF) | モダンeBPF(sys_enter_setsockopt、TCP_ULP 31 & SOL_TLS 282) |
flowchart TD
subgraph Ring3 ["User Space / Container Pod (Ring 3)"]
Workload["Container Workload / Untrusted Process"]
Probe["Exploit Vectors: socket(AF_ALG) or setsockopt(TCP_ULP)"]
Workload --> Probe
end
subgraph Ring0 ["Linux Kernel (Ring 0)"]
SyscallTrap["Syscall Trap (sysenter)"]
Probe --> SyscallTrap
Tracepoint["Kernel Tracepoint: sys_enter"]
SyscallTrap --> Tracepoint
subgraph eBPFEngine ["Modern eBPF Detection (CO-RE Ring Buffer)"]
Filter{"Syscall Gating:\n- domain == 38 (AF_ALG)\n- SOL_TCP + TCP_ULP\n- SOL_TLS (282)"}
Tracepoint --> Filter
end
Disarmed["Modprobe Hook: /bin/true\n(ebtables evicted & blocked)"]
UserNS["containerd v2.2.4 User Namespace Remap\nContainer UID 0 -> Host UID 4050714624\n(Bounded Credential Containment)"]
Filter -- "Match (<1ms)" --> AlertRingBuf["Ring Buffer Emission"]
Filter -- "Pass" --> KernelExec["Normal Execution Path"]
KernelExec --> UserNS
end
subgraph SecurityPipeline ["Reactive Event Pipeline"]
Falcosidekick["Falco Daemon & Sidekick (:2801)"]
Forwarder["Event Forwarder Daemon (:9876)"]
NATSBus["NATS Security Bus (sovereign.security.alert)"]
AlertRingBuf --> Falcosidekick
Falcosidekick --> Forwarder
Forwarder --> NATSBus
end
subgraph Enforcement ["Automated Remediation & Audit"]
Remediator["Dynamic Bouncer (CrowdSec / nftables Drop)"]
AuditLedger["Cryptographically Tamper-Evident Hash Chain\n(SHA-256 Chaining & Cross-Node Replication)"]
NATSBus --> Remediator
NATSBus --> AuditLedger
end
classDef danger fill:#ffdddd,stroke:#ff0000,stroke-width:2px;
classDef safe fill:#ddffdd,stroke:#00aa00,stroke-width:2px;
classDef arch fill:#f0f4f8,stroke:#0066cc,stroke-width:1px;
class Probe danger;
class Disarmed,UserNS,AuditLedger safe;/etc/modprobe.d/の上書きに関するよくある落とし穴は、install /bin/trueがその後のモジュールロード試行のみをブロックするという点です。ブリッジネットワーキング(Docker、レガシーCNI)がホストのライフサイクルの早い段階でebtablesをロードしていた場合、脆弱なコードはカーネルRAM内でアクティブなまま残ります。
ゼロダウンタイムの無効化には2段階の手順が必要です:
/bin/trueローダー上書きを設定して再ロードを防ぐ。# Step A: Evict active ebtables modules from running kernel RAM
sudo modprobe -r ebtable_nat ebtable_filter ebtable_broute ebt_snat ebt_dnat ebt_arpreply ebtables 2>/dev/null || true
# Step B: Seal the loader via /etc/modprobe.d/blacklist-ebtables.conf
sudo tee /etc/modprobe.d/blacklist-ebtables.conf << 'EOF'
# Mitigation for CVE-2026-53266: Netfilter ARP table corruption
install ebtables /bin/true
install ebtable_nat /bin/true
install ebtable_broute /bin/true
install ebtable_filter /bin/true
install ebt_snat /bin/true
install ebt_dnat /bin/true
install ebt_arpreply /bin/true
blacklist ebtables
blacklist ebtable_nat
blacklist ebt_snat
blacklist ebt_arpreply
EOF
# Test explicit loading:
$ sudo modprobe ebt_snat
$ lsmod | grep ebt
# Output: (Empty - 0 modules resident in kernel memory)
sys_enterをフックし、SIEM/NATSへのサブミリ秒のアラートを提供します。カーネル制御フローを変更せずにゼロオーバーヘッドの可視性に最適化されています。-EACCES)を必要とする環境では、eBPF LSMプローブまたはSECCOMPプロファイルが実行前にシステムコールをドロップできます。TCP接続でKernel TLSを有効化するには、2つの異なる段階があります:
setsockopt(fd, SOL_TCP=6, TCP_ULP=31, "tls", 4)がUpper Layer Protocolをアタッチします。setsockopt(fd, SOL_TLS=282, TLS_TX/TLS_RX, ...)が暗号鍵を初期化します。SOL_TLS (282)のみでフィルタリングすると、ULPアタッチメントフェーズを見逃します。このルールは両方のフェーズを評価します:
# falco-rules-kernel-cve.yaml
customRules:
rules-kernel-cve.yaml: |-
- rule: Detect AF_ALG Crypto Socket Creation (CVE-2025-39964)
desc: Detects creation of Crypto API Netlink sockets used in local privilege escalation
condition: evt.type = socket and evt.rawarg.domain = 38
output: "Active Exploit Probe: AF_ALG socket requested (domain=%evt.rawarg.domain type=%evt.rawarg.type user=%user.name proc=%proc.name container=%container.id)"
priority: WARNING
tags: [cve, zero-day, cve-2025-39964, crypto, container_escape]
- rule: Detect Container Kernel TLS Activation (CVE-2025-39682)
desc: Detects container workloads attaching kTLS TCP_ULP or configuring SOL_TLS
condition: container.id != host and evt.type = setsockopt and
((evt.rawarg.level = 6 and evt.rawarg.optname = 31) or (evt.rawarg.level = 282))
output: "Container kTLS Activation Detected (level=%evt.rawarg.level optname=%evt.rawarg.optname user=%user.name proc=%proc.name container=%container.name)"
priority: WARNING
tags: [cve, zero-day, cve-2025-39682, ktls, tcp_ulp]
モダンなLinuxカーネル(Linux 7.0+ HWE)では、Falcoのユーザー空間インスペクタエンジン(sinsp)がopenatパラメータでレジスタ解析の不一致に遭遇します(sinsp_exception: could not parse param 2 (name))。
クラッシュループなしでDaemonSetの継続的な安定性を確保するには:
falco:
base_syscalls:
custom_set: ['!openat']
コンテナ内のワークロードがAF_ALGを呼び出すことを厳密に禁止する必要がある場合は、SCMP_ACT_ERRNOを返すSECCOMPプロファイルを適用します:
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"names": ["socket"],
"action": "SCMP_ACT_ERRNO",
"args": [
{
"index": 0,
"value": 38,
"op": "SCMP_CMP_EQ"
}
]
}
]
}
current->cred)内でrootを取得します。hostUsers: false)を備えたcontainerd v2.2.4では、コンテナのroot(UID 0)が非特権のホスト範囲(ホストUID 4050714624)にマッピングされます。境界付きの資格情報昇格は、非root名前空間内に制約されたままです。apiVersion: v1
kind: Pod
metadata:
name: hardened-workload
spec:
runtimeClassName: runc
hostUsers: false # Remaps container root away from host root
containers:
- name: app
image: app:latest
$ cat /proc/$(pgrep -f hardened-workload)/uid_map
0 4050714624 65536
侵害されたホスト上のローカルログファイルは、攻撃者が無制限のring-0実行を獲得した場合、理論的には変更される可能性があります。真の不変性には、書き込み一回型の物理メディアまたは暗号学的分散のいずれかが必要です:
192.0.2.52)に複製されるため、単一の侵害されたホストによる一方的なログ書き換えを防ぎます。{
"index": 386200,
"timestamp": "2026-09-22T08:58:36.564478+00:00",
"topic": "sovereign.security.alert",
"prev_hash": "b2f6ef1e467cf8402da283f58e470ee64993a479a957a0914ec8c351be7fa83d",
"hash": "cece8f9bd8839d3753232dd7e504c538a0f58fe0bcf2e260fbefb7d27e77b8cf",
"data": {
"output": "Active Exploit Probe: AF_ALG socket requested (domain=38 type=5 user=root ...)",
"priority": "Warning",
"rule": "Detect AF_ALG Crypto Socket Creation (CVE-2025-39964)"
}
}
検証は、非特権テストコンテナ内で合成AF_ALGソケット割り当てを使用して実施されました:
import socket
# Requests AF_ALG Netlink family (domain 38, SOCK_SEQPACKET 5)
s = socket.socket(38, socket.SOCK_SEQPACKET, 0)
socket(38, 5, 0)がsys_enter_socketを呼び出します。domain == 38を評価し、イベントをリングバッファに送信します。:9876)にアラートを発行します。sovereign.security.alertにブロードキャストします。$ python3 fsm_audit_vault.py --verify
# Verified 386,213 records. Zero tampering detected.
このリポジトリには、即時デプロイのための本番対応設定が含まれています:
|-- etc/
| \-- modprobe.d/
| \-- blacklist-ebtables.conf # Modprobe loader override
|-- helm/
| |-- falco-rules-kernel-cve.yaml # Falco modern eBPF rules (CO-RE)
| \-- README.md # One-line Helm deployment guide
|-- k8s/
| \-- pod-userns-hardened.yaml # containerd v2.2.4 UserNS manifest
|-- scripts/
| |-- evict-and-harden.sh # Two-step module eviction & sealing
| \-- verify-mitigation.sh # Automated verification & CI test suite
|-- seccomp/
| \-- seccomp-block-af-alg.json # Inline SECCOMP blocking profile (EACCES)
|-- vault/
| \-- audit_vault.py # Cryptographic SHA-256 hash-chain engine
|-- README.md
\-- LICENSE
lsmodで実行中のメモリを検証し、常駐モジュールを明示的に退避(modprobe -r)してください。TCP_ULPアタッチメント(SOL_TCP=6、optname=31)とオプション初期化(SOL_TLS=282)の両方を評価する必要があります。hostUsers: false)と組み合わせることで、コンテナレベルの特権昇格がホストring-0 rootを安易に取得することを防ぎます。Sovereign Systems & Security Architecture Teamによって維持されています。
Linux HWE & Kubernetes CRI v1.30(containerd v2.2+)で本番テスト済み。