Skip to content

Found in Hours

先日の朝、RSSにCVEが流れていた。CVE-2026-31431、Copy Fail。Linuxカーネルのalgif_aeadモジュールに4バイトの書き込みを起こせる脆弱性で、setuidバイナリのページキャッシュを書き換えてrootを取れる。エクスプロイトは732バイトのPythonスクリプト。2017年に仕込まれて以来、9年気づかれていなかった。

ローカル攻撃なので、外向きのサービスがいきなり持っていかれる種類の話ではない。インフラを抱えている側からすると、定時イベントに近い。modprobe.dにブラックリストを置いて、再起動を計画して、終わり。IDCの機材も影響範囲だったので、Ansibleで全台に流した。プレイブックはClaude Codeに書かせ、わたしは方針と承認だけ出した。

驚いたのは見つけ方のほうだった。Theoriの研究者が自前のAIツールに「crypto/サブシステムをユーザー空間からのsyscallで辿ってくれ」と頼んだら、数時間で出てきたらしい。9年間、人間が見落としていた論理バグだ。

これまでも大物の脆弱性はいろいろあった。Heartbleedはメモリの境界を越える読み出し、Dirty COWはCoWのレース、Log4ShellはJNDIの再帰的展開。どれも人間が、コミットログを読み、ファザーを書き、夜中にデバッガを回して見つけた。Copy Failの「数時間」とは、時間軸が違う。

コードを書く側にAIが入ってきたように、コードを壊す側にも入った。これからは両側で同時に走る。CVEの数は確実に増える。RSSを手で読んでいる自分が、急に古臭く見えてくる。そこもLLMに食わせて、関係するものだけDiscordに流すところまで任せていい。攻守の両方にAIを置かないと、見つける側だけが先に走る。

ただ、報告されているうちは救いだ。番号が振られ、メーリングリストで議論され、パッチが上流に流れ、ディストリが取り込んでくれる。可視化されたものには手の打ちようがある。今回のCopy Failは、その意味で「いい結果」のほうだった。

怖いのは、同じプロンプトを渡したのが研究者ではなかった世界線のほうだ。発見が早いということは、悪意の側のストックの増え方も早いということだ。報告されない発見は、たぶん報告される発見よりずっと多い。

入られていても気づかない、というのがいちばん怖い。根っこのところは20年変わっていない。変わったのは、見つけてくる側の手数だけだ。

Ansibleの結果がGreenで返ってきて、Discordに完了メッセージが流れる。次のCVEは、たぶんもうどこかのAIが書きかけている。