🇰🇷 한글 설명
Linux 커널의 BPF 구현에서 rdonly_buf_size 또는 rdwr_buf_size kfunc 인자가 u32 최대값을 초과할 때 이를 적절히 제한하지 않는 취약점이 발견되었습니다. 이로 인해 64비트 값이 32비트로 절단되어 검증기(verifier)가 잘못된 메모리 크기를 기록하게 되며, 이는 보안 검증 우회로 이어질 수 있습니다.
💡 쉬운 설명
프로그램이 메모리 크기를 입력할 때 너무 큰 숫자를 넣으면, 컴퓨터가 이를 잘못 계산하여 실제 크기보다 훨씬 크게 인식하는 오류입니다. 이 오류를 이용하면 보안 검사를 피해 시스템의 중요한 메모리 영역에 접근할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
bpf: Reject rdonly/rdwr_buf_size kfunc arguments that exceed u32 max
check_kfunc_args() detects a kfunc argument named rdonly_buf_size or
rdwr_buf_size and stores reg->var_off.value into meta->r0_size, a u64,
and does not bound it. check_kfunc_call() later copies that value into
the returned register's mem_size field:
meta->r0_size = reg->var_off.value;
...
regs[BPF_REG_0].mem_size = meta.r0_size;
regs[BPF_REG_0].mem_size is u32. A constant whose upper 32 bits are set
gets truncated instead of causing a load-time rejection, so the verifier
records a PTR_TO_MEM register with an approximately 4 GiB mem_size for
whatever allocation the kfunc returned. A later access check against
that register uses the truncated, wrong bound.
Reject rdonly_buf_size/rdwr_buf_size values that exceed U32_MAX at the
point meta->r0_size is set.
📍 영향받는 시스템
Linux kernel (BPF 관련 kfunc를 사용하는 시스템)
⚔️ 공격 벡터
u32 범위를 초과하는 특수하게 조작된 kfunc 인자 값을 전달하여 BPF 검증기 우회
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 kfunc 인자 값에 대한 u32 범위 검증 로직을 적용해야 합니다.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인합니다.