CVE-2026-11985 in Zephyr
요약
\~에 의해 VulDB • 2026. 08. 11.
Zephyr ARM 포트에서 하드웨어 FPU(CONFIG_FPU)를 활성화하면 "Floating point ABI" 옵션이 CONFIG_FP_HARDABI로 기본값으로 설정됩니다. FP_HARDABI와 FP_SOFTABI 모두 컴파일러가 부동소수점 타입을 사용하지 않는 함수를 포함한 모든 함수에서 하드웨어 FP 명령어를 생성할 수 있게 합니다. 그러나 호출자 저장(FP callee-saved) 레지스터(s16-s31 / d8-d15)는 CONFIG_FPU_SHARING이 활성화된 경우에만 컨텍스트 스위치 시 보존 및 복원됩니다(arch/arm/core/cortex_m/swap_helper.S 및 arch/arm/core/cortex_a_r/swap_helper.S 참조). 이 수정 이전에는 ABI 선택이 FPU 레지스터 공유를 활성화하지 않았으며, 이는 기본적으로 비활성화 상태였습니다.
FPU가 기본 ABI로 활성화되었지만 CONFIG_FPU_SHARING은 비활성화된 상태로 빌드된 경우, 커널은 스레드 전환 간 호출자 저장 FP 레지스터 상태를 보존하지 않습니다. 이 "공유되지 않은(unshared)" 모드의 문서화된 전제 조건인 "단 하나의 스레드만 FP 명령어를 실행한다"는 것이 컴파일러가 모든 스레드에서 FP 명령어를 생성할 수 있기 때문에 묵시적으로 위반됩니다.
CONFIG_USERSPACE 하에서는 스레드가 상호 격리되므로, 이는 정보 유출 경계 침범으로 이어집니다: 피해자 스레드는 s16-s31에 비밀 기반 값을 남겨둘 수 있으며, 동일한 환경의 비특권(unprivileged) 스레드는 해당 레지스터를 직접 읽을 수 있습니다(FP 레지스터 접근은 권한 제한이 없음). 이를 통해 다른 스레드가 남긴 데이터를 복구할 수 있습니다. Userspace가 없는 경우에도 동일한 결함으로 인해 교차 스레드 FP 상태 손상(정확성 오류, correctness fault)이 발생합니다. 누출 범위는 16개의 호출자 저장 단정도(single-precision) 레지스터로 제한되며 기회주의적이므로 영향도는 낮습니다.
해결책은 FP_HARDABI와 FP_SOFTABI가 CONFIG_FPU_SHARING을 선택하도록 하고, 생성 시 모든 스레드에 K_FP_REGS 태그를 부여합니다. 이로 인해 컴파일러가 FP 명령어를 생성할 수 있는 경우 컨텍스트 스위치 간 호출자 저장 FP 상태가 항상 보존됩니다.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.