🇰🇷 한글 설명
Linux 커널의 hibmcge 네트워크 드라이버에서 rtnl_lock 획득 과정 중 데드락(Deadlock)이 발생하는 취약점이 발견되었습니다. PCI 버스 리셋 과정에서 여러 장치가 순차적으로 동일한 락을 요청하면서 시스템이 멈출 수 있는 문제입니다. 이를 해결하기 위해 리셋 과정에서 rtnl_lock 사용을 제거하고 상태 관리 로직을 조정하였습니다.
💡 쉬운 설명
컴퓨터의 네트워크 장치가 오류를 복구하려고 할 때, 두 장치가 서로의 자원을 기다리며 시스템이 멈춰버리는 현상이 발생할 수 있습니다. 이 문제는 장치가 복구되는 방식의 순서를 조정하여 시스템이 멈추지 않도록 수정되었습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net: hibmcge: fix rtnl deadlock issue
Currently, the hibmcge netdev acquires the rtnl_lock in
pci_error_handlers.reset_prepare() and releases it in
pci_error_handlers.reset_done().
However, in the PCI framework:
pci_reset_bus - __pci_reset_slot - pci_slot_save_and_disable_locked -
pci_dev_save_and_disable - err_handler->reset_prepare(dev);
In pci_slot_save_and_disable_locked():
list_for_each_entry(dev, &slot->bus->devices, bus_list) {
if (!dev->slot || dev->slot!= slot)
continue;
pci_dev_save_and_disable(dev);
if (dev->subordinate)
pci_bus_save_and_disable_locked(dev->subordinate);
}
This will iterate through all devices under the current bus and execute
err_handler->reset_prepare(), causing two devices of the hibmcge driver
to sequentially request the rtnl_lock, leading to a deadlock.
Since the driver now executes netif_device_detach()
before the reset process, it will not concurrently with
other netdev APIs, so there is no need to hold the rtnl_lock now.
Therefore, this patch removes the rtnl_lock during the reset process and
adjusts the position of HBG_NIC_STATE_RESETTING to ensure
that multiple resets are not executed concurrently.
📍 영향받는 시스템
hibmcge 드라이버를 사용하는 Linux 커널 시스템
⚔️ 공격 벡터
PCI 장치 오류 발생을 유도하여 시스템 데드락 유발 (로컬/물리적 접근 필요)
🛡️ 대응 방법
Linux 커널을 최신 패치가 적용된 버전으로 업데이트
🔧 검증 코드
출력된 커널 버전이 취약점이 해결된 패치 버전 이후인지 확인