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.

출처

Do you want to use VulDB in your project?

Use the official API to access entries easily!