🔍 CVE-2026-99186

0.0
CVSS Score
UNKNOWN
2026-10-28
2026-10-28 11:17
✅ 완료

🇰🇷 한글 설명

Linux 커널 x86 명령어 에뮬레이션 코드(insn-eval)에서 get_seg_reg_override_idx() 함수의 지역 변수가 for_each_insn_prefix() 매크로의 루프 카운터와 이름이 겹쳐 세그먼트 오버라이드 값이 손상되는 문제이다. CS 프리픽스가 있으면 무한 루프가 발생하고, FS/GS 프리픽스는 잘못된 주소에 결과를 기록한다.

💡 쉬운 설명

리눅스 커널 내부에서 변수 이름이 겹쳐 잘못된 값이 쓰이는 버그입니다. 일반 사용자 프로그램이 특정 명령을 실행하면 CPU가 무한 루프에 빠져 시스템이 멈출 수 있습니다.

🇺🇸 원문 (English)

In the Linux kernel, the following vulnerability has been resolved: x86/insn-eval: Fix shadowed segment index in get_seg_reg_override_idx() Commit 45e1dccc0653 ("x86/insn: Simplify for_each_insn_prefix()") made for_each_insn_prefix() declare its own loop counter named idx. get_seg_reg_override_idx() keeps its result in a local of the same name, so the assignments in the loop body now write the loop counter: - the function always returns INAT_SEG_REG_DEFAULT, so FS and GS overrides are ignored; - a CS override sets the counter to INAT_SEG_REG_CS (2), the increment makes it 3, and prefixes.bytes[3] holds the last prefix, 0x2e again, so the loop never terminates. The UMIP emulation reaches this from the #GP handler for user space: an SGDT, SIDT or SMSW with a memory operand and a CS prefix leaves the task spinning in the kernel, never returning to user space, with a SIGKILL that is never delivered. Any user can thus tie up CPUs until reboot. With an FS or GS prefix, the emulated result is written to the wrong address. Rename the internal macro iterator variable. [ Lukas' original patch renamed the use site, I changed it to rename the iterator in the macro instead, but left Lukas' commit message and authorship - Linus ]

📍 영향받는 시스템

UMIP 에뮬레이션을 사용하는 x86 기반 Linux 커널 (커밋 45e1dccc0653 이후 버전)

⚔️ 공격 벡터

일반 사용자 권한으로 CS 세그먼트 프리픽스가 붙은 SGDT, SIDT, SMSW 명령(메모리 피연산자)을 실행하여 커널을 무한 루프에 빠뜨림으로써 CPU 점유 및 서비스 거부(DoS)를 유발

🛡️ 대응 방법

커널 패치를 적용하여 매크로 반복 변수 이름을 변경한 최신 안정 버전으로 업데이트

🔧 검증 코드

출력된 커널 버전을 배포판 보안 공지 또는 Linux 커널 패치 목록과 대조하여, 해당 수정이 포함된 버전인지 확인하며 수정 전 버전이면 취약한 것으로 판단

Shell / Script
uname -r

💻 영향받는 소프트웨어

Linux Kernel