Copy Fail / DirtyFrag を検知する:Linux カーネルの page cache 攻撃と5つの検知ルール

Tech Blog thumbnail with red code background and a white logo, announcing a Linux kernel page cache attack detection article in Japanese BLOG

Linuxは、多くの企業システム、クラウド環境、コンテナ基盤で使われています。 そのため、Linuxカーネルに深刻な脆弱性が見つかると、影響はとても大きくなります。

Elastic Security Labs は、Linuxカーネルの権限昇格脆弱性である Copy Fail (CVE-2026-31431)、Copy Fail 2、そして DirtyFrag を分析しました。これらは、Linuxの page cache に関係するバグを悪用し、通常ユーザーから root権限 を取得できる可能性がある攻撃です。

特に Copy Fail (CVE-2026-31431) は実際の攻撃で悪用されたことが報告されており、米国CISAの Known Exploited Vulnerabilities (KEV) カタログ にも追加されています。KEVカタログに載るということは、「机上の脆弱性」ではなく「現実に攻撃で使われている脆弱性」であることを意味します。米国の連邦機関は期限内のパッチ適用が義務付けられるレベルであり、民間企業にとっても優先対応すべき強いシグナルです。

この記事では、この攻撃をセキュリティ初心者にもわかるように整理しながら、Elastic Securityがどのように脅威を分析し、検知につなげているのか、そして Elasticが公開している検知ルール を紹介します。

まず、何が危険なのか?

今回のポイントは、攻撃者がLinux上で root権限 を取得できる可能性があることです。

rootとは、Linuxにおける最も強い権限を持つユーザーです。 たとえるなら、ビル全体のマスターキーを持つ管理者のような存在です。

通常ユーザーは、自分の部屋や許可された場所にしか入れません。 しかしrootは、システム全体の設定変更、ファイルの読み書き、プロセスの停止、ユーザー作成など、多くの操作ができます。

つまり、攻撃者がroot権限を取ると、次のようなことが可能になります。

  • 機密ファイルを読む
  • セキュリティツールを止める
  • マルウェアを設置する
  • ログを改ざんする
  • 他のシステムへ侵入する足がかりを作る

これは、単なる「1台のLinuxサーバーの問題」ではありません。 企業のクラウド環境、コンテナ基盤、業務システム全体に影響する可能性があります。

page cache とは何か?

今回の攻撃を理解するために、まず page cache を理解する必要があります。

page cacheとは、Linuxがファイルアクセスを速くするために使うメモリ上の一時的な保管場所です。

たとえば、図書館をイメージしてください。

本棚にある本が「ディスク上のファイル」だとします。 でも、よく読まれる本を毎回本棚まで取りに行くのは面倒です。 そこで図書館員は、よく使う本のコピーを机の上に置いておきます。

この「机の上のコピー」が、Linuxでいう page cache です。

たとえLinux
本棚の本ディスク上のファイル
机の上のコピーpage cache
図書館員Linuxカーネル
本を読む人アプリケーション

通常、page cacheは便利な仕組みです。 ファイルを毎回ディスクから読むより、メモリから読んだ方が速いからです。

しかし、今回のような脆弱性では、この「メモリ上のコピー」が悪用されます。

page cache corruption とは?

page cache corruption とは、簡単に言うと、Linuxが信頼しているメモリ上のファイルコピーを不正に書き換えることです。

重要なのは、攻撃者が必ずしもディスク上の本物のファイルを書き換えるわけではない、という点です。 本物のファイルは変わっていないように見えます。 しかし、Linuxが実際に使うメモリ上のコピーだけが壊されている可能性があります。

これは非常に厄介です。 なぜなら、ファイルの改ざんチェックをしても、ディスク上のファイルは正常に見えることがあるからです。 一方で、システムは壊されたpage cacheの内容を使ってしまう可能性があります。

たとえるなら、会社の正式な契約書は金庫の中で無事なのに、担当者が机の上に置いていたコピーだけがこっそり書き換えられている状態です。 担当者がそのコピーを信じて処理を進めると、間違った判断につながります。

Copy Fail は何をするのか?

Elasticの説明によると、Copy Fail は Linuxカーネルの暗号処理(authencesn テンプレート)に関係するロジックバグです。AF_ALG と splice() という Linux の正規機能を組み合わせることで、読み取り可能なファイルのpage cacheに対して、制御された4バイトの書き込みを行えると説明されています。

