概要
2026年4月29日、Linuxカーネルのローカル権限昇格脆弱性が「Copy Fail」(CVE-2026-31431)という名称で公開されました。Cloudflareのセキュリティチームとエンジニアリングチームは、脆弱性が公開されるとすぐに評価を開始しました。エクスプロイト技術を検証し、インフラストラクチャ全体への露出を評価し、既存の行動検知がエクスプロイトパターンを数分以内に識別できることを確認しました。Cloudflare環境への影響はなく、顧客データは危険にさらされず、サービスは一度も中断されませんでした。
背景
Linuxカーネルリリースプロセス
Cloudflareは330都市に分散したデータセンターを持つ、膨大な規模のグローバルLinuxサーバーインフラストラクチャを運用しています。このボリュームで効果的に更新を管理するため、コミュニティのLong-Term Support(LTS)バージョンに基づくカスタムLinuxカーネルビルドを保守しています。
任意の時点で、6.12や6.18などの様々なシリーズから複数のLTSバージョンを利用する可能性があり、これらは拡張更新期間の恩恵を受けます。コミュニティは定期的にセキュリティと安定性の更新をマージしてリリースし、これが自動ジョブをトリガーして、約1週間ごとに新しい内部カーネルビルドを生成します。これらのビルドはステージングデータセンターでテストされ、グローバルロールアウト前に安定性を確保します。
リリースが成功した後、Edge Reboot Release(ERR)パイプラインが4週間サイクルでエッジインフラストラクチャの体系的な更新と再起動を管理します。コントロールプレーンインフラストラクチャは通常、最新のカーネルを採用し、再起動は特定のワークロード要件に従ってスケジュールされます。
CVEが公開される時点までに、必要な修正は通常、安定したLinux LTSリリースに数週間前に統合されています。確立されたプロセスにより、これらのパッチは既にデプロイされています。「Copy Fail」の公開時点では、インフラストラクチャの大部分は6.12 LTSバージョンを実行していましたが、一部のマシンは新しい6.18 LTSリリースへの移行を開始していました。
Copy Fail脆弱性について
対応ストーリーに進む前に、脆弱性を理解することが役立ちます。包括的な説明は、元のXint Code開示投稿で見つけることができます。
AF_ALGとカーネル暗号API
Linuxカーネルの内部暗号APIは、kTLSやIPsecなどの機能を管理します。ユーザースペースプログラムはAF_ALGソケットファミリーを介してこれにアクセスし、非特権プロセスが暗号化または復号化をリクエストできます。algif_aeadモジュールは、認証付き暗号化と関連データ(AEAD)暗号のためにこれを容易にします。
非特権プログラムは以下のステップに従います:
- AF_ALGソケットを開き、AEADテンプレートにバインドします
- キーを設定し、リクエストソケットを受け入れます
- sendmsg()またはsplice()を介して入力を送信します
- recvmsg()を使用して操作を実行します
splice()システムコールはここで重要です。ページキャッシュ参照を渡すことでデータを移動するためです。
メモリメカニクス:ページキャッシュとインプレース暗号化
ページキャッシュはファイルコンテンツの共有システムキャッシュです。setuidバイナリに属するページを変更すると、ページが削除されるまで、すべてのユーザーに対してそのプログラムを効果的に編集します。暗号APIはscatterlistsを利用します。これは様々なメモリページをリンクする構造です。2017年に、algif_aeadはインプレース操作用に最適化され、宛先と参照ページをチェーンしました。この設計は、アルゴリズムが意図された境界を超えて書き込むことを防ぐための強制がありませんでした。
脆弱性:境界外書き込み
ユーザーがrecvmsg()を実行すると、カーネル内のauthencesnラッパーは正当な出力領域を超えて4バイト書き込みを実行します:
scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 1);
splice()を使用することで、攻撃者はターゲットファイルのページキャッシュページをscatterlistにチェーンできます。境界外書き込みはキャッシュされたファイルを汚染し、攻撃者が変更するファイル、オフセット、および書き込まれる特定の4バイトを制御できます。
このエクスプロイトで攻撃者は以下を操作できます:
- ファイル:任意の読み取り可能なファイル
- オフセット:assoclenおよびspliceパラメータを介して調整可能
- 値:sendmsg()のAADバイト4~7を介して制御
エクスプロイト、ステップバイステップ
デフォルトエクスプロイトは/usr/bin/suをターゲットにします。これは本質的にすべてのディストリビューションに存在するsetuid-rootバイナリです。
キャッシュ参照:
/usr/bin/suをO_RDONLYで開き、read()を実行してページキャッシュを入力します
- ファイルディスクリプタでsplice()を使用して、これらのページキャッシュ参照を暗号scatterlistに渡します
セットアップ:
- AF_ALGソケットを作成し、
authencesn(hmac(sha256),cbc(aes))にbind()します
- キーを設定し、特権を必要とせずにリクエストソケットを受け入れます
書き込み構築:
各4バイトシェルコードチャンク:
- AADバイト4~7にシェルコードを含むsendmsg()
- バイナリをパイプに、次にAF_ALGソケットにsplice()して、assoclen + cryptlenが目的の.textオフセットをターゲットにします
トリガー:
- recvmsg()は復号化を開始します
- authencesnはスクラッチデータを
/usr/bin/suのターゲットオフセットのページキャッシュに書き込みます
- 関数は-EBADMSGを返しますが、4バイト書き込みはグローバルページキャッシュに存在します
実行:
execve("/usr/bin/su")を実行すると、汚染されたページキャッシュが読み込まれます
- バイナリはsetuid-rootであるため、注入されたシェルコードはroot権限で実行されます
アップストリーム修正(commit a664bf3d603d)は2017年のインプレース最適化を戻し、エクスプロイトを削除します。
対応方法
脆弱性が公開されたとき、多くのワークストリームが並行して開始されました:
影響範囲のマッピング
セキュリティチームはカーネルエンジニアと協力して、どのカーネルバージョンが脆弱であるかを判断し、潜在的な露出を評価しました。
カバレッジの検証
セキュリティはエクスプロイト技術を検証し、既存の行動検知が認可された内部検証中にエクスプロイトパターンを識別できることを確認しました。
プロアクティブな脅威ハンティング
セキュリティは、脆弱性が公開される前に悪用されたという兆候を検索し、フロート全体のログで48時間遡りました。
緩和策のエンジニアリング
カーネルエンジニアは、本番サービスを破壊することなくフロートを保護するランタイム緩和策の構築を開始しました。
ソフトウェア更新の継続
エンジニアリングチームは更新されたLinuxカーネルの配信に取り組み、サーバー全体での慎重な再起動とロールアウトが必要でした。
この対応中、顧客への影響はありませんでした。
検知カバレッジの検証
セキュリティチームが最初に行ったことの1つは、既存のエンドポイント検知がこのエクスプロイトをキャッチすることを確認することでした。サーバーは、プロセス実行パターンを継続的に監視する行動検知を実行します。特定の脆弱性について知ることに依存しません。フロート全体の異常な動作を監視します。
対応の一部として脆弱性を内部で検証したエンジニアは、検知プラットフォームが数分以内にそれをフラグしました。システムは実行チェーン全体をリンクしました。スクリプトインタープリタから開始し、カーネルの暗号化サブシステムを通過し、権限昇格バイナリで終了し、フロート全体の行動パターンに基づいて悪意のあるものとしてフラグしました。
これはシグネチャ更新なし、ルール変更なし、人間の介入なしで発生しました。行動検知カバレッジは、この特定のCopy Failエクスプロイト用のカスタムロジックを書く前に存在していました。確認は重要でした。脆弱性固有のルールを書く前にカバレッジがあったことを意味したからです。
悪用の検索
エンジニアリングチームがより対象を絞った緩和策に移行している間、セキュリティ調査は公開以来実行されていました。これは重大な脆弱性の標準的な手順です。
セキュリティチームは重大な脆弱性に対して単純な原則で動作します:妥協を証明できるまで妥協を想定します。
調査は、脆弱性が公開される前に悪用が発生した可能性があるという仮定から開始され、それを確認または除外するために体系的に機能しました。
エクスプロイトは実行時にカーネルログに特徴的なトレースを残します。集中ログインフラストラクチャ全体でそのトレースを検索し、脆弱性が公開される前の48時間をカバーしました。誰かがこれを世界が知る前に悪用していたなら、私たちはそれを見ていたでしょう。
影響を受けたシステムのアクセスログを取得し、誰が接続したか、いつ、どのコマンドを実行したかを再構築しました。これにより、潜在的に影響を受けたインフラストラクチャ上の対話的活動の完全なフォレンジック画像が得られました。
システムバイナリが改ざんされていないことを確認し、既知の良好なパッケージマニフェストに対して暗号ハッシュを検証し、永続化メカニズムを探し、ネットワーク接続を監査して異常がないか確認しました。すべてがクリーンでした。
インシデントタイムラインと影響
| 時刻(UTC) | イベント |
|---|
| 2026-04-29 16:00 | Copy Failが公開されました |
| 2026-04-29 ~21:00 | セキュリティとエンジニアリングチームは、インシデント対応プロセスの完全な宣言前に、フロート露出と緩和オプションの評価を開始しました |
| 2026-04-29 22:52 | セキュリティは既存の行動検知がCopy Failエクスプロイトパターンをカバーしていることを確認しました。認可された内部検証中に、検知は数分以内に活動をフラグしました |
| 2026-04-29 23:01 | 既存の行動検知は、エクスプロイトのような活動に対して高重大度アラートを生成し、技術のカバレッジを確認しました |
| 2026-04-29(夜間) | 最初の緩和策がステージングデータセンターにプッシュされました。デプロイメントプロセスは依存関係の競合を表面化させました。緩和策はロールバックされました。本番システムは影響を受けませんでした |
| 2026-04-29(夜間) | エンジニアリングはbpf-lsm緩和プログラムを起草しました |
| 2026-04-30 03:14 | セキュリティインシデントが宣言され、クロスファンクショナルコラボレーションと緊急性を推進しました。セキュリティは、悪意のある活動がCloudflareシステムに存在しないことを確認するために、フロート全体の脅威ハンティングを実行しました |
| 2026-04-30(朝) | エンジニアリングはbpf-lsm緩和プログラムをテストし、本番対応にしました |
| 2026-04-30 14:25 | エンジニアリングインシデントが宣言され、緩和プログラムとLinuxパッチロールアウトを調整しました |
| 2026-04-30 ~17:00 | 決定:前のLTSラインのパッチビルドを再起動自動化を通じて配信します。新しいLTSを加速しないでください。その間、bpf-lsmに依存します |
| 2026-04-30(午後) | 可視性パイプライン(AF_ALGソケット使用のeBPFトレース)がフロート全体にデプロイされました。すべての正当なAF_ALGユーザーの完全な画像を提供します |
| 2026-04-30(夜間) | bpf-lsm緩和プログラムが別のゲートの背後でロールアウトされ、フロートを完全に緩和しました。以前に脆弱なテストノードでのエンドツーエンド検証により、エクスプロイトが機能しなくなったことを確認します |
| 2026-05-04(朝) | 再起動自動化がパッチされたカーネルで通常のペースで再開されました |
| 2026-05-04以降 | 週の早い段階で既に再起動自動化を通過したサーバーは、パッチされたカーネルを取得するために手動で再起動しました。パッチされていないサーバーは通常の再起動自動化に従って更新します |
緩和方法
パッチされたLinuxカーネルをデプロイするのに長い時間がかかるため、再起動なしでこのエクスプロイトを緩和することも追求しました。
モジュールの削除
バグはalgif_aeadカーネルモジュール内にありました。したがって、単純な修正はこのモジュールを削除し、再読み込みを禁止することでした。この緩和策は、それを識別したセキュリティ研究者によるCopy Fail書き込みが推奨するものと正確に一致しています。
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
rmmod algif_aead 2>/dev/null || true
残念ながら、モジュールを削除すると、カーネル暗号APIを活用するソフトウェアに影響を与えたでしょう。これは、より外科的な緩和策を考え出す必要があったことを意味しました。
Bpf-lsm
この正確なシナリオのためにそのようなツールを既に開発およびデプロイしました:bpf-lsm。モジュールを削除する代わりに、このツールは正当なユーザーのためにそれをロードしたままにし、BPF Linux Security Moduleプログラムを使用してソケットバインドを拒否します。