
CVE-2026-23416 (linux kernel 6.17 – linux kernel 7 rc5)용 POC - Antonius가 발견한 취약점
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, stable 백포트 6.18.21, 6.19.11 |
| 필요한 접근 권한 | 권한 없는 사용자 (UID 1000, capabilities 없음) |
| 사용된 시스템 콜 | 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는 이제 오래된 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으로 컴파일됨)에서는 오래된 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를 무조건 설정하고, 추가로 입력 범위와 VMA 경계에서 파생된 const 값으로 curr_start/curr_end를 제한합니다:
/* AFTER fix */
curr_end = vma->vm_end; // unconditional, always fresh
PoC는 두 번째 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)
두 번째 mseal(m2, 0x70000) 호출은 [0x21da6000 – 0x21e15fff]를 대상으로 하며, 봉인된 VMA-A에서 봉인되지 않은 VMA-B까지 걸쳐 있습니다. mseal_apply() 내부에서는 VMA-B를 처리할 때 VMA-A의 오래된 curr_end가 curr_start로 사용되어 불일치된 vmg 상태가 만들어집니다.
memfd_create + mmap + mseal만 필요하며 CAP_*는 필요하지 않습니다.mseal(2)는 보안 프리미티브 — VMA 불변성을 보호합니다. 적용 과정의 논리 오류는 서로 다른 봉인 상태를 가진 VMA에 걸쳐 적용될 때 VM_SEALED가 조용히 잘못 적용될 수 있음을 의미합니다.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 필요 (프로덕션 커널에서는 버그가 여전히 존재하지만 조용히 진행됨)7.0-rc6 및 stable 백포트에 적용된 3개의 업스트림 수정 커밋:
| 커밋 | 트리 |
|---|---|
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 — Tangerang, Indonesia
GitHub: bluedragonsecurity
이 PoC는 교육 및 연구 목적으로 공개되었습니다.
83737e34b83a| stable |
2697dd8ae721 | stable |