🇰🇷 한글 설명
Linux 커널의 Tegra GPIO 드라이버에서 GPIO 방향 설정 시 불필요하게 pinctrl 코어를 호출하여 발생하는 문제입니다. 이 과정에서 원자적 컨텍스트(atomic context) 내에서 뮤텍스(mutex)를 획득하려 시도하여 시스템이 잠들 수 있는(sleep) 위험이 존재합니다.
💡 쉬운 설명
컴퓨터의 하드웨어 핀을 설정하는 과정에서 불필요한 절차를 거치다가 시스템이 일시적으로 멈추거나 충돌할 수 있는 오류입니다. 불필요한 단계를 제거하여 시스템의 안정성을 높이는 패치가 적용되었습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
gpio: tegra: do not call pinctrl for GPIO direction
tegra_gpio_direction_input() and tegra_gpio_direction_output() already
program the GPIO controller direction registers directly. The additional
pinctrl_gpio_direction_input/output() calls do not add a Tegra pinctrl
operation, because the Tegra pinmux ops provide GPIO request/free
handling but no gpio_set_direction hook.
The extra call still enters the pinctrl core and takes pctldev->mutex.
Shared GPIO users can call the direction path while holding their
per-line spinlock, so this otherwise redundant pinctrl direction call can
sleep in an atomic context.
This was found by our static analysis tool and then confirmed by manual
review of tegra_gpio_probe(), the Tegra GPIO direction callbacks and the
Tegra pinctrl ops. The reviewed path has a default non-sleeping
struct gpio_chip while the direction callback still enters the pinctrl
mutex path.
A directed runtime validation kept the same non-sleeping chip registration
and drove:
gpio_shared_proxy_direction_output()
gpiod_direction_output_raw_commit()
tegra_gpio_direction_output()
pinctrl_gpio_direction_output()
Lockdep reported a sleep-in-atomic warning with the shared GPIO spinlock
held and pinctrl_get_device_gpio_range() plus tegra_gpio_direction_output()
on the stack.
Do not mark the whole chip as can_sleep to paper over this: can_sleep
describes whether get()/set() may sleep, and Tegra value access is MMIO.
Remove the redundant pinctrl direction calls and keep pinctrl involvement
in the existing request/free path.
📍 영향받는 시스템
Linux kernel (Tegra GPIO driver 포함 버전)
⚔️ 공격 벡터
로컬 공격자가 GPIO 방향 설정 기능을 호출하여 시스템 커널 패닉 또는 데드락 유도 가능
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인