shiichan

Copy Fail って知ってる? Cloudflare が Linux カーネルの脆弱性を bpf-lsm で封じ込めたよ!

やっほー、しぃちゃんだよ! 今日はちょっとゾクッとする、でもかっこいい「守り」の話を持ってきたよ。Linux カーネルの脆弱性を、Cloudflare がどう乗り切ったのかっていう舞台裏なの。

Cloudflare Blog blog.cloudflare.com

なにが発表されたの?

これは Cloudflare の Blog が公開した、Copy Fail っていう Linux カーネルの脆弱性(CVE-2026-31431)への対応記録だよ。2026 年 4 月 29 日に公開された「ローカル権限昇格」のバグで、Cloudflare は世界中のサーバーで顧客影響ゼロ・悪用の痕跡なしで乗り切ったんだって。

なぜ重要なの?

「Copy Fail」は、Linux カーネルの暗号 API のなかの algif_aead っていうモジュールに潜んでたの。AF_ALG ソケット経由でユーザー空間から暗号処理を呼べる仕組みなんだけど、authencesn ラッパーの in-place 処理で、本来の出力領域より 4 バイト先まで書き込んじゃう「境界外書き込み」があったんだ。

怖いのはここから。攻撃者は splice() で狙ったファイルのページを紛れ込ませて、書き込む場所と 4 バイトの中身をコントロールできちゃう。標準の攻撃コードは setuid-root な /usr/bin/su を狙って、シェルコードを仕込んで root を奪うんだって。普通のユーザーが管理者になれちゃう、っていう典型的でイヤなやつだね。

これで何が変わるの?

Cloudflare のえらいところは、公開されてから慌てて動いたんじゃなくて、既存の仕組みが最初の数分で気づいたところ。エンドポイント検知が、シグネチャ更新もルール変更も人の手も要らずに、この攻撃パターンを捕まえたの。

flagged it within minutes ... without a signature update, without a rule change, and without human intervention.

そのあと過去 48 時間ぶんのログをさかのぼって「本当に悪用されてないか」を総ざらい。結果はシロ。データが危険にさらされたことも、サービスが止まったことも一度もなかったよ。

深く潜ってみよう

最初に試したのは「モジュールごと止めちゃえ」作戦。でもこれは失敗だったの。

echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
rmmod algif_aead 2>/dev/null || true

正規のソフトがカーネルの暗号 API に依存してたから、丸ごと止めると壊れちゃう。だから本番に出す前にステージングで巻き戻したんだって。

そこで登場するのが bpf-lsm を使った「外科手術」ミティゲーション。socket_bind っていう LSM フックに割り込んで、許可リストに載ったバイナリだけ AF_ALG ソケットを使えるようにして、それ以外は拒否するの。モジュールは生かしたまま、危ないドアだけ閉める感じだね。

いきなり締めるとサービスが壊れるかもだから、その前に prometheus-ebpf-exporter でどのバイナリが AF_ALG を使ってるかをフリートぜんぶで観測。「正規の利用者はこの 1 つだけ」って確認してから有効化したんだよ。慎重!

効いてるかは、この一行で確かめられる。

python3 -c 'import socket; s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0); s.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));'

守られたマシンだと PermissionError: [Errno 1] Operation not permitted が返ってくるの。

もちろん根っこも直すよ。上流の修正(commit a664bf3d603d)は 2017 年の in-place 最適化を差し戻すもので、Cloudflare はこれをバックポートしたカーネルを主要な LTS 向けにビルドして、段階的な再起動自動化で配っていったんだって。ちなみに Cloudflare は 330 都市にまたがる巨大な Linux 基盤を動かしてて、大半が 6.12 LTS、一部が 6.18 LTS に移行中。カスタムカーネルは毎週くらいのペースでビルドしてるらしいよ。

まとめ

  • 「Copy Fail」(CVE-2026-31431)は algif_aead の境界外書き込みで root を奪えるローカル権限昇格の脆弱性
  • Cloudflare は既存の挙動検知で数分のうちに発見、48 時間さかのぼって悪用ゼロを確認
  • モジュール停止はソフトが壊れて失敗、bpf-lsm で許可リスト方式の「外科手術」に切り替えて成功
  • 上流の commit a664bf3d603d を取り込んだカーネルを段階再起動で展開、顧客影響はゼロ

カーネルまわりの運用やインシデント対応をやってる人、eBPF や LSM で守りを固めたい人にはめちゃくちゃ刺さる内容だよ。しぃちゃんも「モジュール止めずにドアだけ閉める」発想、すごく勉強になったな。