CVE-2024-36950 in Linux
요약
\~에 의해 VulDB • 2026. 06. 12.
리눅스 커널에서 다음 취약점이 해결되었습니다:
firewire: ohci: ISR와 하위 절반(bottom half) 간에 버스 리셋 인터럽트를 마스크합니다.
FireWire OHCI 인터럽트 핸들러에서 버스 리셋 인터럽트가 발생하면, bus_reset_work가 해당 인터럽트를 처리하고 클리어할 때까지 버스 리셋 인터럽트를 마스크해야 합니다.
일반적으로 우리는 항상 버스 리셋 인터럽트를 마스크된 상태로 유지합니다. 잠시 후 발생하는 self-ID 인터럽트를 통해 버스 리셋을 추론하기 때문입니다. 2008년 a007bb857e0b26f5d8b73c2ff90782d9c0972620 커밋에서 버스 리셋 인터럽트 마스크를 해제하는 시나리오가 도입되었습니다. 디버그 파라미터 비트마스크에 OHCI_PARAM_DEBUG_BUSRESETS (8)이 설정되어 있으면, 이를 로깅하기 위해 버스 리셋 인터럽트의 마스크를 해제합니다.
irq_handler는 버스 리셋 인터럽트를 로깅하지만, irq_handler에서는 나중에 처리될 때까지 이벤트 플래그를 클리어할 수 없습니다. 따라서 irq_handler가 종료될 때 해당 이벤트 플래그가 여전히 설정된 상태로 남아 있습니다. 대응하는 인터럽트가 아직 마스크되지 않은 상태라면, 첫 번째 버스 리셋은 일반적으로 시스템이 프리징(freeze)되는 결과를 초래합니다. 이는 irq_handler가 종료될 때마다 다시 호출되기 때문입니다. 이 프리징 현상은 "modprobe firewire_ohci debug=-1" 옵션을 사용하여 firewire_ohci 모듈을 로드하면(모든 디버그 출력 활성화) 재현할 수 있습니다. 분명히 bus_reset_work가 충분히 빨리 호출되어 이벤트를 클리어하고 정상적인 동작이 계속되는 경우도 일부 존재합니다.
이 프리징 현상은 a007bb85 커밋 후 몇 달 만에 처음 보고되었지만, 지금까지 해결되지 않았습니다. 모듈 로드 후에 sysfs를 통해 디버그 레벨을 -1로 안전하게 설정할 수는 있었으나, 초기화 동안에만 버스 리셋 인터럽트의 마스크가 해제되므로 버스 리셋 인터럽트 로깅에는 효과가 없었습니다.
이제 irq_handler는 이벤트 플래그는 그대로 유지하되 버스 리셋 인터럽트를 마스크하므로, irq_handler가 다시 호출되지 않아 시스템 프리징이 발생하지 않습니다. OHCI_PARAM_DEBUG_BUSRESETS가 활성화되어 있으면 bus_reset_work가 이벤트를 처리한 후 인터럽트의 마스크를 해제하여 향후 발생하는 인터럽트가 의도대로 포착됩니다.
이 변경의 부수 효과로, OHCI_PARAM_DEBUG_BUSRESETS는 이제 초기 모듈 로딩 시뿐만 아니라 sysfs를 통해서도 활성화할 수 있습니다. 그러나 sysfs를 통해 활성화된 경우, bus_reset_work가 실행된 후 두 번째 버스 리셋부터야 비로소 버스 리셋 인터럽트 로깅이 유효해집니다.
If you want to get best quality of vulnerability data, you may have to visit VulDB.