Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
block-copyfail — BPF LSMブロッカー for CVE-2026-31431 (Copy Fail) - OpenShift 4向けゼロリブート修復 | Kitploit
ツール/GitHubGitHub/mrunalp/block-copyfail
防御ツールコンテナセキュリティ脆弱性分析セキュリティ仮想化クラウドセキュリティ
GitHubmrunalp/block-copyfail

block-copyfail

BPF LSMブロッカー for CVE-2026-31431 (Copy Fail) - OpenShift 4向けゼロリブート修復

リポジトリを見る
12104ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

概要

CVE-2026-31431(「Copy Fail」)は、Linuxカーネルのalgif_aead暗号インターフェースにおける権限昇格の脆弱性です。攻撃者はauthencesnアルゴリズムを使用したAF_ALGソケットとsplice()を利用して、カーネルページキャッシュ内の任意のファイル(/usr/bin/suなどのsetuidバイナリを含む)を破損させることができます。

本ドキュメントでは、Copy Failで悪用されるサブシステムであるAF_ALG AEADバインドをすべてブロックするBPF LSM DaemonSetを使用した、再起動不要の修復策を提供します。これにより、暗号テンプレートのネスト(例:pcrypt(authencesn(...)))によるバイパスを防ぎます。他のAF_ALGの使用(hash、skcipher)には影響しません。3つの独立したOCP 4.22クラスターでエンドツーエンドのテスト済みです。

クイックスタート

root@kitploit:~
# 1. BPF LSMが有効であることを確認(RHEL CoreOS 9.8ではデフォルトで有効)
oc debug node/<任意のノード> -- chroot /host cat /sys/kernel/security/lsm
# 出力に "bpf" が含まれている必要があります

# 2. ネームスペースをデプロイし、特権SCCを付与
oc apply -f daemonset.yaml

# 3. DaemonSetポッドは全ノードで自動的に起動します

# 4. 確認
oc get pods -n block-copyfail     # 全ノードで Running 状態になるはずです
oc logs -n block-copyfail -l app=block-copyfail
# 期待される出力: "block-copyfail: blocker active — all AF_ALG AEAD binds blocked"

再起動は不要です。ノードのドレインも不要です。ポッドの再起動も不要です。保護は即座に有効になり、全ノードのすべてのプロセスをカバーします(100%のカバレッジ)。

目次

  1. エクスプロイトの仕組み
  2. クラスターの脆弱性の確認
  3. BPF LSM DaemonSetのデプロイ
  4. デプロイ後の検証
  5. ソースからのイメージ構築
  6. 削除

エクスプロイトの仕組み

このエクスプロイトは、カーネルの3つの機能を連鎖させます:

  1. AF_ALGソケット — socket(AF_ALG, SOCK_SEQPACKET, 0) を介してカーネル暗号へのユーザースペースハンドルを作成
  2. AEADバインド — 特定の認証付き暗号アルゴリズムである authencesn(hmac(sha256),cbc(aes)) にバインド
  3. splice() + sendmsg() — カーネルがソースとデスティネーションのページマッピングが異なる「インプレース」操作を誤って実行し、読み取り専用ファイルのページキャッシュを破損

攻撃者は(ファイルへの書き込みアクセスなしで)ページキャッシュ内の /usr/bin/su を破損させ、それを実行してrootを取得します。


クラスターの脆弱性の確認

クラスター上に新しい cve-2026-31431-test ネームスペースを作成し、test ディレクトリ内のマニフェストを適用してテストスクリプトを実行します:

root@kitploit:~
oc apply -f test

結果を確認します:

root@kitploit:~
oc wait pod/cve-test -n cve-2026-31431-test \
  --for=jsonpath='{.status.phase}'=Succeeded --timeout=120s
oc -n cve-2026-31431-test logs -l app=cve-2026-31431-test

脆弱なクラスターでは、以下の出力が表示されます:

root@kitploit:~
=== CVE-2026-31431 Vulnerability Test ===
Target: /usr/bin/su

Original SHA256: 8969560ae8e6e21c6184c1451f59418822ee69dd5d946d71987b55236bbc0feb
Attempting splice + AF_ALG page-cache corruption (160 bytes in 40 chunks)...
After SHA256:    30b0f5b5a054c4df65b48ca792863bf7054b4d793f15f57163792ba6c2b151ae

PAGE CACHE CORRUPTION: YES - /usr/bin/su was modified in the page cache

Attempting to execute corrupted /usr/bin/su ...
  exit code: 0

RESULT: PARTIALLY MITIGATED
  Page-cache corruption succeeded (kernel is vulnerable)
  Privilege escalation blocked (allowPrivilegeEscalation=false)

ステップ4: クリーンアップ

root@kitploit:~
oc delete namespace cve-2026-31431-test

BPF LSM DaemonSetのデプロイ

BPF LSMアプローチは、カーネルレベルで socket_bind をフックし、テンプレートのネストに関係なくすべてのAF_ALG AEADバインドをブロックします。block-copyfail に基づいており、OCPデプロイ用にlibbpfを使用してCで書き直されています。

前提条件

BPF LSMが有効である必要があります。RHEL CoreOS 9.8(OCP 4.22)ではデフォルトで有効です。以下で確認します:

root@kitploit:~
oc debug node/<任意のノード> -- chroot /host cat /sys/kernel/security/lsm

期待される出力には bpf が含まれます:

root@kitploit:~
lockdown,capability,landlock,yama,selinux,bpf

bpf が存在しない場合、一度だけのMachineConfigが必要です(再起動が必要となる唯一のシナリオです):

