🇰🇷 한글 설명
Linux 커널의 i2c:imx 드라이버에서 SMBus 블록 읽기 시 데이터 개수가 0인 경우, 인터럽트 기반 상태 머신이 이를 처리하지 못해 I2C 버스가 잠기는 취약점이 발견되었습니다. 이로 인해 타겟 장치가 SDA 라인을 계속 점유하게 되어 컨트롤러를 재부팅하기 전까지 버스 통신이 불가능해집니다.
💡 쉬운 설명
데이터를 0개 읽으라는 잘못된 명령이 들어왔을 때, 시스템이 이를 제대로 마무리하지 못해 통신 통로(버스)가 꽉 막혀버리는 문제입니다. 이 현상이 발생하면 장치 간의 통신이 완전히 중단되어 시스템이 오작동할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
i2c: imx: fix locked bus on SMBus block-read of 0 (IRQ)
SMBus 3.1 6.5.7 allows a Block Read byte count of 0, but the
interrupt-driven block-read state machine rejects it as -EPROTO. Worse,
it returns without a NACK+STOP: the next receive cycle has already
started, so the target keeps holding SDA and the bus stays stuck until a
power cycle of this i2c controller.
Accept count=0: NACK the in-flight dummy byte (TXAK) and set msg->len to
2 so i2c_imx_isr_read_continue() emits STOP via its normal last-byte
path. The dummy byte is discarded; block-read callers only consume
buf[0..count-1].
Reading I2DR has likewise already armed the next byte on the
count > I2C_SMBUS_BLOCK_MAX error path, so NACK it (TXAK) before aborting
with -EPROTO; otherwise the failing transfer's STOP cannot complete and
the bus stays held.
The atomic path regressed earlier (v3.16) and is fixed separately; this
patch covers only the v6.13 state-machine rework.
📍 영향받는 시스템
Linux kernel (i2c: imx driver, v6.13 state-machine rework 적용 버전)
⚔️ 공격 벡터
SMBus 3.1 규격을 사용하는 환경에서 데이터 개수가 0인 Block Read 요청을 전송하여 버스 점유 유도
🛡️ 대응 방법
Linux 커널을 최신 패치가 적용된 버전으로 업데이트하여 i2c:imx 드라이버의 오류 처리 로직 수정
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인