🇰🇷 한글 설명
Linux 커널의 drm/xe/hmm 구성 요소에서 notifier lock을 획득하지 않고 struct page 포인터를 역참조하는 취약점이 발견되었습니다. 이로 인해 소유하지 않은 페이지를 dirty 또는 accessed 상태로 표시하거나 잘못된 메모리 주소에 접근할 위험이 있습니다.
💡 쉬운 설명
컴퓨터의 핵심 운영체제인 리눅스에서 메모리를 관리할 때, 안전 장치(잠금)를 확인하지 않고 메모리 주소를 읽으려다 발생하는 오류입니다. 이 오류를 이용하면 시스템이 불안정해지거나 잘못된 데이터에 접근할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
drm/xe/hmm: Don't dereference struct page pointers without notifier lock
The pnfs that we obtain from hmm_range_fault() point to pages that
we don't have a reference on, and the guarantee that they are still
in the cpu page-tables is that the notifier lock must be held and the
notifier seqno is still valid.
So while building the sg table and marking the pages accesses / dirty
we need to hold this lock with a validated seqno.
However, the lock is reclaim tainted which makes
sg_alloc_table_from_pages_segment() unusable, since it internally
allocates memory.
Instead build the sg-table manually. For the non-iommu case
this might lead to fewer coalesces, but if that's a problem it can
be fixed up later in the resource cursor code. For the iommu case,
the whole sg-table may still be coalesced to a single contigous
device va region.
This avoids marking pages that we don't own dirty and accessed, and
it also avoid dereferencing struct pages that we don't own.
v2:
- Use assert to check whether hmm pfns are valid (Matthew Auld)
- Take into account that large pages may cross range boundaries
(Matthew Auld)
v3:
- Don't unnecessarily check for a non-freed sg-table. (Matthew Auld)
- Add a missing up_read() in an error path. (Matthew Auld)
(cherry picked from commit ea3e66d280ce2576664a862693d1da8fd324c317)
📍 영향받는 시스템
Linux kernel (drm/xe/hmm 모듈을 사용하는 시스템)
⚔️ 공격 벡터
로컬 공격자가 특정 메모리 관리 시나리오를 유도하여 잘못된 메모리 참조를 발생시킴
🛡️ 대응 방법
해당 취약점이 수정된 최신 버전의 Linux 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 취약점이 해결된 패치 버전 이후인지 확인