1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ゼロデイ解説】DirtyFlag脆弱性の全貌・Dirty COW・Dirty Pipe・Dirty Fragのエクスプロイトコードを完全分解する

1
Posted at

Linuxカーネルの内部に潜む、ある「フラグの見落とし」が権限昇格を引き起こす――
本記事では Dirty COW(CVE-2016-5195)Dirty Pipe(CVE-2022-0847)Dirty Frag(CVE-2026-43284 / CVE-2026-43500) の仕組みを、実際のGitHub上のPoC・カーネルソースを交えて徹底的に解説します。

※ 本記事は教育・研究目的のみです。無断の攻撃行為は不正アクセス禁止法違反となります。

DirtyFlag 系脆弱性とは何か

Dirty COW はページの dirty フラグ、Dirty Pipe はパイプバッファの PIPE_BUF_FLAG_CAN_MERGE フラグ、Dirty Frag は struct sk_buff の frag メンバ――どれも「フラグの管理ミス」が根本原因であることから、本記事ではこれらを総称して「DirtyFlag 系」と呼びます(便宜的な呼称です)。

これら3つはすべて「読み取り専用ファイルへの書き込み」という結果をもたらし、ローカルユーザーが root 権限を取得できます。

核心はここ。 「書き込み不可のメモリマッピングやバッファに、レースコンディションまたは未初期化・不正フラグを通じて書き込みが行える」という点です。

Dirty COW(CVE-2016-5195)の仕組み

影響範囲はカーネル 2.6.22 〜 4.8.3未満です。 2007年から約9年間存在し続けた脆弱性です。

仕組みを整理すると、以下の流れになります。

  1. mmap() で読み取り専用ファイルをプライベートマッピング
  2. madvise(MADV_DONTNEED) でカーネルにページを解放させる
  3. その解放の瞬間に /proc/self/mem への write() を同時実行
  4. COW の dirty フラグ更新処理をすり抜け、読み取り専用ファイルへの書き込みに成功する

mm/gup.c における修正コミットです(follow_page_pte 周辺のレースを塞いだパッチ本体)。

Dirty COW の PoC コード

firefart 氏による代表的な PoC です(/etc/passwd の root エントリを書き換え、パスワードなしで root ログイン可能にします)。

公式リポジトリの pokemon メソッドによる PoC です。

コンパイルと実行は以下の通りです。

gcc -pthread dirty.c -o dirty -lcrypt
./dirty [new-password]
# 検証後は必ず復元する
mv /tmp/passwd.bak /etc/passwd

重要。 自分が管理する検証環境以外での実行は違法です。

Dirty Pipe(CVE-2022-0847)の仕組み

影響範囲はカーネル 4.9以上かつ 5.16.11 / 5.15.25 / 5.10.102未満です。
Ubuntu 公式の調査によると、脆弱性の第1コミットはカーネル 4.9以降に存在します。完全な攻撃チェーンには 5.8以降が必要ですが、4.9〜5.8 の範囲でも部分的な悪用の可能性があります。なお Ubuntu 独自カーネル(-generic)はバージョン番号が修正済み範囲を超えていても、Ubuntu Security Team のバックポートパッチが未適用の場合は依然として影響を受けます。

Dirty Pipe は Dirty COW とは異なり、レースコンディションが不要です。pipe_buf 構造体の flags メンバが未初期化のまま使われるため、PIPE_BUF_FLAG_CAN_MERGE フラグが意図せず立った状態になります。

仕組みを整理すると、以下の流れになります。

  1. pipe() でパイプを作成し、バッファを使い切って CAN_MERGE フラグを「汚した」状態にする
  2. splice() でターゲットの読み取り専用ファイルをパイプに引き込む
  3. write() でパイプに書き込むと、CAN_MERGE フラグのせいでページキャッシュに直接マージされる
  4. ファイルのページキャッシュが上書きされ、読み取り専用ファイルへの書き込みが成立する

修正コミットです(fs/pipe.c における pipe_buf フラグの初期化処理追加)。

Dirty Pipe の PoC コード

AlexisAhmed 氏による2種のエクスプロイト集です(読み取り専用ファイル上書き + SUID バイナリ経由の root シェル取得)。

Arinerron 氏による改変版です(/etc/passwd 書き換え → root シェル → 自動復元)。

./compile.sh
./exploit
# → root シェルが起動する

ここが肝。 Dirty Pipe はレースが不要なぶん、ほぼ確実に1回で成功します。 Dirty COW より圧倒的に信頼性が高い攻撃手法です。

Dirty Frag(CVE-2026-43284 / CVE-2026-43500)の仕組み

影響範囲は2017年1月(xfrm-ESP)および2023年6月(RxRPC)以降の全カーネルです。2026年5月現在、いかなるディストリにも正式パッチは存在しません。

