SOSP 2024 Kumar Kartikeya Dwivedi, Rishabh Lyer, Sandihya Kashyap
개요
OS의 커널 리소스와 Kernel-extension의 리소르를 구분하여, Kernel extension을 Pratical하게 만드는 방법을 제시
Motivation
Kernel extension은 많이 연구되어 왔고, 실제로도 많이 사용되고 있다. Kernel extension은 다음 4가지를 충족시켜주어야 한다.
- Safety
- Flexibility
- Performance
- Practicality
Importance
현재 존재하는 Kernel extension기법들은 위의 4가지를 충족시키지 못한다.
Design
KFlex는 kernel resource를 Internal, External의 두 타입으로 분류하였다. Internal과 같은 경우에는 Memory access이며, External과 같은 경우에는 Helper function, Kernel function이 주된 공격 포인트로 간주하였다. Internal은 SFI로 막았고, External과 같은 경우에는 Runtime check으로 막았다.
KFlex는 eBPF기반으로 작성되어 있기 때문에, Static하게 잡을 수 있는 Internal bug와 같은 경우에는 SFI를 사용하지 않도록 하여서, 성능상의 이점을 가져올 수 있었다.
KFlex는 eBPF verifier를 수정해서 Loop을 돌 수 있도록 하였다. 따라서, 안전하게 Termination을 할 수 있도록 하기 위해서, KFlex는 Kernel이 eBPF프로그램을 실행시키기 전에 수정을 가해서 모든 possible loop안에 terminate라고 하는 heap영역을 참조하여서, 만약 terminate가 true이면 리소스를 정리하고 빠져나오도록 하였다. termination조건은 timer로 구현하였다.
Conclusion
우선 많은 KFLex의 Motivation은 eBPF로 구현가능하다. 우선 bpf_arena를 통해서 eBPF도 Userspace처럼 자유롭게 Data structure를 작성할 수 있다. 두번째로 bpf_loop을 사용하면 거의 대부분의 loop을 구현할 수 있다. 마지막으로 kflex의 장점이라고 소개된 function에 대한 임의이 접근을 막기 위해서는 모든 커널 함수에 대한 적절한 sanitizing이 있어야 하는데, 구체적으로 어떻게 할 것인지에 대한 설명이 없다. 또한 eBPF는 Pointer leak과 같은 일도 막지만, KFlex는 정확히 어떻게 그러한 일을 해야 하는지에 대한 설명이 부족하다. Cancellation포인트에 대한 설명은 possible kernel data mismatch를 어떻게 극복할지 고려하지 못하였다. 예를 들어서 커널 메모리에 접근하다가 루프를 빠져나와 버리면 그 영역은 corruption이 일어난 상태로 방치되어 버린다. 그러나 Motivation으로 가져온, Safety, Flexibility, Performance, and Practicality에 대한 분석은 흥미로운 부분이었다.