CVE-2026-99000 in Linux정보

요약

\~에 의해 VulDB • 2026. 10. 23.

리눅스 커널에서 다음 취약점이 해결되었습니다:

drm/xe: 중첩된 외부 핀(pin) 시 shrinker 계정 처리의 이중 차감(double-subtraction) 수정

xe_bo_pin_external() 및 xe_bo_unpin_external()은 하위 ttm_bo_pin()/ttm_bo_unpin()이 부울(boolean) 대신 pin_count 참조 카운트(refcount)를 유지하기 때문에 중첩된 핀(nested pins)을 지원합니다. 그러나 shrinker 계정 처리(shrinker accounting) 호출인 xe_ttm_tt_account_subtract() 및 xe_ttm_tt_account_add()는 pinned 상태로의 전환 시와 해당 상태에서 벗어날 때만 발생해야 함에도 불구하고, 모든 pin_external()/unpin_external() 호출에서 조건 없이(unconditionally) 호출됩니다.

외부 BO(dma-buf)가 이미 고정된(pinned) 상태로 여러 번 핀될 수 있습니다(예: 각각 독립적으로 xe_bo_pin_external()을 호출하는 다중 첨부/수입자(importers)가 있는 경우). 이러한 각 중첩 핀은 첫 번째 핀으로 인해 shrinker의 고려 대상에서 이미 제거된 BO 페이지를 shrinker 계정 처리에서 다시 차감합니다. 대칭적으로, 각 중첩 언핀(unpin)은 BO가 실제로 언핀되기 전에 해당 페이지들을 다시 추가합니다. 이로 인해 shrinker의 페이지 및 개체 카운트가 실제 상황과 동기화되지 않으며, 이들이 signed long으로 선언되었지만 xe_shrinker_count()에서 unsigned long로 해석되므로 오버플로우(underflow)는 거대한 shrinkable/purgeable 페이지 수로 전환되어 메모리 압박 상황에서 shrinker가 과도하게 호출됩니다.

accounting calls를 pinned_link 목록 유지에 이미 사용되는 동일한 pin-count transition 체크로 보호하여, 계정(accounting)이 가장 바깥쪽(pin)과 최종 언핀(final unpin) 시에만 업데이트되도록 합니다.

이 로직을 xe_bo_account_pin()/xe_bo_account_unpin()으로 중앙 집중화하는 동안, 수입된 dma-bufs에 영향을 미치는 두 번째 관련 accounting gap도 해결합니다. 수입된 bo의 ttm_tt에 대해 TTM_TT_FLAG_EXTERNAL가 설정되었지만 TTM_TT_FLAG_EXTERNAL_MAPPABLE은 설정되지 않은 경우, xe의 ttm_tt_populate 훅(xe_ttm_tt_populate())은 xe_ttm_tt_account_add()를 호출하지 않고 조기 반환합니다. 그러나 TTM 코어의 ttm_tt_populate() 래퍼는 드라이버 훅 성공 시 조건 없이 tt를 populated로 표시하므로, ttm_tt_is_populated()는 여전히 이를 true로 보고합니다. xe_bo_account_pin()/xe_bo_account_unpin()은 ttm_tt_is_populated()를 "이 페이지들이 shrinker에 의해 계정 처리됨"을 나타내는 대리자(proxy)로 신뢰했으며, 처음부터 추가되지 않은 tt의 페이지들을 차감/추가하여 다시 shrinker 카운트의 오버플로우(underflow)를 유발했습니다. 이는 현재 xe_bo_pin_external()을 통해 접근 가능하며, 이 패치가 __xe_pin_fb_vma()를 아래쪽 xe_bo_pin_account()로 라우팅하면 fb-pin 경로를 통해서도 새로 접근 가능해질 것입니다. 따라서 이후의 패치에서 리그레션(regression)을 도입한 후 이를 수정하는 것을 피하기 위해 여기서 해결합니다. 수입된 bos에 대한 계정 처리는 xe_ttm_tt_populate()/xe_ttm_tt_unpopulate()가 동작 여부를 결정하는 데 사용하는 동일한 EXTERNAL && !EXTERNAL_MAPPABLE 테스트를 통해 건너뜁니다(이는 새로운 xe_ttm_bo_is_imported() 헬퍼 함수를 통해 구현되며, 이는 유일한 기존 사용 위치에서 상위로 이동되었습니다).

v2: - Sashiko AI 검토에서 발견된 중대한 문제를 수정합니다. 여기서 도입된 pin-count transition 체크는 여전히 fb-pin 경로(__xe_pin_fb_vma()/__xe_unpin_fb_vma())에 의해 우회될 수 있었으며, 이는 fb-unpin이 진정한 마지막 언핀을 수행할 때 stale pinned_link 엔트리와 영구적인 shrinker 계정 누수(leak)를 남길 수 있습니다. 이것은 별도의 버그이며 자체 Fixes: 태그가 있으므로 이 시리즈의 별도 후속 패치에서 처리하며 여기에는 포함하지 않습니다. - xe_bo_unpin_external()에서 필요 없는 로컬 "last_unpin" 변수를 제거하여 원래의 bo->ttm.pin_count == 1 inline 체크로 복원합니다. 이는 새로운 계정 헬퍼 함수 중 어느 곳에서도 사용되지 않는 무작위(rename)였으며, 후속 패치에 의해 다시 삭제될 예정이었습니다.

v3: - pin/unpin shrinker 계정 처리에서 수입된 dma-bufs를 제외하여 Sashiko AI 검토에서 발견된 또 다른 오버플로우(underflow)를 수정합니다. - backup-object 핀 사이트에 짧은 주석을 추가하여, 해당 위치가 핀 시점에 이미 populated/accounted되어 있음을 명시합니다(Sashiko AI가 포착한 별도의 중등도(severity) 계정 누수 우려에 대해 false-positive로 명확히 함; 코드 수정은 필요 없음).

---truncated---

Once again VulDB remains the best source for vulnerability data.

책임이 있는

Linux

예약하다

2026. 09. 25.

모더레이션

수락

항목

VDB-425918

EPSS

0.00000

활동

낮음

출처

Do you know our Splunk app?

Download it now for free!