🇰🇷 한글 설명
Linux 커널의 BPF 검증기에서 포인터의 오프셋이 제한되지 않을 경우, 해당 포인터가 NULL이 아니라고 잘못 판단하는 취약점입니다. 공격자가 정교하게 조작된 BPF 프로그램을 통해 런타임 시 NULL 포인터 역참조를 유발하여 시스템 오류를 일으킬 수 있습니다.
💡 쉬운 설명
컴퓨터가 '이 값은 비어있지 않다'라고 잘못 믿게 만들어, 실제로는 비어있는 값을 사용하려다 시스템이 멈추게 만드는 오류입니다. 공격자가 특수한 계산식을 사용하여 컴퓨터를 속이는 방식입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
bpf: Don't infer non-NULL from a pointer with an unbounded offset
reg_not_null() decides that a register holds a non-NULL value by
looking at its type alone. For pointer types that allow arithmetic the
type only guarantees a non-NULL base, in case of an unbound offset
the runtime offset value might still add up to NULL.
Consider the followng program:
r6 = bpf_map_lookup_elem(map, &0); /* present */
if (r6 == 0) return 0;
r7 = bpf_map_lookup_elem(map, &1); /* absent, NULL at runtime */
r8 = r7;
r8 -= r6; /* pointer - pointer: unknown scalar, -r6 */
r8 <<= 1;
r8 >>= 1; /* any non-negative offset is accepted by */
/* check_reg_sane_offset_ptr() */
r6 += r8; /* verifier: map value; runtime: zero */
if (r7 != r6) return 0;
*(u8 *)(r7 + 0); /* r7 is inferred non-NULL, both are zero */
At runtime both registers are zero, the comparison is true and the
load faults with NULL pointer dereference.
Require the offset to be within +-BPF_MAX_VAR_OFF in reg_not_null().
📍 영향받는 시스템
Linux Kernel (BPF 기능이 활성화된 버전)
⚔️ 공격 벡터
조작된 BPF 프로그램을 로드하여 커널 검증기를 우회하고 NULL 포인터 역참조 유도
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트
🔧 검증 코드
출력된 커널 버전이 취약점이 해결된 최신 패치 버전인지 확인