Dirty Frag は Hyunwoo Kim(@v4bel)氏が発見・報告した脆弱性で、Dirty Pipe の直系の子孫にあたります。2つの独立した脆弱性をチェーンすることで、主要な全ディストリで root 権限取得が可能です。

仕組みを整理すると、以下の流れになります。

  1. xfrm-ESP Page-Cache Write — xfrm(IPsec)の ESP 処理を悪用し、4バイトの任意書き込みプリミティブを取得する(名前空間作成権限が必要)
  2. RxRPC Page-Cache Writerxrpc.ko モジュールを悪用し、名前空間権限なしで同様の書き込みプリミティブを取得する(Ubuntu ではデフォルトでロード済み)
  3. 2つを組み合わせることで、AppArmor による名前空間ブロックを回避しつつ全ディストリで root 権限を取得できる

重要。 Ubuntu が適用している AppArmor による「Copy Fail の緩和策(algif_aead ブラックリスト)」は Dirty Frag には無効です。

PoC リポジトリです(発見者 V4bel 氏による公式 PoC)。

# Dirty Frag PoC のビルドと実行
git clone https://github.com/V4bel/dirtyfrag.git
cd dirtyfrag && gcc -O0 -Wall -o exp exp.c -lutil
./exp
# 実行後はページキャッシュを汚染するため必ず以下を実行すること
echo 3 > /proc/sys/vm/drop_caches

攻撃チェーン全体像

実際の権限昇格シナリオでは、以下のような流れになります。

  1. 情報収集uname -r でカーネルバージョンを確認し、パッチ状況を調査する
  2. PoC 入手・調整 — ターゲットのディストリビューションに合わせてコンパイルする
  3. レース実行 or フラグ悪用 — Dirty COW は CPU コア数が多いほど成功率が上がる / Dirty Pipe・Dirty Frag はレース不要でほぼ一発
  4. ペイロード書き込み/etc/passwd の書き換えや SUID バイナリへのペイロード注入
  5. 痕跡確認 — 攻撃者はログ削除・バックドア設置を試みるため、/var/log の改ざん有無や新規 SUID バイナリの存在を確認する

検出・緩和策

パッチ状況の確認

# まず自分のカーネルバージョンを確認する
uname -r

# Dirty COW: カーネル 2.6.22〜4.8.3未満が対象。4.8.3以降の公式リリースは修正済み
# Dirty Pipe: カーネル 4.9以降(完全な攻撃は 5.8以降)かつ 5.16.11/5.15.25/5.10.102未満が対象
#             ※ Ubuntu など独自カーネルは uname -r のバージョンだけで安全を判断できない
#               USN アドバイザリ(https://ubuntu.com/security/notices)を必ず確認すること
# Dirty Frag: 2026年5月現在、全ディストリでパッチなし。以下のモジュール無効化で緩和する

# RHEL/CentOS系
rpm -q --changelog kernel | grep -i "CVE-2016-5195\|CVE-2022-0847"
# Debian/Ubuntu系
apt changelog linux-image-$(uname -r) | grep -i "CVE-2016-5195\|CVE-2022-0847"

Dirty Frag の緩和策(現時点で唯一の対処法)

# esp4 / esp6 / rxrpc モジュールを無効化してページキャッシュを解放する
sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' \
  > /etc/modprobe.d/dirtyfrag.conf; \
  rmmod esp4 esp6 rxrpc 2>/dev/null; \
  echo 3 > /proc/sys/vm/drop_caches; true"

注意。 esp4 / esp6 モジュールを無効化すると IPsec(ESP)が利用できなくなります。VPN 等で IPsec を使用している環境では影響を確認した上で適用してください。

ランタイム検出シグネチャ

以下のパターンが同時に観測された場合は攻撃の可能性を疑ってください。

  • /proc/<pid>/mem への書き込みアクセス(Dirty COW)
  • madvise(MADV_DONTNEED) の異常な高頻度呼び出し(毎秒数百回以上)
  • splice() + write() による pipe バッファへの予期しない書き込み(Dirty Pipe)
  • xfrm / rxrpc モジュールの予期しないロード(Dirty Frag)
  • 読み取り専用マッピングに対応するファイルの mtime 変化

まとめ

DirtyFlag 系脆弱性の本質は、「カーネルが信頼しているフラグの一貫性を崩す」という点に集約されます。

このパターンは今後も続きます。 Dirty COW(2016年)→ Dirty Pipe(2022年)→ Dirty Frag(2026年)と、フラグ管理の不備は形を変えて繰り返し現れます。Dirty Frag は2026年5月現在も正式パッチが存在せず、現実的な脅威として今も進行中です。seccomp/proc/self/mem への書き込みをブロックし、AppArmor プロファイルでアプリごとのアクセスを制限しつつ、各ディストリのセキュリティアドバイザリを継続的に監視することが不可欠です。

本記事執筆にあたり参照した情報源

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?