CVE-2021-47272 in Linux
요약
\~에 의해 VulDB • 2026. 06. 24.
리눅스 커널에서 다음 취약점이 해결되었습니다:
usb: dwc3: gadget: dwc->gadget가 NULL인 경우 dwc3_gadget_exit()에서 조기에 종료
dwc3_set_mode() 함수 내에서 호스트 모드에서 주변기자 모드로 전환하는 동안, 그리고 대기 중인 gadet 드라이버의 바인딩이 실패할 때와 같은 시나리오에서는 dwc3_gadget_init()이 실패할 가능성이 있습니다. 이후 DRD(양방향 장치)가 다시 주변기자 모드에서 호스트 모드로 전환되면, 이로 인해 호출되는 dwc3_gadget_exit()는 유효하지 않고 덩글링(dangling) 상태인 dwc->gadget 포인터를 참조하려고 시도하며, 매핑되지 않은 DMA 포인터에 대해 dma_free_coherent()을 호출하게 됩니다.
정확한 시나리오는 다음과 같이 재현할 수 있습니다: - DWC3를 주변기자 모드로 시작합니다. - ConfigFS gadet를 FunctionFS 인스턴스로 구성하거나(또는 g_ffs 사용) 설정합니다. - FunctionFS 사용자 공간 애플리케이션을 실행합니다(END 포인트 열기, 설명서 쓰기 등). - gadget 드라이버를 DWC3의 UDC에 바인딩합니다. - DWC3를 호스트 모드로 전환합니다. => dwc3_gadget_exit()가 호출됩니다. usb_del_gadget()은 ConfigFS 드라이버 인스턴스를 gadet_driver_pending_list에 추가합니다. - FunctionFS 애플리케이션을 중지합니다(END 포인트 파일 닫기). - DWC3를 주변기자 모드로 전환합니다. => dwc3_gadget_init()이 실패합니다. usb_add_gadget()은 check_pending_gadget_drivers()를 호출하여 UDC를 ConfigFS gadet에 다시 바인딩하려고 시도하지만, FFS 인스턴스가 FFS_ACTIVE 상태가 아니기 때문에(사용자 공간에서 설명서를 다시 열고 쓰지 않았으므로 desc_ready!=0) -19(-ENODEV) 오류로 실패합니다. - DWC3를 호스트 모드로 다시 전환합니다. => dwc3_gadget_exit()이 다시 호출되지만, 이번에는 dwc->gadget가 유효하지 않습니다.
사용자 공간에서 복합 드라이버가 UDC에 바인딩되기 전에 FunctionFS 애플리케이션이 준비되었음을 보장할 책임이 있다는 주장도 있을 수 있지만, 이를 실패했다고 해서 커널 드라이버의 패닉(시스템 충돌)으로 이어져서는 안 됩니다.
dwc3_gadget_init()의 실패 경로에서 dwc->gadget를 NULL로 설정하고, gadet 포인터가 유효하지 않은 경우 조기에 종료하도록 dwc3_gadget_exit()에 검사를 추가하여 이 문제를 해결합니다.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.