🇰🇷 한글 설명
Linux 커널의 BPF 검증기에서 NULL 체크 로직의 오류로 인해 발생하는 취약점입니다. 특정 조건에서 검증기가 NULL 포인터 역참조를 허용하여 런타임 시 시스템 충돌이나 권한 상승을 유발할 수 있습니다.
💡 쉬운 설명
프로그램이 '이 값은 비어있을 수 있다'고 판단하는 과정에서 검증 오류가 발생합니다. 이로 인해 실제로는 비어있는 값을 사용하려 할 때 보안 검사를 통과해버려 시스템에 문제를 일으킬 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
bpf: Mark the zero register precise for a register-form NULL check
check_cond_jmp_op() accepts "if rA <op> rB" as a NULL check for a
nullable pointer rA when rB is a scalar known to be zero,
lifts PTR_MAYBE_NULL from rA in the corresponding branch and does not
mark rB precise. Consider the following program:
r0 = bpf_get_prandom_u32();
r6 = 1; /* the r6 == 0 path is explored first */
if (r0 == 0) goto 1f;
r6 = 0;
1:
r0 = bpf_map_lookup_elem(map, &0); /* absent, NULL at runtime */
if (r0 == r6) goto 2f; /* taken as a NULL check for r0 */
*(u8 *)(r0 + 0); /* verifier: map value; runtime: zero */
2:
return 0;
The r6 == 0 path is explored first and the dereference is accepted.
The r6 == 1 path is pruned at the checkpoint recorded for (1),
so the comparison is never verified with a non-zero r6. At runtime a
failed lookup returns NULL, NULL != 1 takes the non-NULL edge and the
program dereferences a pointer that is zero.
📍 영향받는 시스템
Linux kernel (BPF subsystem)
⚔️ 공격 벡터
조작된 BPF 프로그램을 로드하여 검증기를 우회하고 NULL 포인터를 역참조함
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하십시오.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인하십시오.