
mm/mseal: マージ時にVMA endを正しく更新
脆弱性の発見者: Antonius / Blue Dragon Security
| 項目 | 詳細 |
|---|---|
| CVE ID | CVE-2026-23416 |
| サブシステム | mm/mseal — mm/vma.c |
| 影響を受けるバージョン | Linuxカーネル 6.17 から 7.0-rc5 |
| 修正バージョン | Linux 7.0-rc6、安定版バックポート 6.18.21、6.19.11 |
| 必要なアクセス権 | 非特権ユーザー(UID 1000、ケーパビリティなし) |
| 使用するシステムコール | memfd_create, mmap, mseal |
| 再現性 | 100%決定的、1秒未満 |
| 予約日 | 2026-01-13 |
| 公開日 | 2026-04-02 |
このバグは、mm/mseal.c内のmseal_apply()に存在します。mseal(2)システムコールを適用するためにVMAを反復処理する際、この関数はcurr_startとcurr_endを使用して位置を追跡します:
/* Simplified pre-fix logic */
curr_end = vma->vm_end;
/* ... process VMA ... */
curr_start = curr_end; /* advance to next VMA */
問題は、反復処理中に呼び出されるvma_modify_flags()がVMAをマージし、vma->vm_endをその場で変更する可能性があることです。これにより、マージ前に取得されたcurr_endの値が**stale(古い値)**になります。次の反復処理では、curr_startがこのstaleになったcurr_endに設定されるため、誤った開始アドレスが生成されます。
デバッグカーネル(CONFIG_DEBUG_VM)では、この不整合なvmg状態により以下が発火します:
VM_WARN_ON_VMG(middle &&
((middle != prev && vmg->start != middle->vm_start) ||
vmg->end > middle->vm_end))
mm/vma.c:830でカーネルのWARNINGが生成されます。
本番カーネル(WARNがno-opにコンパイルされる)では、staleなcurr_startが警告なしで進行します。つまり、VM_SEALEDが可視のエラーなしに誤ったアドレス範囲に適用される可能性があり、mseal(2)が提供することを意図したセキュリティ保証を損なうことになります。
mseal(2)
└─ do_mseal() [mm/mseal.c]
└─ mseal_apply()
└─ vma_modify_flags() [mm/vma.c]
└─ vma_modify()
└─ vma_merge_existing_range()
└─ VM_WARN_ON_VMG fires at line 830
/* BEFORE fix — mm/mseal.c mseal_apply() */
curr_end = vma->vm_end; // captured here
/* ... vma_modify_flags() may merge VMAs, changing vma->vm_end ... */
curr_start = curr_end; // stale! merge is not reflected
修正では、各反復処理で潜在的なマージの後にcurr_end = vma->vm_endを無条件に設定し、さらにcurr_start/curr_endを入力範囲とVMA境界から導出されるconst値としてクランプします:
/* AFTER fix */
curr_end = vma->vm_end; // unconditional, always fresh
PoCは、2回目のmseal()呼び出しの前に以下のレイアウトを構築します:
[0x21da6000 - 0x21de5fff] VMA-A (fd2, MAP_SHARED|MAP_FIXED) ← VM_SEALED after step 1
[0x21de6000 - 0x21e82fff] VMA-B (fd2, MAP_SHARED|MAP_FIXED) ← NOT sealed
[0x21e83000 - 0x21e84fff] VMA-C (leftover)
2回目のmseal(m2, 0x70000)は[0x21da6000 – 0x21e15fff]を対象とし、VMA-A(シール済み)からVMA-B(未シール)にまたがります。mseal_apply()内では、VMA-Bの処理時にVMA-Aのstaleなcurr_endがcurr_startとして使用され、不整合なvmg状態が作成されます。
memfd_create + mmap + msealのみでよく、CAP_*は不要です。mseal(2)はセキュリティプリミティブです — VMAの不変性を保護します。適用時の論理エラーは、シール状態が混在するVMAにまたがる場合、VM_SEALEDが警告なしに誤適用される可能性があることを意味します。ファイル: cve-2026-23416-poc.c
gcc -o poc cve-2026-23416-poc.c
./poc
CONFIG_DEBUG_VM付きデバッグカーネル)============================================
CVE-2026-23416-POC
Discovered by : Antonius / Blue Dragon Security
https://bluedragonsec.com
https://github.com/bluedragonsecurity
============================================
[iter 0]
[iter 1]
...
[+] WARNING triggered N times total
dmesgで以下を確認してください:
WARNING: CPU: X PID: Y at mm/vma.c:830 vma_merge_existing_range+0x...
VM_WARN_ON_VMGを観測するにはCONFIG_DEBUG_VM=y(本番カーネルではバグは依然として存在しますが、サイレントです)上流の修正コミットが3つ(7.0-rc6および安定版バックポートに適用):
| コミット | ツリー |
|---|---|
40b3f4700e55 | stable |
修正済みカーネルバージョン: 7.0-rc6、6.18.21、6.19.11
| 日付 | 内容 |
|---|---|
| 2026-01-13 | CVE ID予約 |
| 2026-04-02 | CVE公開、修正コミットがマージ |
Antonius (@w1sdom)
Blue Dragon Security — インドネシア・タンゲラン
GitHub: bluedragonsecurity
本PoCは教育および研究目的で公開されています。
| stable |
2697dd8ae721 | stable |