🇰🇷 한글 설명
Linux 커널의 net/sched 서브시스템 중 fq_pie 큐잉 디시플린에서 fq_pie_timer() 함수가 대량의 플로우(최대 65536개)를 한 번에 순회하면서 CPU를 장시간 점유해 RCU 스톨이 발생하는 문제입니다. 이를 해결하기 위해 2048개 플로우마다 CPU를 양보하도록 수정되었습니다.
💡 쉬운 설명
리눅스 커널의 네트워크 트래픽 관리 기능이 너무 많은 연결을 한꺼번에 처리하려다 CPU를 오래 독점해 시스템이 멈춘 것처럼 보일 수 있습니다. 일정 간격마다 다른 작업에 CPU를 양보하도록 고쳐 이 문제를 해결합니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net/sched: fq_pie: avoid stalls in fq_pie_timer()
When setting a high number of flows (limit being 65536),
fq_pie_timer() is currently using too much time as syzbot reported.
Add logic to yield the cpu every 2048 flows (less than 150 usec
on debug kernels).
It should also help by not blocking qdisc fast paths for too long.
Worst case (65536 flows) would need 31 jiffies for a complete scan.
Relevant extract from syzbot report:
rcu: INFO: rcu_preempt detected expedited stalls on CPUs/tasks: { 0-.... } 2663 jiffies s: 873 root: 0x1/.
rcu: blocking rcu_node structures (internal RCU debug):
Sending NMI from CPU 1 to CPUs 0:
NMI backtrace for cpu 0
CPU: 0 PID: 5177 Comm: syz-executor273 Not tainted 6.5.0-syzkaller-00453-g727dbda16b83 #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 07/26/2023
RIP: 0010:check_kcov_mode kernel/kcov.c:173 [inline]
RIP: 0010:write_comp_data+0x21/0x90 kernel/kcov.c:236
Code: 2e 0f 1f 84 00 00 00 00 00 65 8b 05 01 b2 7d 7e 49 89 f1 89 c6 49 89 d2 81 e6 00 01 00 00 49 89 f8 65 48 8b 14 25 80 b9 03 00 <a9> 00 01 ff 00 74 0e 85 f6 74 59 8b 82 04 16 00 00 85 c0 74 4f 8b
RSP: 0018:ffffc90000007bb8 EFLAGS: 00000206
RAX: 0000000000000101 RBX: ffffc9000dc0d140 RCX: ffffffff885893b0
RDX: ffff88807c075940 RSI: 0000000000000100 RDI: 0000000000000001
RBP: 0000000000000000 R08: 0000000000000001 R09: 0000000000000000
R10: 0000000000000000 R11: 0000000000000000 R12: ffffc9000dc0d178
R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
FS: 0000555555d54380(0000) GS:ffff8880b9800000(0000) knlGS:0000000000000000
CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007f6b442f6130 CR3: 000000006fe1c000 CR4: 00000000003506f0
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Call Trace:
<NMI>
</NMI>
<IRQ>
pie_calculate_probability+0x480/0x850 net/sched/sch_pie.c:415
fq_pie_timer+0x1da/0x4f0 net/sched/sch_fq_pie.c:387
call_timer_fn+0x1a0/0x580 kernel/time/timer.c:1700
📍 영향받는 시스템
fq_pie 큐잉 디시플린을 사용하는 Linux 커널 (수정 이전 버전, 상세 버전은 배포판 보안 공지 참조)
⚔️ 공격 벡터
로컬 사용자가 fq_pie 큐를 대량의 플로우(limit 65536)로 설정하면 타이머 처리 중 CPU 스톨을 유발할 수 있으며, 서비스 거부(DoS) 성격의 영향이 있습니다.
🛡️ 대응 방법
배포판 제공 최신 커널 업데이트를 적용하거나 해당 커밋이 포함된 커널로 재빌드 후 재부팅합니다.
🔧 검증 코드
커널 버전이 패치가 반영된 버전 이상인지 배포판 보안 공지와 대조하고, sch_fq_pie 모듈이 로드되지 않았다면 해당 취약 경로는 노출되지 않은 상태입니다.
uname -r && (lsmod | grep -q sch_fq_pie && echo 'sch_fq_pie loaded' || echo 'sch_fq_pie not loaded')