root@kitploit:~
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  labels:
    machineconfiguration.openshift.io/role: worker
  name: 99-enable-bpf-lsm
spec:
  kernelArguments:
    - lsm=lockdown,capability,selinux,bpf

ステップ1: ネームスペースの作成、SCCの付与、デプロイ

新しい block-copyfail ネームスペースを作成し、SCCを付与し、daemonset.yaml マニフェストを適用してDaemonSetをデプロイします。 DaemonSetポッドが作成される前に特権SCCを付与する必要があります。そうしないと、SCC検証エラーでポッドの作成が失敗します。

root@kitploit:~
oc apply -f daemonset.yaml

ステップ2: 全ノードでポッドの起動を待つ

root@kitploit:~
oc get pods -n block-copyfail -o wide

期待される結果:ノードごとに1つのポッド、すべて Running 状態:

root@kitploit:~
NAME                   READY   STATUS    AGE   NODE
block-copyfail-2jhzf   1/1     Running   34s   ci-...-master-2
block-copyfail-4dfq7   1/1     Running   34s   ci-...-master-1
block-copyfail-c2ts8   1/1     Running   34s   ci-...-worker-c
block-copyfail-ctblk   1/1     Running   34s   ci-...-worker-a
block-copyfail-m26sx   1/1     Running   34s   ci-...-worker-b
block-copyfail-xsh6d   1/1     Running   34s   ci-...-master-0

ステップ3: ブロッカーがアクティブであることを確認

root@kitploit:~
oc logs -n block-copyfail -l app=block-copyfail

期待される出力:

root@kitploit:~
block-copyfail: blocker active — all AF_ALG AEAD binds blocked

デプロイ後の検証

脆弱性の確認セクションと同じエクスプロイトテストを再実行します。

BPF LSM DaemonSetのデプロイ後、出力は以下のようになります:

root@kitploit:~
=== CVE-2026-31431 Vulnerability Test ===
Target: /usr/bin/su

Original SHA256: 30b0f5b5a054c4df65b48ca792863bf7054b4d793f15f57163792ba6c2b151ae
Attempting splice + AF_ALG page-cache corruption (160 bytes in 40 chunks)...
  AF_ALG bind failed: [Errno 1] Operation not permitted

RESULT: CANNOT TEST - AF_ALG or splice not available/permitted

DaemonSetのログには、ブロックされた試行が表示されます:

root@kitploit:~
oc logs -n block-copyfail -l app=block-copyfail
root@kitploit:~
block-copyfail: blocker active — all AF_ALG AEAD binds blocked
block-copyfail: BLOCKED pid=16777    comm=python3 time=2026-05-01 16:37:23

他のアルゴリズムが影響を受けないことの確認

ノード上で verify-algos.py を実行し、すべてのAEADアルゴリズムがブロックされ、他のAF_ALGタイプ(hash、skcipher)が引き続き動作することを確認します:

root@kitploit:~
oc debug node/<任意のノード> -- chroot /host python3 -c "
import socket
tests = [
    ('aead',     'gcm(aes)'),
    ('aead',     'ccm(aes)'),
    ('aead',     'rfc4106(gcm(aes))'),
    ('hash',     'sha256'),
    ('skcipher', 'cbc(aes)'),
    ('aead',     'authencesn(hmac(sha256),cbc(aes))'),
]
for t, n in tests:
    s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
    try:
        s.bind((t, n))
        print(f'  ALLOWED  {t}/{n}')
    except OSError as e:
        print(f'  BLOCKED  {t}/{n} -- {e}')
    finally:
        s.close()
"

期待される出力:

root@kitploit:~
  BLOCKED  aead/gcm(aes) -- [Errno 1] Operation not permitted
  BLOCKED  aead/ccm(aes) -- [Errno 1] Operation not permitted
  BLOCKED  aead/rfc4106(gcm(aes)) -- [Errno 1] Operation not permitted
  ALLOWED  hash/sha256
  ALLOWED  skcipher/cbc(aes)
  BLOCKED  aead/authencesn(hmac(sha256),cbc(aes)) -- [Errno 1] Operation not permitted

これにより、BPF LSMが他のAF_ALGタイプを機能させたまま、すべてのAEADバインドをブロックすることが確認できます。


ソースからのイメージ構築

BPF LSMブロッカーのソースは block-copyfail/ にあります:

root@kitploit:~
block-copyfail/
  block_copyfail.bpf.c     # BPFカーネルプログラム(LSMフック)
  block_copyfail.c          # ユーザースペースローダー(libbpfスケルトン)
  block_copyfail.h          # 共有イベント構造体
  Makefile                  # ビルドパイプライン
  Dockerfile                # マルチステージビルド
  daemonset.yaml            # ネームスペース + DaemonSetマニフェスト
  trigger-test.py           # クイック検証スクリプト

ビルドとプッシュ:

root@kitploit:~
cd block-copyfail/
podman build -t quay.io/<org>/block-copyfail:latest .
podman push quay.io/<org>/block-copyfail:latest

Dockerfileはマルチステージビルドを使用します:コンパイルにはclang/bpftool/libbpf-develを備えたFedora、ランタイムイメージにはUBI 9 minimal(約122 MB)を使用します。


削除

DaemonSetを削除すると、全ノードの緩和策が即座に削除されます:

root@kitploit:~
oc delete -f daemonset.yaml
# または
oc delete namespace block-copyfail

BPFプログラムは、ローダープロセスが終了すると自動的にデタッチされます。再起動やポッドの再起動は不要です。

ツールをダウンロード