ここで重要なのは、これが setuidバイナリ に対して使われるという点です。

setuid バイナリとは 実行したユーザーではなく、ファイルの所有者の権限で動く特殊なプログラムです。

たとえば /usr/bin/su は所有者がrootで、setuid が設定されているため、認証処理などの一部の処理をroot権限で実行できます。もちろん、通常はパスワード確認などの認証があるため、誰でも自由にrootになれるわけではありません。

しかし、この「root権限で動く部分」こそが攻撃者の標的になります。Copy Fail のような攻撃では、ディスク上のファイルを直接書き換えるのではなく、page cache上のバイナリ内容を壊すことで、root権限で実行される処理を悪用しようとします。

実際に Copy Fail では、/usr/bin/su のようなsetuidバイナリのメモリ上の見え方を壊し、ディスク上のファイルを変更せずに権限昇格 につなげることができます。公開されている攻撃コードは、わずか732バイトのPythonスクリプトで、Ubuntu、Amazon Linux、RHEL、SUSE といった主要ディストリビューションで動作します。

ここで重要なのは、攻撃者が「怪しいマルウェア」だけを使っているわけではないことです。 AF_ALG も splice() も、Linuxに存在する正規の仕組みです。 つまり攻撃は、完全に外部から見て明らかに怪しい動作だけで成り立っているわけではありません。 正規のLinux機能を組み合わせて、カーネルの細かいバグを突いています。

これが、検知を難しくします。

DirtyFrag は何が違うのか?

DirtyFragも、page cache corruption を悪用する Linuxカーネルの権限昇格攻撃です。 基本の考え方は Copy Fail と似ていますが、攻撃経路がネットワークスタックに広がっている 点が大きく異なります。

Elasticのブログによると、DirtyFragには2つの経路があります。

経路使われる仕組み攻撃対象結果
ESPパスAF_NETLINK 経由のXFRM SA/usr/bin/susuを最小限のroot shell ELFで上書き
RxRPCパス(フォールバック)AF_RXRPC + pcbc(fcrypt)/etc/passwdrootのパスワードフィールドをクリア

/etc/passwd のrootパスワードフィールドがクリアされると、環境によってはパスワードなしでrootとして認証が通ってしまう可能性があります。

実際の挙動は、PAM や SSH の設定、shadow ファイルの運用状況によって変わります。しかし、いずれにしても、root認証の前提を壊す重大な改ざんであることに変わりはありません。

さらに、両方の経路ともに unshare(CLONE_NEWUSER | CLONE_NEWNET) を使って namespace capability を取得する前段が必要です。これは、後述する検知ロジックで重要なポイントになります。

⚠️ ここが最重要:Copy Fail のパッチだけでは不十分

Elasticのブログが警告している最も重要なポイントは次のことです。

DirtyFrag は algif_aead モジュールに依存しません。 つまり、Copy Fail の緩和策(algif_aead を無効化する)だけを適用したシステムは、依然としてDirtyFragに脆弱なままです。

「Copy Fail対策はやったから安心」という思い込みが、最も危険な状態を生みます。 両方の脆弱性に対して、それぞれ独立した対策が必要 です。

なぜ Elastic の分析が重要なのか?

ここからが、Elastic Securityを理解するうえで大事なポイントです。

Elasticは、単に「特定の攻撃コードを見つけましょう」という見方だけをしていません。

セキュリティ研究者は、新しい脆弱性が見つかると、しばしば PoC(Proof of Concept) と呼ばれる実証コードを公開します。これは「この攻撃が本当に可能であることを示すデモコード」であり、防御側が脆弱性を理解し、対策を検証するために使われます。

しかし、攻撃者はこの実証コードをそのままの形で使うとは限りません。 Pythonで書かれたコードを、GoやRustやCに書き換えることもできます。 ファイル名やプロセス名を変えることもできます。実行方法を少し変えることもできます。

実際、Copy Fail はすでに Python / Go / Rust / C / Metasploit など、複数の言語・フレームワークで実装が公開されており、DirtyFrag も C言語版の実装が公開されています。

そのため、特定の攻撃コードの見た目だけを検知していると、少し変えられただけで見逃す可能性があります

Elasticが重視しているのは、攻撃の primitivebehavior です。

