🇰🇷 한글 설명
Linux 커널의 au1000 드라이버에서 au1000_close() 함수가 스핀락(spin_lock_irqsave)을 유지한 채로 free_irq()를 호출하는 취약점이 발견되었습니다. free_irq()는 내부적으로 뮤텍스를 사용하여 잠들 수(sleep) 있는데, 이는 스핀락을 보유한 상태에서 허용되지 않는 동작입니다. 이로 인해 커널의 안정성이 저해되거나 시스템 충돌이 발생할 수 있습니다.
💡 쉬운 설명
컴퓨터의 핵심 부품을 제어하는 프로그램이 아주 짧은 시간 동안만 잠가야 하는 자물쇠를 채운 채로, 긴 휴식이 필요한 작업을 수행하려고 시도한 오류입니다. 이로 인해 시스템이 멈추거나 예상치 못한 오류가 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net: au1000: move free_irq out of the close-time spinlocked section
au1000_close() calls free_irq() while aup->lock is still held with
spin_lock_irqsave(). free_irq() can sleep because it takes the IRQ
descriptor request mutex, so it does not belong inside the close-time
spinlocked section.
This was found by our static analysis tool and then confirmed by manual
review of the in-tree au1000_close() .ndo_stop path. The reviewed path
keeps aup->lock held across the MAC reset, queue stop and
free_irq(dev->irq, dev).
A directed runtime validation kept that ndo_stop carrier and the same
free_irq(dev->irq, dev) operation under the driver lock. Lockdep reported
"BUG: sleeping function called from invalid context" and "Invalid wait
context" while free_irq() was taking desc->request_mutex, with
au1000_close() and free_irq() on the stack.
Drop aup->lock before freeing the IRQ. The protected close-time work still
stops the device and queue before IRQ teardown, but the sleepable IRQ core
path now runs outside the spinlocked section.
📍 영향받는 시스템
au1000 드라이버를 사용하는 Linux 커널 시스템
⚔️ 공격 벡터
로컬 권한을 가진 사용자가 네트워크 인터페이스를 닫는 동작을 유도하여 커널 패닉을 유발할 수 있음
🛡️ 대응 방법
au1000 드라이버의 스핀락 해제 로직이 포함된 최신 Linux 커널로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 패치된 최신 버전인지 확인합니다.