2026年4月29日、Linux カーネルの algif_aead ユーザースペース暗号インターフェースで、「Copy Fail」と呼ばれる CVE-2026-31431(CVSS 7.8 HIGH)が開示されました。Theori の研究者らは、権限のないローカルユーザーが setuid バイナリのページキャッシュを破損し、数秒以内に root アクセスを取得できることを実証しました。Ubuntu 24.04、Amazon Linux 2023、RHEL 10.1、SUSE 16 カーネルには動作する exploit が存在します。
この脆弱性は、2017年に commit 72548b093ee3 を通じて導入され、AEAD 操作をインプレース処理に切り替えました。修正は4月初頭に commit fafe0fa2995a で終わるパッチシリーズに含まれており、ほぼ10年前の最適化を戻しています。Sysdig 脅威研究チーム(TRT)は、この問題を分析し、検出ルールをテストし、ランタイム検出カバレッジをデプロイしています。
影響を受けるバージョン
- 脆弱性あり: Linux カーネル 4.14~7.0-rc、すべての 6.18.x(6.18.22 より前)、および 6.19.x(6.19.12 より前)(2017年7月に導入された回帰)
- 修正済み: 7.0、6.19.12、6.18.22
- 脆弱性のある下流ディストリビューションバックポート: 6.12.x、6.6.x、5.15.x、5.10.x などの古い LTS ライン
- 概念実証(PoC): theori-io/copy-fail-CVE-2026-31431
- CISA KEV: 本記事公開時点では登録されていません
根本原因
algif_aead は、カーネルの AEAD 暗号を AF_ALG ソケット経由でユーザースペースに公開します。2017年のインプレース最適化に続き、カーネルは req->src = req->dst を設定し、sg_chain() を使用してソーススキャッターリストからのタグページを出力スキャッターリストにチェーンします。ユーザースペースが splice() を通じてソケットにフィードする場合、これらのタグページはスプライスされたファイルのページキャッシュを参照します。
authencesn(hmac(sha256),cbc(aes)) アルゴリズムは、拡張シーケンス番号の再配置のためのスクラッチスペースとしてオフセット assoclen + cryptlen で4バイトを書き込みます。しかし、この欠陥のため、出力スキャッターリストはチェーンされたページキャッシュページまで拡張されます。この4バイトの書き込みはスプライスされたファイルのメモリ内のキャッシュされたデータ内に終了し、ファイルの権限をバイパスします。
悪用
公開 PoC は約700バイトの Python スクリプトであり、3つのプリミティブをチェーンしています:
1. AF_ALG ソケットを authencesn(hmac(sha256),cbc(aes)) にバインドします。
2. /usr/bin/su のページキャッシュページを暗号パイプラインに splice() します。
3. AAD バイトが authencesn スクラッチ書き込みを対象ページに保証する4バイト値を供給する recvmsg() を発行します。
予想通り HMAC 検証は失敗しますが、破損はページキャッシュに永続します。プリミティブを連続したオフセットで繰り返すと、/usr/bin/su のキャッシュされたページに小さなシェルコードがステージングされます。その後 su を実行すると、パッチされたバイナリが実行され、root シェルが生成されます。攻撃者は対象ファイル、書き込みオフセット、および4バイトペイロードを制御します。
Dirty Pipe(CVE-2022-0847) とは異なり、正確なパイプバッファ操作とバージョン固有のターゲット化が必要でしたが、Copy Fail はレース条件やクラッシュしやすいタイミングウィンドウなく、ディストリビューション全体で確実にトリガーされる単純なロジック欠陥として機能します。
影響
脆弱なカーネルを持つローカルの権限なしユーザーは、root アクセスを取得できます。スタンドアロンのリモートベクトルはありません。攻撃者は最初にマシンでのコード実行が必要です。直接的にまたは Web アプリケーション脆弱性などの以前の侵害を通じてです。そのフットホルドが存在したら、この exploit は権限なしユーザーを root に昇格させます。exploit は標準システムコール(socket、setsockopt、splice、sendmsg、recvmsg)とデフォルトカーネル設定で利用可能なアルゴリズムのみに依存しているため、追加のカーネルモジュールなしで未修正エンタープライズディストリビューションで動作します。
Sysdig Secure による検出
Sysdig Secure のお客様は、AF_ALG ページキャッシュ毒の権限昇格につながるルールを使用して、自動的に検出を行っています。これは Sysdig ランタイム動作分析管理ポリシーの一部です。このルールは高度な Observations 検出エンジンにより非常に正確です。
オープンソース Falco による検出
Falco Feeds のお客様とオープンソース Falco ユーザーは、以下のルールを使用して AF_ALG ソケット作成の周囲の疑わしいアクティビティを検出できます。ただし、環境によっては調整が必要な場合があります。このタイプのソケットは カーネル TLS(kTLS)により使用され、ますます一般的になっています。Falco Feeds のお客様は、このルールが自動的に利用可能になります。
- list: known_af_alg_binaries
items: [cryptsetup, "systemd-cryptse", "systemd-cryptsetup", veritysetup, integritysetup, "cryptsetup-resh", kcapi-enc, kcapi-dgst, kcapi-rng, kcapi-sym]
- macro: successful_af_alg_socket
condition: >
evt.type = socket and
evt.rawres >= 0 and
(evt.arg.domain contains AF_ALG or evt.rawarg.domain = 38)
- macro: successful_af_alg_seqpacket_socket
condition: >
successful_af_alg_socket and
(evt.arg.type = 5 or
evt.arg.type = 2053 or
evt.arg.type = 524293 or
evt.arg.type = 526341)
- rule: Unexpected Process Using Kernel AEAD Crypto Socket
desc: >
AEAD 操作(authencesn、ccm、gcm)でのみ必須であるカーネル AEAD 暗号 API インターフェースである AF_ALG SEQPACKET ソケットの作成を、既知のディスク暗号化ツールチェーン外のプロセスから検出します。これは CVE-2026-31431 の必須の最初のステップであり、AF_ALG + splice() を使用してページキャッシュで SUID バイナリを破損する Linux カーネル LPE です。SOCK_SEQPACKET タイプは、ハッシング、対称暗号を使用する SOCK_DGRAM の大多数の正当な AF_ALG ユーザーを除外します。
condition: >
successful_af_alg_seqpacket_socket and
not proc.name in (known_af_alg_binaries)
output: 予期しないプロセス %proc.name は、ユーザー %user.loginname 下で親 %proc.pname を含む AF_ALG AEAD カーネル暗号ソケットを開きました(socket.domain=%evt.arg.domain socket.type=%evt.arg.type proc.pid=%proc.pid proc.exe=%proc.exe proc.name=%proc.name proc.exepath=%proc.exepath proc.pname=%proc.pname proc.pexepath=%proc.pexepath gparent=%proc.aname[2] gexepath=%proc.aexepath[2] ggparent=%proc.aname[3] container.name=%container.name image=%container.image.repository:%container.image.tag proc.cmdline=%proc.cmdline proc.pcmdline=%proc.pcmdline gcmdline=%proc.acmdline[2] ggcmdline=%proc.acmdline[3] proc.ppid=%proc.ppid user.name=%user)
priority: CRITICAL
tags: [host, container, kernel, cve, CVE-2026-31431, MITRE,
MITRE_TA0004_privilege_escalation,
MITRE_T1068_exploitation_for_privilege_escalation]
推奨事項
- 更新: Linux 7.0、6.19.12、または 6.18.22(または古い LTS ラインの対応するディストリビューションバックポート)に更新してください。
- 制限: seccomp プロファイル、コンテナランタイムのデフォルト、またはユーザースペース暗号を必要としないホストで
CONFIG_CRYPTO_USER_API_AEADを無効にすることにより、AF_ALGソケット作成を可能な限り制限してください。 - デプロイ: 上記の Falco ルールをデプロイして、ホストとコンテナ全体で権限なしの
AF_ALGソケット作成にフラグを付けてください。 - 監査: 合法的な
AF_ALGユーザーの実行中のワークロードを監査して、検出例外が無効にするのではなく既知のバイナリにスコープされるようにしてください。 - 監視:
setuidバイナリへの予期しない変更と、カーネル暗号システムコールに続く予期しない権限遷移を監視してください。
結論
Copy Fail は、8年前のパフォーマンス最適化を権限なしユーザーから root への4システムコールパスに変える信頼性の高いローカル権限昇格です。すべての主要エンタープライズディストリビューションをカバーする動作可能な公開 PoC により、パッチがパッチをラグしている場合の悪用は簡単です。
カーネルが更新されるまで、AF_ALG ソケット悪用のランタイム検出は最も実用的な補償制御であり、algif_* 悪用は Dirty Pipe と同じように扱うべきです。つまり、任意のローカルフットホルドが数秒以内に root アクセスになると仮定してください。
クラウド検出&対応


