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.

출처

Do you know our Splunk app?

Download it now for free!