🇰🇷 한글 설명
Linux 커널의 BPF 컴파일러에서 스택에 저장된 스칼라 0 값이 STACK_ZERO로 잘못 다운그레이드되는 취약점이 발견되었습니다. 이로 인해 정밀도 전파 체인이 깨지면서 검증기(verifier)의 논리적 오류를 유발할 수 있습니다.
💡 쉬운 설명
컴퓨터가 메모리에 저장된 '0'이라는 숫자를 처리하는 과정에서 계산 오류를 일으킬 수 있는 버그입니다. 이 오류로 인해 보안 검사 도구가 프로그램의 상태를 잘못 판단할 위험이 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
bpf: don't downgrade half-dead scalar zero spills to STACK_ZERO
states.c:__clean_func_state() can downgrade scalar zero spill to
STACK_ZERO in the following case:
*(u64 *)(r10 - 8) = 0;
... checkpoint ...
r1 = *(u32 *)(r10 - 4);
... no reads from r10-8 ...
Here 4 bytes at r10-8 are dead and verifier changes scalar spill to a
combination: 0000pppp (p stands for poison). Such a change breaks
precision propagation chains. All places that produce STACK_ZERO
should call bpf_mark_chain_precision() for the zero source.
This patch fixes the bug in a simplest way possible:
avoids converting stack spills of zero to STACK_ZERO.
Two smarter approaches are possible:
- do bpf_mark_chain_precision() from __clean_func_state()
- check slot liveness information in check_stack_write_fixed_off()
I investigated both and the changes required are a bit tricky,
hence go with a simple fix for the time being.
📍 영향받는 시스템
Linux Kernel (BPF 기능이 활성화된 버전)
⚔️ 공격 벡터
특수하게 조작된 BPF 프로그램을 로드하여 커널 검증기의 정밀도 분석을 교란함
🛡️ 대응 방법
해당 취약점이 수정된 최신 Linux 커널 버전으로 업데이트
🔧 검증 코드
출력된 커널 버전을 확인하여 해당 취약점이 패치된 버전인지 보안 공지(Security Advisory)와 대조