Linux 7.2-rc2 BPF 코드가 JIT Spraying 공격에 대비해 강화됨
요약
Linux 7.2-rc2 커널에서 BPF JIT 코드를 대상으로 한 JIT Spraying 공격을 방어하기 위한 보안 강화 작업이 진행되었습니다. JIT 메모리 재사용 시 간접 분기 예측기를 플러시하여 이전 프로그램의 예측값이 재사용되는 것을 방지합니다.
핵심 포인트
- BPF JIT 메모리 재사용 시 간접 분기 예측기 플러시 도입
- JIT Spraying 공격을 통한 분기 예측 재사용 방지
- Spectre-v2 완화 조치 사용 시 IBPB 플러시 활성화
- Linux 7.2-rc2 릴리스에 포함 예정
Linux 7.2-rc2 BPF 코드가 JIT Spraying 공격에 대비해 강화됨

머지 윈도우(merge-window) 이후에 나온 다소 특이한 사례이며, 최근의 보안 발견에 의한 동기인지 명확하지는 않지만, Linux 커널의 BPF 코드가 JIT spraying 공격을 막기 위한 강화(hardening) 작업을 진행하고 있습니다. 동시에, Linux BPF 코드가 이미 JIT spraying 공격에 대해 강화되어 있지 않았다는 사실은 놀랍기도 합니다.
Intel 엔지니어인 Pawan Gupta는 JIT spraying에 대해 BPF를 강화하기 위한 이 패치를 제출했습니다:
"BPF JIT 할당자(allocator)는 많은 작은 프로그램들을 더 큰 실행 가능한 할당(executable allocations) 단위로 묶고, 프로그램이 로드되고 해제됨에 따라 해당 할당 내의 공간을 재사용합니다. 이전 프로그램이 점유했던 공간에 새로운 코드가 작성될 때, 새 프로그램으로의 간접 점프(indirect jump)는 이전 프로그램이 남긴 분기 예측(branch prediction)을 재사용할 수 있습니다.
JIT 메모리를 재사용하기 전에 간접 분기 예측기(indirect branch predictors)를 플러시(flush)하여, 새로 작성된 프로그램으로의 간접 점프가 동일한 공간을 점유했던 이전 프로그램의 예측을 재사용하지 않도록 합니다.
JIT 메모리 재사용 시 분기 예측기를 플러시하기 위해 bpf_arch_pred_flush_enabled 정적 키(static key)와 bpf_arch_pred_flush 정적 호출(static call)을 도입합니다. 플러시가 필요한 아키텍처는 이를 예측기 플러시 함수로 업데이트할 수 있습니다. 기본적으로 이는 NOP이며 어떠한 CALL도 발생시키지 않습니다.
하나의 팩(pack)보다 큰 할당은 이 플러시의 대상이 아닙니다. cBPF 프로그램(권한이 없는 공격 표면)은 팩 크기보다 훨씬 작게 제한되어 있으므로 이는 안전합니다. 플러시가 활성화된 상태에서 이 가정이 위반될 경우 경고를 발생시킵니다."
그 외에도 Intel의 Pawan Gupta가 작성한 또 다른 패치가 있는데, 이는 BPF JIT 할당에서 간접 분기 예측 장벽(Indirect Branch Predictor Barrier, IBPB) 플러시를 활성화하는 것입니다:
"Spectre-v2 완화 조치가 사용 중일 때 JIT spraying에 대한 강화를 활성화합니다. 구체적으로, BPF JIT 메모리 재사용 시 IBPB 플러시를 수행합니다. 만약 BPF 디스패처(dispatcher)가 이미 retpoline 시퀀스를 사용하고 있다면 IBPB 플러시 활성화를 건너뜁니다."
이 강화 조치는 BPF-JIT이 사용 중일 때만 적용됩니다. CONFIG_BPF_JIT=n 설정에서도 bugs.c가 여전히 빌드될 수 있도록, 활성화 과정을 CONFIG_BPF_JIT 조건문 아래에 보호(guard)합니다.
이 BPF JIT 강화 작업은 현재 Linux Git에 병합되었으며, 일요일에 출시될 Linux 7.2-rc2 릴리스의 일부가 될 예정입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Phoronix의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기