🇰🇷 한글 설명
Linux 커널 LoongArch BPF 컴파일러에서 tailcall 점프 오프셋 계산 오류로 인해 음수 오프셋이 생성되어 무한 루프 및 CPU 소프트 락업을 유발합니다. BPF JIT 컴파일의 추가 패스에서 초기화 건너뜀으로 인해 offset 값이 -1로 유지되는 근본 원인입니다.
💡 쉬운 설명
LoongArch 리눅스 커널의 BPF 기능에서 프로그램 분기 위치 계산이 잘못되어 CPU가 같은 위치를 반복 실행하는 문제입니다. 특정 BPF 프로그램 실행 시 시스템이 응답하지 않을 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
LoongArch: BPF: Fix jump offset calculation in tailcall
The extra pass of bpf_int_jit_compile() skips JIT context initialization
which essentially skips offset calculation leaving out_offset = -1, so
the jmp_offset in emit_bpf_tail_call is calculated by
"#define jmp_offset (out_offset - (cur_offset))"
is a negative number, which is wrong. The final generated assembly are
as follow.
54: bgeu $a2, $t1, -8 # 0x0000004c
58: addi.d $a6, $s5, -1
5c: bltz $a6, -16 # 0x0000004c
60: alsl.d $t2, $a2, $a1, 0x3
64: ld.d $t2, $t2, 264
68: beq $t2, $zero, -28 # 0x0000004c
Before apply this patch, the follow test case will reveal soft lock issues.
cd tools/testing/selftests/bpf/
./test_progs --allow=tailcalls/tailcall_bpf2bpf_1
dmesg:
watchdog: BUG: soft lockup - CPU#2 stuck for 26s! [test_progs:25056]
📍 영향받는 시스템
LoongArch 아키텍처 Linux 커널 (BPF tailcall 기능 사용하는 모든 버전)
⚔️ 공격 벡터
로컬 사용자가 악의적인 eBPF 프로그램(tailcall 포함)을 로드하여 CPU 소프트 락업 유발
🛡️ 대응 방법
영향받는 Linux 커널에 BPF tailcall 점프 오프셋 계산 패치 적용
🔧 검증 코드
loongarch 아키텍처가 표시되면 패치 적용 필요, 다른 아키텍처면 영향 없음
uname -m | grep -q loongarch && echo 'Vulnerable architecture' || echo 'Safe architecture'