🇰🇷 한글 설명
Linux 커널의 i2c-i801 드라이버에서 오류 처리 경로 중 하드웨어 상태 머신을 손상시키는 취약점이 발견되었습니다. i801_check_pre() 실패 시 하드웨어 소유권을 획득하지 않은 상태에서 레지스터를 강제로 초기화하여 BIOS/ACPI의 트랜잭션을 방해하고 시스템 리브락(Livelock) 및 커널 패닉을 유발합니다.
💡 쉬운 설명
하드웨어를 사용하기 전 단계에서 오류가 발생했을 때, 잘못된 방식으로 하드웨어 설정을 건드려 시스템이 멈추는 문제입니다. 이로 인해 컴퓨터가 응답하지 않거나 갑자기 꺼지는 현상이 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
i2c: i801: fix hardware state machine corruption in error path
A severe livelock and subsequent Hung Task panic were observed in the
i2c-i801 driver during concurrent Fuzzing. The crash is caused by an
unconditional hardware register cleanup in the error handling path of
i801_access().
When i801_check_pre() fails (e.g., returning -EBUSY because the SMBus
controller is actively used by BIOS/ACPI), the kernel does not actually
acquire the hardware ownership. However, the code jumps to the 'out'
label and executes:
iowrite8(SMBHSTSTS_INUSE_STS | STATUS_FLAGS, SMBHSTSTS(priv));
This forcefully clears the INUSE_STS lock and resets the hardware status
flags without owning the controller. Doing so interrupts ongoing BIOS/ACPI
transactions and totally corrupts the SMBus hardware state machine.
Consequently, all subsequent i801_access() calls fail at the pre-check
stage, triggering an endless stream of "SMBus is busy, can't use it!"
error logs. Over a slow serial console, this printk flood monopolizes
the CPU (Console Livelock), starving other processes trying to acquire
the mmap_lock down_read semaphore, ultimately triggering the hung task
watchdog.
Fix this by moving the 'out' label below the hardware register cleanup.
If i801_check_pre() fails, we safely bypass the iowrite8() and only
release the software locks (pm_runtime and mutex), strictly adhering to
the rule of not releasing resources that were never acquired.
📍 영향받는 시스템
Linux kernel (i2c-i801 driver 포함 버전)
⚔️ 공격 벡터
동시성 퍼징(Concurrent Fuzzing) 또는 특정 하드웨어 상태 유도 시 발생
🛡️ 대응 방법
커널 패치를 통해 오류 발생 시 하드웨어 레지스터 초기화 과정을 건너뛰도록 수정
🔧 검증 코드
현재 실행 중인 커널 버전을 확인하여 해당 취약점이 수정된 패치 버전인지 확인합니다.