소프트웨어 팁/보안 및 분석

삼성 엑시노스(9820,9825,980,990,850,W920) use-after-free CVE-2024-44068 취약점

Sakai 2024. 10. 25. 01:32

오늘은 엑시노스 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;
}

삼성 갤럭시 노트 10
삼성 갤럭시 노트 10

취약점 코드 분석

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
최신 업데이트를 통해 취약점 패치를 진행하시면 됩니다.

그리드형