🇰🇷 한글 설명
Linux 커널의 virtio_balloon 드라이버에서 장치 종료 시 비동기 작업이 적절히 중단되지 않아 발생하는 취약점입니다. 장치가 종료되기 전에 작업이 완료되지 않으면 커널 경고(WARN_ON_ONCE)가 발생하며, panic_on_warn 설정이 활성화된 시스템에서는 재부팅이나 kexec 과정 중 커널 패닉이 발생하여 시스템이 정상적으로 새 커널로 전환되지 못할 수 있습니다.
💡 쉬운 설명
컴퓨터를 재부팅하거나 업데이트할 때, 메모리를 관리하는 특정 기능이 제대로 꺼지지 않아 시스템이 멈춰버리는 문제입니다. 이로 인해 컴퓨터가 정상적으로 다시 켜지지 않고 오류 상태에 빠질 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
virtio_balloon: quiesce balloon work before device shutdown
Commit 8bd2fa086a04 ("virtio: break and reset virtio devices on
device_shutdown()") added a generic virtio bus .shutdown handler that
breaks and resets every virtio device during device_shutdown(), i.e. on
reboot and kexec.
virtio_balloon provides no .shutdown of its own, so that generic path
runs while the balloon's asynchronous work is still armed. Once the
device has been broken, virtqueue_add_inbuf() in
virtballoon_free_page_report() returns -EIO and trips its
WARN_ON_ONCE(). On a kernel booted with panic_on_warn that turns an
ordinary reboot, for example a kexec based upgrade, into a fatal panic
in the middle of device_shutdown(), so the machine never reaches the
new kernel.
Relaxing that single WARN_ON_ONCE() would only hide the symptom: the
inflate/deflate and OOM paths do not warn, they call
wait_event(vb->acked, ...) and would instead block forever on a broken
queue that can no longer complete. The device has to be quiesced, not
just kept quiet.
Add a .shutdown handler that quiesces the balloon via the shared
virtballoon_quiesce() helper while the device is still alive, and only
then breaks and resets it via virtio_device_shutdown(). Unlike
virtballoon_remove() the balloon workqueue is not destroyed, as shutdown
does not free the device and cancel_work_sync() together with stop_update
already prevent any further work from being queued.
📍 영향받는 시스템
virtio_balloon 드라이버를 사용하는 Linux 커널 (해당 패치가 적용되지 않은 버전)
⚔️ 공격 벡터
직접적인 외부 공격보다는 시스템 재부팅(reboot) 또는 kexec를 통한 커널 업그레이드 과정에서 발생함
🛡️ 대응 방법
virtio_balloon에 .shutdown 핸들러가 포함된 최신 Linux 커널로 업데이트하십시오.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인하십시오.