🇰🇷 한글 설명
Linux 커널의 imx6q cpufreq 드라이버에서 드라이버가 여러 번 프로브될 때 경계 외 쓰기(Out-of-bounds write)가 발생하는 취약점입니다. 정적 저장소를 사용하는 soc_opp_count 변수가 초기화되지 않아, 드라이버 재바인딩 시 할당된 배열의 범위를 초과하여 메모리에 데이터를 기록하게 됩니다.
💡 쉬운 설명
컴퓨터 부품을 제어하는 소프트웨어가 다시 실행될 때, 이전에 사용했던 숫자를 그대로 사용하여 정해진 메모리 공간을 넘어서 데이터를 적는 오류입니다. 이로 인해 시스템이 불안정해지거나 보안 문제가 생길 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
cpufreq: imx6q: fix out-of-bounds write when probed more than once
imx6_soc_volt is allocated fresh on every probe, sized to the number of
ARM OPPs:
imx6_soc_volt = devm_kcalloc(cpu_dev, num, sizeof(*imx6_soc_volt),
GFP_KERNEL);
but it is filled through soc_opp_count, which has static storage and is
never reset. A second bind after an unbind keeps indexing from where the
first one stopped, and writes past the end of the new array.
Unbinding and rebinding the driver on qemu's mcimx6ul-evk, under KASAN:
BUG: KASAN: slab-out-of-bounds in imx6q_cpufreq_probe+0x3b0/0xa34
Write of size 4 at addr c5e90480 by task binder/73
imx6q_cpufreq_probe from platform_probe+0x88/0xe4
platform_probe from really_probe+0x108/0x384
bind_store from kernfs_fop_write_iter+0x1b4/0x28c
The write lands one u32 past the end of the allocation.
soc_opp_count is only read a few lines below the loop that fills it, so it
never needed static storage. Make it a local.
📍 영향받는 시스템
Linux kernel (imx6q cpufreq driver component)
⚔️ 공격 벡터
로컬 권한을 가진 공격자가 드라이버를 언바인드(Unbind) 후 재바인드(Rebind)하여 메모리 오염 유도
🛡️ 대응 방법
커널 패치를 적용하여 soc_opp_count를 정적 변수에서 지역 변수로 변경
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전인지 확인