CVE-2022-49941 in Linux
요약
\~에 의해 VulDB • 2026. 05. 25.
리눅스 커널에서 다음 취약점이 해결되었습니다:
tty: n_gsm: 원자적 컨텍스트에서 수면(sleeping) 함수 호출 방지
Syzkaller에서 다음과 같은 문제가 보고되었습니다:
BUG: sleeping function called from invalid context at kernel/printk/printk.c:2347 in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 1105, name: syz-executor423 syz-executor423/1105에서 획득한 잠금(lock) 3개: #0: ffff8881468b9098 (&tty->ldisc_sem){++++}-{0:0}, at: tty_ldisc_ref_wait+0x22/0x90 drivers/tty/tty_ldisc.c:266
#1: ffff8881468b9130 (&tty->atomic_write_lock){+.+.}-{3:3}, at: tty_write_lock drivers/tty/tty_io.c:952 [inline]
#1: ffff8881468b9130 (&tty->atomic_write_lock){+.+.}-{3:3}, at: do_tty_write drivers/tty/tty_io.c:975 [inline]
#1: ffff8881468b9130 (&tty->atomic_write_lock){+.+.}-{3:3}, at: file_tty_write.constprop.0+0x2a8/0x8e0 drivers/tty/tty_io.c:1118
#2: ffff88801b06c398 (&gsm->tx_lock){....}-{2:2}, at: gsmld_write+0x5e/0x150 drivers/tty/n_gsm.c:2717
irq 이벤트 타임스탬프: 3482 하드 IRQ 마지막 활성화 위치 (3481): [] __get_reqs_available+0x143/0x2f0 fs/aio.c:946
하드 IRQ 마지막 비활성화 위치 (3482): [] __raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:108 [inline]
하드 IRQ 마지막 비활성화 위치 (3482): [] _raw_spin_lock_irqsave+0x3c/0x60 kernel/locking/spinlock.c:159
소프트 IRQ 마지막 활성화 위치 (3482): [] __do_softirq+0x133/0x4e0 kernel/softirq/softirq.c:922
소프트 IRQ 마지막 비활성화 위치 (3482): [] irq_exit_rcu kernel/softirq/softirq.c:1100 [inline]
소프트 IRQ 마지막 비활성화 위치 (3482): [] __irqentry_text_end+0x17b/0x180 arch/x86/entry/common.c:142
CPU: 0 PID: 1105 Comm: syz-executor423 Not tainted 6.1.0-rc6-syzkaller #0 Call Trace: __dump_stack lib/dump_stack.c:88 [inline]
dump_stack_lvl+0x57/0x7f lib/dump_stack.c:126 ___might_sleep.cold+0x1e8/0x22e kernel/sched/core.c:7304 console_lock+0x19/0x80 kernel/printk/printk.c:2347 do_con_write+0x113/0x1de0 drivers/tty/vt/vt.c:2909 con_write+0x22/0xc0 drivers/tty/vt/vt.c:3296 gsmld_write+0xd0/0x150 drivers/tty/n_gsm.c:2720 do_tty_write drivers/tty/tty_io.c:1028 [inline]
file_tty_write.constprop.0+0x502/0x8e0 drivers/tty/tty_io.c:1118 call_write_iter include/linux/fs.h:1903 [inline]
aio_write+0x355/0x7b0 fs/aio.c:1580 __io_submit_one fs/aio.c:1952 [inline]
io_submit_one+0xf45/0x1a90 fs/aio.c:1999 __do_sys_io_submit fs/aio.c:2058 [inline]
__se_sys_io_submit fs/aio.c:2028 [inline]
__x64_sys_io_submit+0x18c/0x2f0 fs/aio.c:2028 do_syscall_64+0x33/0x40 arch/x86/entry/common.c:46 entry_SYSCALL_64_after_hwframe+0x61/0xc6
다음 제어 흐름에서 문제가 발생합니다:
gsmld_write(...) spin_lock_irqsave(&gsm->tx_lock, flags) // TX 데이터에 대한 스핀락 획득 con_write(...) do_con_write(...) console_lock() might_sleep() // -> 버그
console_lock()은 수면(sleep)할 수 있으므로, 스핀락이 유지된 상태에서는 호출되어서는 안 됩니다.
이 문제를 해결하기 위해 패치는 tx_lock 스핀락을 뮤텍스로 대체합니다.
Linux Verification Center(linuxtesting.org)의 Syzkaller를 통해 발견되었습니다.
If you want to get best quality of vulnerability data, you may have to visit VulDB.