CVE-2026-98799 in Linux
요약
\~에 의해 VulDB • 2026. 10. 19.
리눅스 커널에서 다음 취약점이 해결되었습니다:
bpf: 사용 중인 트램플린 이미지에서 분리된(progs) 프로그램 건너뛰기
bpf_tramp_image_put()는 작업이 아직 해당 이미지 내에서 실행 중일 때 트램플린 이미지가 해제되지 않도록 보장하지만, 그 이미지에 의해 호출되는 프로그램(prog)에는 이와 유사한 조치가 취해지지 않습니다. 분리는 마지막 prog 참조를 즉시 감소시키며, ip_after_call의 nop가 점프로 패치되면 추적된 함수 내에 있는 작업이 fexit 프로그램을 건너뛰므로, grace period 후에 prog가 해제됩니다.
이는 분리된prog보다 먼저 실행되는 sleepable prog에서 대기 중인 작업을 제외하게 되는데, 이 경우 기다릴 수 있는 grace period가 없습니다:
CPU 0 CPU 1 이미지 I 내에서, prog S에서 대기 중 트램플린에서 P를 분리(I의 trampoline) -> 새 이미지 생성, bpf_tramp_image_put(I) 호출 bpf_prog_put(P), 마지막 참조 감소 grace period 경과 후, P 해제됨 S로부터 복귀 __bpf_prog_enter(P) 호출 call P->bpf_func
S와 P가 fexit 프로그램인 경우 작업은 이미 패치된 점프를 지나갔으며, fentry 전용 이미지에는 이러한 점이 없습니다. x86 아키텍처에서는 이는 오염된 bpf_prog_pack 메모리에서 int3로 발생합니다:
Oops: int3: 0000 [#1] SMP NOPTI
CPU: 18 UID: 0 PID: 94573 Comm: x169 Not tainted 6.18.44 #1 PREEMPT(lazy) RIP: 0010:0xffffffffc0601d8d Call Trace: <TASK> ? bpf_trampoline_6442515411+0x1a4/0x21b bpf_lsm_bprm_committed_creds+0x5/0x10 security_bprm_committed_creds+0x5f/0x70 begin_new_exec+0x2d6/0x410 ...
우리는 프로덕션 환경에서 트램플린을 통해 연결된 프로그램들이 훅(hooks)이 사용 중일 때 분리되면서 이 문제를 겪었습니다. 이는 fuzzer와 KASAN를 사용하여 독립적으로 발견되었습니다.
각 prog 호출 시퀀스 앞에 패치 가능한 nop를 생성하고 이를 이미지에 기록합니다. prog가 분리되면 해당 nop를 호출 시퀀스를 건너뛰는 점프로 패치합니다. 연결 상태를 유지하는 프로그램들은 이미지 내에 있는 작업에 대해 계속 실행되며, ip_after_call은 더 이상 필요하지 않습니다.
작업은 현재 이미지뿐만 아니라 아직 해제되지 않은 모든 이미지에 있을 수 있습니다. 작업은 S, P 및 Q를 호출하는 이미지 I1에서 대기하다가, P가 분리되고 트램플린이 이미지 I2로 이동한 후, Q가 분리되어도 그 호출은 여전히 I1에 남아있습니다. 따라서 트램플린은 이미지들이 해제될 때까지 이미지의 목록을 유지하며, prog를 분리하면 해당 nop를 모든 이미지에서 패치합니다. 이러한 기간 동안 이미지는 트램플린에 대한 참조(reference)를 보유합니다.
riscv 및 loongarch 아키텍처에서는 어떤 범위의 점프도 여러 명령어를 필요로 하며, 중간에 프리엠트(preempted)된 작업은 새 시퀀스의 일부에서 재개될 수 있습니다. nop는 단일 명령어이며 arch_bpf_trampoline_skip()을 통해 가까운 분기(near branch)로 패치됩니다.
추가적인 nop들로 인해 x86 및 arm64(그리고 이미 powerpc에서도 해당됨)에서는 BPF_MAX_TRAMP_LINKS개의 프로그램이 페이지에 맞지 않게 되었으므로, s390처럼 제한치를 낮춥니다.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.