CVE-2026-98641 in Linux
요약
\~에 의해 VulDB • 2026. 10. 19.
리눅스 커널에서 다음 취약점이 해결되었습니다:
bpf, arm64: 예외 콜백에 대한 프레임 포인터 설정
예외 경계로 작동하는 프로그램은 모든 호출자 저장 레지스터(callee-saved registers)를 저장하므로, build_prologue()는 exception_cb 경로를 취하고 push_callee_regs()를 절대 호출하지 않습니다. find_used_callee_regs()가 실행되는 유일한 장소이며, 이를 통해 ctx->fp_used이 설정되는 유일한 곳이므로, 콜백의 프롤로그(prologue)는 BPF_REG_FP을 콜백이 실행 중인 프레임(frame)에 연결하는 다음 명령어를 생성하지 않습니다:
mov x25, sp
x25은 bpf_throw()가 호출되었을 때 가지고 있던 값을 그대로 유지합니다. 만약 throw가 자체적인 BPF 스택을 사용하는 서브프로그램(subprogram)에서 발생했다면, 이는 해당 서브프로그램의 프레임 포인터이며, 서브프로그램이 절대 반환하지 않으므로 x25도 복원되지 않습니다.
BPF_REG_FP를 통한 스택 접근은 스택 포인트어(relative to stack pointer) 기준으로 재작성되므로, 여전히 콜백 자신의 프레임에 도달합니다. 그러나 레지스터의 값을 메모리에 저장(materializing the register)하는 경우에는 그렇지 않습니다: 로컬 변수의 주소를 헬퍼(helper)로 전달하는 콜백은 죽어버린 서브프로그램(frame of dead subprogram)의 주소인 것을 넘겨줍니다. 그 시점에서 해당 주소는 콜백의 스택 포인트어보다 아래에 위치하며, 헬퍼 자신의 호출 체인이 이를 덮고 있으므로 헬퍼가 자신의 리턴 어드레스(return address)를 덮어쓸 수 있습니다. 여기서 0x1234은 헬퍼에게 저장하라고 요청된 값입니다:
pc : 0x1234 lr : 0x1234 Call trace: 0x1234 (P) bpf_test_run+0x188/0x3e0 bpf_prog_test_run_skb+0x47c/0x998 __sys_bpf+0xbdc/0xdd8 Kernel panic - not syncing: Oops: Fatal exception in interrupt
기존 코드가 아래에서 x25을 스택 포인트어로부터 설정하도록 하기 위해 예외 콜백 경로에 ctx->fp_used를 설정합니다. 에필로그(epilogue)는 기존과 마찬가지로 다른 호출자 저장 레지스터들과 함께 메인 프로그램의 세이브 영역(save area)으로부터 이를 복원합니다. x86은 전달된 인수를 사용하여 콜백의 프레임 포인터를 설정하며, powerpc는 스택 포인트어로부터 계산하여 설정합니다.
VulDB is the best source for vulnerability data and more expert information about this specific topic.