primitive とは、攻撃を構成する小さな技術的な部品のことです。

たとえば、ビルへの侵入で考えると、攻撃全体は「不正侵入」です。 その中のprimitiveは、次のような小さな行動です。

  • 鍵をこじ開ける
  • 監視カメラを避ける
  • 裏口を使う
  • 管理室に入る

Linux攻撃で言えば、primitiveは次のようなものです。

  • AF_ALG を使う
  • splice() を使う
  • page cache を壊す
  • setuidバイナリを悪用する
  • unshare() でnamespaceを作る

Elasticは、攻撃コードそのものだけでなく、こうした攻撃の部品や行動パターンを見ようとしています。 これは、現代のセキュリティ検知において非常に重要です。

Elastic が公開した検知ルール5本

今回 Elastic Security Labs は、Copy Fail / DirtyFrag に対応する検知ルールを公開しました。 ここで重要なのは、これらのルールはすべて GitHub で誰でも見られる ということです(後述)。

以下、5本のルールがそれぞれ「何を検知するか」を簡潔に紹介します。

1. Potential Copy Fail (CVE-2026-31431) Exploitation via AF_ALG Socket

何を検知するか: 非rootユーザーが AF_ALG ソケット(暗号処理用の特殊なソケット)と splice() を組み合わせて使い、その後 root 権限のプロセス実行やシェル起動につながる流れ。

攻撃のどこで効くか: Copy Fail の最も核心的なプリミティブを直接捉えます。

前提条件: このルールを有効に活用するには、Linux 上で auditd 系のログを Elastic に取り込んでいる必要があります。具体的には、Elastic Agent の Auditd Manager integration や Auditbeat の設定が必要です。これらがない環境では、socket や splice のような低レベルな syscall の動きは見えません。

🔗 GitHubでルールの実物を見る

2. Suspicious SUID Binary Execution

何を検知するか: su、sudo、pkexec、passwd などのSUIDバイナリが、不審な親プロセス(PythonやRubyなどのスクリプトランタイム、/tmp や /dev/shm といったユーザー書き込み可能パスからの実行)から、最小限の引数で呼び出されるパターン。

攻撃のどこで効くか: Copy Fail / DirtyFrag の両方の 最終段階(root権限取得の瞬間)を捉えます。auditd が入っていない環境でも、プロセス実行イベントだけで動作するため、適用範囲が広いのが特徴です。

🔗 GitHubでルールの実物を見る

3. Suspicious Kernel Feature Activity

何を検知するか: sysctl などによるカーネル機能の不審な操作。攻撃者が防御機構を無効化したり、カーネル動作を変更したりする動きを捉えます。

位置づけ: このルールは Copy Fail / DirtyFrag 専用というより、攻撃者がカーネル機能を不審に操作する動きを広く見るための補助的な検知です。今回のようなカーネル悪用の文脈でも、関連する不審な操作を見つけるための追加レイヤーとして役立ちます。

🔗 GitHubでルールの実物を見る

4. Namespace Manipulation Using Unshare

何を検知するか: unshare コマンドや syscall によるユーザーネームスペース(特に CLONE_NEWUSER | CLONE_NEWNET)の作成と、その直後の root プロセス実行・setuid(0) の相関。

攻撃のどこで効くか: DirtyFrag 固有の前段 を捉えます。DirtyFrag は namespace の取得が必須なので、ここを潰すと攻撃チェーン全体が成立しなくなります。

前提条件: このルールも、syscall レベルの検知部分は auditd 系のログが必要です。プロセス実行イベントの部分は Elastic Agent / Endpoint で取得できます。

🔗 GitHubでルールの実物を見る

5. Privilege Escalation via SUID/SGID

何を検知するか: SUID/SGIDバイナリを悪用した権限昇格全般のパターン。Copy Fail / DirtyFrag に限らず、類似の権限昇格手法を広くカバーします。

攻撃のどこで効くか: 汎用的な権限昇格の最終段階。Copy Fail / DirtyFrag の派生や、まだ公開されていない類似手法にも備える保険的なルールです。

🔗 GitHubでルールの実物を見る

5本のルールがどう連携するか

これらのルールは、それぞれ独立して動きますが、攻撃の異なる段階を多層的にカバーする設計 になっています。

