CVE-2026-90429 in Linux
요약
\~에 의해 VulDB • 2026. 09. 18.
리눅스 커널에서 다음 취약점이 해결되었습니다:
iommu/tegra241-cmdqv: VINTF (de)init에 대한 오류 ISR 동기화
사용자 VINTF는 destroy 콜백과 alloc 핸들러의 init 실패 시 언와인드(unwind) 과정에서 호출되는 tegra241_cmdqv_deinit_vintf()에 의해 해제됩니다. 이 함수는 cmdqv->vintfs[] 슬롯을 지우고 iommufd 코어가 이를 해제하도록 하지만, 오류 인터럽트와의 직렬화(serialization) 처리가 없습니다. 즉, tegra241_cmdqv_isr()이 cmdqv->vintfs[idx]를 읽고 vintf의 포인터를 역참조(dereference)할 때, 동시성 오류로 인해 ISR이 슬롯 지우기 중간에 NULL을 참조하거나(NULL deref), 해제되려 하는 vintf를 사용하는(use-after-free) 상황이 발생할 수 있습니다.
deinit_vintf()는 또한 슬롯을 비우기 전에 idx를 IDA(ID allocator)로 반환합니다. 따라서 idx를 재사용하는 동시 생성 작업이 새 vintf를 해당 슬롯에 게시(publish)하더라도, 이 해제 과정이 이전의 NULL 저장(stale NULL store)으로 이를 다시 지워버리는 문제가 있습니다.
반면, tegra241_cmdqv_init_vintf()는 cmdqv->vintfs[] 슬롯에 plain store(일반적인 메모리 저장 연산)를 사용하여 새 vintf를 게시합니다. ISR은 vintf->base와 같은 게시된 vintf의 필드를 역참조합니다. weakly-ordered CPU에서는 plain store가 순서(ordering) 보장을 제공하지 않으며, 재사용된 idx에 있는 stale VINTF_ERR_MAP 비트로 인해 ISR이 새 vintf의 필드가 설정되거나 tegra241_vintf_hw_init()가 실행되기 직전에 해당 vintf를 선택할 수 있습니다.
cmdqv->vintfs[0] 슬롯은 tegra241_cmdqv_init_structures()에서 VINTF0을 처음 생성하기 전까지 NULL 상태이므로, 슬롯 0 읽기에도 동일한 NULL 체크가 필요합니다.
각 슬롯을 smp_store_release()로 게시하고, ISR에서는 각 슬롯을 NULL 체크 하에 smp_load_acquire()로 읽어들이도록 하여, ISR이 항상 완전히 구성된 vintf 또는 NULL만 보도록 합니다. 또한 deinit_vintf()에서 슬롯을 지우고(idx를 IDA로 반환하기 전에) synchronize_irq()를 호출하여, 실행 중인 핸들러 아래에서 vintf가 해제되지 않도록 하고 재사용된 idx가 손상(clobbered)되는 것을 방지합니다.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.