🇰🇷 한글 설명
Linux 커널의 vfio/type1 드라이버에서, exec()으로 vfio 컨테이너가 유지될 때 새 mm의 locked_vm이 0으로 초기화되어 기존 DMA 매핑 해제 시 locked_vm이 언더플로우되는 문제가 수정되었습니다. 이로 인해 이후 DMA 매핑 요청이 ENOMEM으로 실패할 수 있었습니다. 수정은 DMA 매핑 시점에 mm을 저장해 해당 mm을 사용하도록 변경합니다.
💡 쉬운 설명
프로그램이 다른 프로그램으로 교체(exec)될 때 장치 메모리 잠금 카운트가 잘못 줄어들어 오류가 발생할 수 있었습니다. 이제 처음 메모리를 잠근 시점의 정보를 기억해 올바르게 계산하도록 고쳐졌습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
vfio/type1: prevent underflow of locked_vm via exec()
When a vfio container is preserved across exec, the task does not change,
but it gets a new mm with locked_vm=0, and loses the count from existing
dma mappings. If the user later unmaps a dma mapping, locked_vm underflows
to a large unsigned value, and a subsequent dma map request fails with
ENOMEM in __account_locked_vm.
To avoid underflow, grab and save the mm at the time a dma is mapped.
Use that mm when adjusting locked_vm, rather than re-acquiring the saved
task's mm, which may have changed. If the saved mm is dead, do nothing.
locked_vm is incremented for existing mappings in a subsequent patch.
📍 영향받는 시스템
수정 이전의 Linux 커널 (vfio/type1 드라이버를 사용하는 환경, 예: 가상화/GPU 패스스루 구성)
⚔️ 공격 벡터
로컬 사용자가 vfio 컨테이너를 exec 이후에도 유지한 뒤 DMA 매핑 해제를 수행해 locked_vm 언더플로우로 후속 매핑을 실패시키는 서비스 거부 형태
🛡️ 대응 방법
커널을 해당 CVE 수정이 포함된 Linux 커널 버전으로 업데이트하고 재부팅합니다.
🔧 검증 코드
출력된 커널 버전이 배포판의 CVE 수정 패치가 적용된 버전인지 벤더 보안 공지와 대조하고, vfio 모듈 로드 여부로 해당 드라이버 사용 여부를 확인합니다.
uname -r && (grep -i vfio /proc/modules 2>/dev/null || lsmod | grep -i vfio)