攻撃者が1つの段階を回避しても、別の段階で検知できる 多層防御(defense in depth) の考え方です。

Elastic の強み:すべての検知ルールが GitHub で公開されている

ここで、Elastic Security の重要な特徴をお伝えします。

Elastic は、商用製品の検知ルールをすべて GitHub で公開しています。

リポジトリはこちらです: 🔗elastic/detection-rules

このリポジトリには、Elastic Security で使われる検知ルールが TOML 形式で格納されており、誰でも自由に閲覧・Fork・コメント・Pull Request 可能 です。

これがなぜ重要なのか?

セキュリティ運用において、検知ルールの中身がわからないことは、いくつもの問題を引き起こします。

検知ルールが見られない場合検知ルールが公開されている場合
アラートが出たが、なぜ発火したかわからないルールのロジックを読んで理由を理解できる
誤検知が出ても、チューニングできない条件を読んで、自社環境向けに例外を追加できる
「ベンダーを信じるしかない」状態自分でレビューして納得できる
検知漏れがあっても、原因がわからないロジックの穴を発見し、改善提案できる
コミュニティ知見が共有されないOSSとしてコミュニティに還元できる

なお、検知ルールを公開しているベンダーは Elastic だけではありません。Microsoft Sentinel も Analytics rules を GitHub で公開しており、透明性の高いアプローチを取っています。一方、多くの商用 EDR/SIEM 製品では検知ロジックが非公開で、ユーザーがルールの中身を確認できないことも珍しくありません。Elastic は早い段階からこの公開方針を一貫して続けている点が特徴です。

日本のユーザーにとっての意味

日本では、Elastic を完全に理解しているエンジニアはまだ多くありません。 だからこそ、ルールがオープンソースとして公開されている ことの価値は大きいです。

  • 英語のブログを完全に理解できなくても、TOMLファイルを読めば検知ロジックがわかる
  • 社内SOCのナレッジとして ルールを写経・改造して学べる
  • 自社環境特有の誤検知に対して 自分で例外条件を追加できる
  • 日本語コミュニティで ルールの解釈を議論できる

ビジネス視点でなぜ重要なのか?

この話は、セキュリティ研究者だけのものではありません。 企業にとって重要なのは、次の3つです。

1つ目は、被害の早期発見です。 root権限を取られると、攻撃者はより深くシステムに入り込めます。早く気づければ、被害を小さくできます。

2つ目は、調査時間の短縮です。 SOCやセキュリティ担当者は、毎日多くのアラートを見ています。Elastic Securityのように、攻撃の流れを見せられる仕組みがあると、「これは何が起きているのか」を早く理解できます。

3つ目は、未知・変種への対応力です。 攻撃者は攻撃コードを書き換えます。ツール名も変えます。実行方法も変えます。 しかし、攻撃に必要な基本行動は大きく変わりにくいです。 だからこそ、Elasticが重視している「ふるまい検知」は、ビジネスにとっても価値があります。

まとめ:Elastic Security は「攻撃の形」ではなく「攻撃の動き」を見る

Copy Fail や DirtyFrag は、Linuxカーネルの細かいバグを悪用する高度な攻撃です。 しかし、初心者向けに一言でまとめるなら、こう言えます。

Linuxが高速化のために使っている page cache を悪用し、メモリ上のファイル内容を壊すことで、通常ユーザーから root権限を取る攻撃です。

そして、Elastic Security Labs の重要な貢献は、これを単なる脆弱性情報として紹介するだけでなく、実際の検知ルールに落とし込み、GitHub で公開している 点です。

特定の攻撃コードだけを見るのではなく、攻撃に必要な primitive や behavior を見る。 そして、そのロジックをオープンにすることで、コミュニティ全体の防御力を底上げする。 これは、現代のセキュリティ運用においてとても重要な考え方です。

攻撃者はコードの見た目を変えられます。 しかし、root権限を取るために必要な行動の流れは、完全には隠しにくいです。

Elastic Security は、その流れをデータから見つけるためのプラットフォームです。 そして、その検知ロジックを オープンに、透明に、コミュニティと共に進化させている のが、Elastic の大きな強みです。

参考リンク


この記事は、Elastic Security Labs が公開した英語ブログ「Copy Fail and DirtyFrag: Linux Page Cache Bugs in the Wild」をもとに、日本のElastic利用者向けに整理・補足したものです。