🇰🇷 한글 설명
리눅스 커널의 fbdev 구성 요소에서 pagelist 손상이 발생하는 취약점입니다. fb_deferred_io_mkwrite()와 fb_deferred_io_fault() 함수 간의 잠금(lock) 부재로 인한 레이스 컨디션이 원인이며, 이로 인해 리스트 구조가 깨질 수 있습니다.
💡 쉬운 설명
두 개의 작업이 동시에 같은 데이터를 수정하려고 할 때 충돌이 발생하는 문제입니다. 이 충돌로 인해 시스템의 메모리 관리 목록이 엉망이 되어 시스템이 멈추거나 오류가 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
fbdev: defio: fix the pagelist corruption
Easily hit the below list corruption:
==
list_add corruption. prev->next should be next (ffffffffc0ceb090), but
was ffffec604507edc8. (prev=ffffec604507edc8).
WARNING: CPU: 65 PID: 3959 at lib/list_debug.c:26
__list_add_valid+0x53/0x80
CPU: 65 PID: 3959 Comm: fbdev Tainted: G U
RIP: 0010:__list_add_valid+0x53/0x80
Call Trace:
<TASK>
fb_deferred_io_mkwrite+0xea/0x150
do_page_mkwrite+0x57/0xc0
do_wp_page+0x278/0x2f0
__handle_mm_fault+0xdc2/0x1590
handle_mm_fault+0xdd/0x2c0
do_user_addr_fault+0x1d3/0x650
exc_page_fault+0x77/0x180
? asm_exc_page_fault+0x8/0x30
asm_exc_page_fault+0x1e/0x30
RIP: 0033:0x7fd98fc8fad1
==
Figure out the race happens when one process is adding &page->lru into
the pagelist tail in fb_deferred_io_mkwrite(), another process is
re-initializing the same &page->lru in fb_deferred_io_fault(), which is
not protected by the lock.
This fix is to init all the page lists one time during initialization,
it not only fixes the list corruption, but also avoids INIT_LIST_HEAD()
redundantly.
V2: change "int i" to "unsigned int i" (Geert Uytterhoeven)
📍 영향받는 시스템
리눅스 커널 (fbdev 관련 모듈 사용 시스템)
⚔️ 공격 벡터
로컬 공격자가 특정 메모리 조작을 통해 레이스 컨디션을 유도하여 커널 오류를 발생시킴
🛡️ 대응 방법
리눅스 커널을 최신 보안 패치가 적용된 버전으로 업데이트
🔧 검증 코드
출력된 커널 버전을 확인하여 해당 취약점이 해결된 패치 버전인지 확인