🇰🇷 한글 설명
Linux 커널의 USB gadget functionfs 드라이버에서 불필요한 WARN_ON이 panic_on_warn이 활성화된 경우 커널 패닉을 유발하는 취약점입니다. adb 데몬 작업과 configfs를 통한 UDC 쓰기 작업 사이의 경쟁 조건으로 인해 functionfs_bind에서 경고가 트리거되어 시스템을 중단시킵니다.
💡 쉬운 설명
Android USB 디버깅 서비스와 시스템 설정이 동시에 실행될 때 Linux 커널이 충돌할 수 있는 문제입니다. 불필요한 경고 메시지를 제거하여 수정됩니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
usb: gadget: f_fs: Remove WARN_ON in functionfs_bind
This commit addresses an issue related to below kernel panic where
panic_on_warn is enabled. It is caused by the unnecessary use of WARN_ON
in functionsfs_bind, which easily leads to the following scenarios.
1.adb_write in adbd 2. UDC write via configfs
================= =====================
->usb_ffs_open_thread() ->UDC write
->open_functionfs() ->configfs_write_iter()
->adb_open() ->gadget_dev_desc_UDC_store()
->adb_write() ->usb_gadget_register_driver_owner
->driver_register()
->StartMonitor() ->bus_add_driver()
->adb_read() ->gadget_bind_driver()
<times-out without BIND event> ->configfs_composite_bind()
->usb_add_function()
->open_functionfs() ->ffs_func_bind()
->adb_open() ->functionfs_bind()
<ffs->state !=FFS_ACTIVE>
The adb_open, adb_read, and adb_write operations are invoked from the
daemon, but trying to bind the function is a process that is invoked by
UDC write through configfs, which opens up the possibility of a race
condition between the two paths. In this race scenario, the kernel panic
occurs due to the WARN_ON from functionfs_bind when panic_on_warn is
enabled. This commit fixes the kernel panic by removing the unnecessary
WARN_ON.
Kernel panic - not syncing: kernel: panic_on_warn set ...
[ 14.542395] Call trace:
[ 14.542464] ffs_func_bind+0x1c8/0x14a8
[ 14.542468] usb_add_function+0xcc/0x1f0
[ 14.542473] configfs_composite_bind+0x468/0x588
[ 14.542478] gadget_bind_driver+0x108/0x27c
[ 14.542483] really_probe+0x190/0x374
[ 14.542488] __driver_probe_device+0xa0/0x12c
[ 14.542492] driver_probe_device+0x3c/0x220
[ 14.542498] __driver_attach+0x11c/0x1fc
[ 14.542502] bus_for_each_dev+0x104/0x160
[ 14.542506] driver_attach+0x24/0x34
[ 14.542510] bus_add_driver+0x154/0x270
[ 14.542514] driver_register+0x68/0x104
[ 14.542518] usb_gadget_register_driver_owner+0x48/0xf4
[ 14.542523] gadget_dev_desc_UDC_store+0xf8/0x144
[ 14.542526] configfs_write_iter+0xf0/0x138
📍 영향받는 시스템
Linux kernel 5.10 ~ 6.10 (USB gadget functionfs 지원 버전, 패치 이전)
⚔️ 공격 벡터
로컬 공격, adb 명령어와 configfs 쓰기 작업의 타이밍을 조작하여 경쟁 조건 유발
🛡️ 대응 방법
Linux 커널을 패치된 버전으로 업데이트 (kernel >= 6.10.7 또는 해당 안정 버전)
🔧 검증 코드
커널 버전이 6.10.7 미만이고 5.10 이상이면 취약함. 출력이 'Vulnerable'이면 업데이트 필요, 'Safe'면 안전
uname -r | grep -E '^(5\.(10|[2-9]|[1-9][0-9])|6\.(0|1|[2-9]|10\.[0-6])|[7-9])' && echo 'Vulnerable' || echo 'Safe'