강력한 제어 흐름 보호를 위한 리눅스용 x86 커널 섀도우 스택
LINUX KERNEL
Intel 엔지니어 Dave Hansen은 수요일에 요청 의견서(Request for Comments, RFC) 형태로 x86 커널 섀도우 스택을 도입하기 위한 패치 시리즈를 배포했습니다:
"섀도우 스택(Shadow stacks)은 반환 주소(return addresses) 등을 저장하기 위해 병렬적이고 분리된 보호 스택을 제공하는 프로세서 보안 기능입니다. 현재는 사용자 공간(userspace)에서 실행할 때는 지원되지만, 커널 자체를 실행할 때는 지원되지 않습니다.
섀도우 스택은 매우 강력한 제어 흐름 보호 메커니즘입니다. 이는 리눅스가 사용하고 있지 않은 실리콘 기반의 가장 중요한 커널 완화(mitigation)책일 가능성이 높습니다.
이 시리즈는 섀도우 스택을 사용하여 커널을 실행하는 개념 증명(proof-of-concept)입니다. 이 중 일부는 현재 형태로 병합될 수 있기를 바라며, 나머지 부분은 순수한 잡동사니이며 완전히 재작업해야 합니다. SoB 라인이 누락된 점에 유의하십시오.
이 시리즈와 게시물의 목적은 초기 병합(initial merge)이 어떻게 보일지에 대한 논의를 시작하는 것입니다. 어떤 장애물들이 있을까요? 예를 들어 eBPF가 지원되지 않거나, 완화 기능(mitigation)을 'off'로 설정했을 때만 커널 섀도우 스택을 사용할 수 있다고 가정해 봅시다. 이것이 병합 가능할까요?"
커널 섀도우 스택 코드는 LKML에서 논의를 위해 공개되었습니다.
커널 섀도우 스택 지원과 함께, 현재 RFC 코드는 유연한 복귀 이벤트 전송(Flexible Return Event Delivery, FRED)을 요구 사항으로 부과합니다. 이는 커널 섀도우 스택 지원을 Intel Panther Lake CPU 및 그 이후 버전 또는 AMD Zen 6 및 그 이후 버전으로 제한할 것입니다. 어쨌든, 이 보안 기능을 주장하는 Intel 엔지니어는 이것이 "리눅스가 사용하고 있지 않은 실리콘 기반의 가장 중요한 커널 완화책일 가능성이 높다"고 언급했습니다.
또 다른 큰 문제는 커널 섀도우 스택과 호환되지 않는 여러 리눅스 기능들이 있다는 것입니다. 현재 커널 섀도우 스택과 호환되지 않는 기능들 중에는 Retpolines와 같은 CPU 완화 기술(mitigations), 함수 그래프 추적(function graph tracing), BPF 트램폴린(BPF trampolines), Kexec, EFI 혼합 모드(EFI mixed mode), KVM, Xen PV 등이 있습니다. 적어도 초기 한계를 모두 설명하는 병합되지 않은 패치에 대해서는, "100% 분위기 코딩된 진흙더미"와 같습니다. 현재까지 초기 리눅스 커널 섀도우 스택 지원에 대한 테스트는 Intel Panther Lake에서 수행되었습니다.