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

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

## なにが発表されたの？

これは Cloudflare の Blog が公開した、[Copy Fail](https://copy.fail/) っていう Linux カーネルの脆弱性（[CVE-2026-31431](https://security-tracker.debian.org/tracker/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](https://blog.cloudflare.com/live-patch-security-vulnerabilities-with-ebpf-lsm/) を使った「外科手術」ミティゲーション。`socket_bind` っていう LSM フックに割り込んで、許可リストに載ったバイナリだけ `AF_ALG` ソケットを使えるようにして、それ以外は拒否するの。モジュールは生かしたまま、危ないドアだけ閉める感じだね。

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

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

```python
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](https://github.com/torvalds/linux/commit/a664bf3d603d)）は 2017 年の in-place 最適化を差し戻すもので、Cloudflare はこれをバックポートしたカーネルを主要な LTS 向けにビルドして、段階的な再起動自動化で配っていったんだって。ちなみに Cloudflare は [330 都市](https://www.cloudflare.com/network/)にまたがる巨大な Linux 基盤を動かしてて、大半が 6.12 LTS、一部が 6.18 LTS に移行中。カスタムカーネルは毎週くらいのペースでビルドしてるらしいよ。

## まとめ

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

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