エッジを守る:CloudflareがいかにしてCopy Fail Linux脆弱性を緩和したか
2026年4月29日、「Copy Fail」(CVE-2026-31431)として知られる重大なローカル権限昇格の脆弱性が公開されました。大規模なLinuxインフラストラクチャを運用する者にとって、このような脆弱性は極めてリスクの高い競争となります。公開から実際の悪用が始まるまでの時間は、しばしば数時間単位で計測されます。
Cloudflareによるこの事象への対応は、防御層の深化(defense-in-depth)の模範を示しており、自動パッチ適用、振る舞い検知、そして外科的なランタイム緩和策の組み合わせがいかにして、従来のアップデートサイクルが間に合わない場合でも脅威を無力化できるかを説明しています。
「Copy Fail」脆弱性の理解
緩和策を理解するためには、まずエクスプロイトのメカニズムを理解する必要があります。この脆弱性は、Linuxカーネルの AF_ALG ソケットファミリー、具体的には Authenticated Encryption with Associated Data (AEAD) 暗号に使用される algif_aead モジュール内に存在します。
エクスプロイトのメカニズム
問題の核心は、境界外書き込み(out-of-bounds write)です。2017年、インプレース(in-place)の暗号操作を可能にするための最適化が導入され、これにより宛先ページと参照ページが連結されるようになりました。しかし、この設計には十分な境界チェックが欠けてていました。
ユーザーが recvmsg() を実行すると、カーネル内の authencesn ラッパーが、正当な出力領域を超えて4バイトの書き込みを行います。splice() システムコールを利用することで、攻撃者はターゲットファイルのページキャッシュ(例えば、setuid-rootバイナリの /usr/bin/su など)を暗号の散布リスト(scatterlist)に連結させることができます。
これにより、攻撃者は以下のことが可能になります:
- 任意の読み取り可能なファイルをターゲットにする:そのファイルのページキャッシュを操作することで。
- 書き込みのオフセットを制御する:
assoclenとspliceパラメータを介して。 - 書き込まれる値を制御する:
sendmsg()内のAADバイトを介して。
setuidバイナリのページキャッシュにシェルコードを注入することで、攻撃者は次にそのバイナリが呼び出された際に、そのコードをroot権限で実行でき、事実上すべてのローカルセキュリティ制御をバイパスすることができます。
Cloudflareの対応戦略
Cloudflareの対応は、サービスの可用性を維持しながら「脆弱性の窓」を最小限に抑えるように設計された、並行するワークストリームによって特徴付けられます。
振る舞い検知 vs. シグネチャ
Cloudflareの防御における最も重要な側面の一つは、既存の振る舞い検知システムです。シグネチャ(特定の攻撃のパターンを知っていること)に依存する従来のアンチウイルスやIDSとは異なり、Cloudflareのシステムは anomalous process execution patterns(異常なプロセス実行パターン)を監視します。
内部検証中、このシステムは数分以内に Copy Fail エクスプロイトを検知しました。単一のルール変更や人間の介入を必要とすることなく、スクリプトインタプリタから暗号サブシステム、そして権限昇格バイナリに至るまでの実行チェーン全体を紐付けました。これにより、セキュリティチームは、実環境での実際の攻撃試行がリアルタイムで検知されるという即座の確信を得ることができました。
スレット・ハンティングとフォレンジック
「侵害されていることを前提とする」という原則に基づき、Cloudflareは、脆弱性の公開に先立つ48時間について、フリート全体にわたるログの遡及的な調査(retrospective hunt)を行いました。彼らはエクスプロイトによって残される特徴的なカーネルログのトレースを検索し、既知の良好なパッケージマニフェストとシステムバイナリの整合性を検証することで、永続的な侵害が確立されていないかを確認しました。
bpf-lsm による外科的な緩和策
長期的な解決策はカーネルパッチと再起動ですが、Cloudflareのインフラストラクチャの規模(330以上の都市)では、グローバルな再起動サイクルは時間がかかります。チームは2つの緩和策の経路を検討しました:
- 力任せの手法:
algif_aeadモジュールを完全に削除する。これは効果的ですが、カーネル暗号APIに依存する内部サービスを破壊するリスクがありました。 - 外科的なアプローチ:
bpf-lsm(BPF Linux Security Module) を使用する。
bpf-lsm の仕組み
Cloudflareは、socket_bind LSMフックに eBPF プログラムをデプロイしました。一律の禁止ではなく、プログラムは論理ゲートを実装しました:
- ソケットファミリーが
AF_ALGでない場合、呼び出しを許可する。 - ソケットファミリーが
AF_ALGである場合、呼び出し元のバイナリのパスを、既知の正当なサービスの厳格な許可リスト(allow-list)と照合する。 - 許可リストにないバイナリであれば、bind リクエストを拒否する。
デプロイのプロセス
予期せぬ停止を避けるため、Cloudflareは2段階のデプロイを行いました:
- 可視化フェーズ:
prometheus-ebpf-exporterを使用して、フリート全体でAF_ALGの使用状況を追跡しました。これにより、唯一の内部サービスのみが正当にこのAPIを使用していることが確認されました。 - 強制フェーズ:許可リストが検証された後、
bpf-lsmプログラムをプッシュして、他のすべてのアクセスをブロックしました。
教訓と今後の強化策
緩和策は成功しましたが、このインシデントはいくつかの改善領域を浮き彫りにしました。主な教訓は「LTSラグ」の危険性です。メインラインの修正が、Cloudflareが使用している特定のLTSカーネルラインにまだバックポートされていないため、Cloudflareは脆弱性にさらされていました。
同様の問題を防ぐために、Cloudflareは以下のことに取り組むと約束しました:
- カーネルの攻撃対象領域の削減:ランタイムでのブロックに頼るのではなく、ビルド時に未使用のモジュールを完全に削除するために、カーネル構成を監査すること。
- APIの可視化の向上:将来の緩和策を加速させるため、どのプロダクションサービスが特定のカーネルAPIに依存しているかのマッピングを精度高く開発すること。 。
- bpf-lsm ツールの向上:eBPFベースの緩和策ツールのデプロイ速度とロging 機能を強化すること。
結論
Copy Fail への対応は、現代のインフラストラクチャにおいて、パッチ適用が唯一の防御線ではないことを示しています。堅牢なカーネルアップデートパイプラインと、eBPF によるランタイム緩和策の機敏性と、検知における振る舞いベースのアプローチを組み合わせることで、Cloudflareは、サービスを中断したり顧客データを危険にさらしたりすることなく、フリートを保護することができました。コミュニティメンバーの一人が議論の中で指摘したように、これはLTSカーネルの安定性の価値を再確認させると同時に、組織がLTSラインがメインラインのセキュリティ修正に遅れる場合の計画を策定しておくことの重要性を強調しています。