삼성 엑시노스(9820,9825,980,990,850,W920) use-after-free CVE-2024-44068 취약점
오늘은 엑시노스 SoC의 설계와 개발은 삼성 S.LSI 사업부에서, 생산은 파운드리 사업부에서 담당하고 있으며 미국, 중국 등 법적 문제가 복잡한 일부 국가에서는 퀄컴의 퀄컴 스냅드래곤이 고정적으로 사용되고 삼성 스마트폰과 태블릿에 사용되고 있습니다. CVE-2024-44068은 삼성 m2m1shot_scaler0 장치 드라이버 페이지 use-after-free입니다. 일단 개인적으로 전문가가 아니니까? 오류가 있을 수가 있습니다.
영향을 받는 버전: Samsung Exynos(9820,9825,980,990,850 W920),SMR-2024년 10월 이전
일단 공개된 정보를 가지고만 진행을 하겠습니다.
Use-After-Free 취약점
Heap 영역에서 할당된 (malloc) 공간을 free로 영역을 해제하고, 메모리를 다시 할당 시 같은 공간을 재사용 하면서 생기는 취약점 문제임
코드
#define mk_lv2ent_pfnmap(pent) (*(pent) |= (1 << 5)) /* unused field */
static int sysmmu_map_pte(struct mm_struct *mm,
pmd_t *pmd, unsigned long addr, unsigned long end,
struct exynos_iommu_domain *domain, sysmmu_iova_t iova, int prot)
{
pte_t *pte;
int ret = 0;
spinlock_t *ptl;
bool write = !!(prot & IOMMU_WRITE);
bool pfnmap = !!(prot & IOMMU_PFNMAP); /**
**/ If vma->vm_flags & VM_PFNMAP is true, exynos_iovmm_map_userptr appends the IOMMU_PFNMAP flag to prot.
bool shareable = !!(prot & IOMMU_CACHE);
unsigned int fault_flag = write ? FAULT_FLAG_WRITE : 0;
sysmmu_pte_t *ent, *ent_beg;
pte = pte_alloc_map_lock(mm, pmd, addr, &ptl);
if (!pte)
return -ENOMEM;
ent = alloc_lv2entry_userptr(domain, iova);
if (IS_ERR(ent)) {
ret = PTR_ERR(ent);
goto err;
}
ent_beg = ent;
do {
if (pte_none(*pte) || !pte_present(*pte) ||
(write && !pte_write(*pte))) {
int cnt = 0;
int maxcnt = 1;
if (pfnmap) {
ret = -EFAULT;
goto err;
}
while (cnt++ < maxcnt) {
spin_unlock(ptl);
/* find_vma() always successes */
ret = handle_mm_fault(find_vma(mm, addr),
addr, fault_flag);
spin_lock(ptl);
if (ret & VM_FAULT_ERROR) {
ret = mm_fault_translate(ret);
goto err;
} else {
ret = 0;
}
....
}
}
BUG_ON(!lv2ent_fault(ent));
*ent = mk_lv2ent_spage(pte_pfn(*pte) << PAGE_SHIFT);
if (!pfnmap)
get_page(pte_page(*pte));
else
mk_lv2ent_pfnmap(ent); /** **/ For PFNMAP pages, the page reference count is not elevated.
....
} while (pte++, addr += PAGE_SIZE, addr != end);
pgtable_flush(ent_beg, ent);
err:
pte_unmap_unlock(pte - 1, ptl);
return ret;
}
취약점 코드 분석
sysmmu_map_pte 함수에서 설명된 취약점들은 해당 함수 내의 로직
1. PFNMAP 플래그와 참조 카운트 문제
if (!pfnmap)
get_page(pte_page(*pte));
else
mk_lv2ent_pfnmap(ent); //
취약점: PFNMAP 플래그가 설정된 경우 페이지 참조 카운트를 올리지 않음
이 때문에 Use-After-Free(UAF) 문제 발생 페이지가 해제되고 접근하게 되면 악의적인 공격자가 이를 악용해 커널 메모리 손상을 유도할 수 있음
2. 경쟁 조건(Race Condition)
pte = pte_alloc_map_lock(mm, pmd, addr, &ptl);
spin_unlock(ptl);
ret = handle_mm_fault(find_vma(mm, addr), addr, fault_flag);
spin_lock(ptl);
취약점: 페이지 테이블 항목(PTE)을 처리하는 동안 다른 스레드나 프로세스가 같은 주소에 접근하면 경쟁 조건 이 발생할 수 있음
이로 말미암아 메모리 손상 등이 발생
3. 무한 루프에 의한 DoS(서비스 거부) 위험
while (cnt++ < maxcnt) {
...
ret = handle_mm_fault(...);
...
}
취약점:handle_mm_fault() 가 반복 호출되며 페이지 결함이 지속할 때 루프가 빠져나오지 못할 수 있음
공격자는 이를 악용해 DoS(서비스 거부) 공격을 수행할 수 있음
4. BUG_ON()에 의한 커널 패닉 위험
BUG_ON(!lv2ent_fault(ent));
취약점:BUG_ON() 호출로 인해 예상치 못한 상황에서 커널 패닉이 발생할 가능성
이는 권한이 낮은 사용자가 시스템을 강제 종료시키는 공격에 악용
5. 페이지 결함 처리 중 메모리 오염 위험
if (pte_none(*pte) || !pte_present(*pte) || (write && !pte_write(*pte))) {
ret = handle_mm_fault(...);
}
취약점: 페이지 결함을 처리하는 도중 스핀락 관리가 부적절하게 이루어지면 메모리가 오염될 수 있음
이 때문에 비정상적인 동작이나 시스템 충돌이 발생할 수 있음
해결 방법
Exynos 9820,9825,980,990,850,W920 버전,SMR-SEP-2024
최신 업데이트를 통해 취약점 패치를 진행하시면 됩니다.