본문 바로가기
Kernel

[Linux Kernel] KPTI: Kernel Page-Table Isolation

by hyeyoo 2021. 9. 18.
※ 이 블로그의 글은 글쓴이가 공부하면서 정리하여 쓴 글입니다.
※ 최대한 내용을 검토하면서 글을 쓰지만 틀린 내용이 있을 수 있습니다.
※ 만약 틀린 부분이 있다면 댓글로 알려주세요.

예전부터 "커널의 페이지 테이블 엔트리는 어디에 있을까?" 가 궁금했는데 최근에 공부하다 궁금증이 해결되었다. 이 질문에 대한 답변은 KPTI를 적용하냐 아니냐에 따라 나뉜다. 우선 적용하지 않은 경우부터 살펴보자.

 

https://en.wikipedia.org/wiki/Kernel_page-table_isolation

KPTI 적용 전

사진의 왼쪽은 KPTI를 적용하지 않았을 때의 모습이다. KPTI를 적용하지 않으면, 기본적으로 유저 모드 프로세스의 페이지 테이블에는 커널 공간의 주소와 유저 공간의 주소가 모두 매핑된다 (= 페이지 테이블 엔트리가 존재한다.) 이는 TLB Flushing으로 인한 오버헤드를 줄이기 위함이다. TLB는 페이징에서 가상 주소로부터 물리 주소로의 변환을 캐싱하는 버퍼이다. 유저 모드 프로세스는 System Call, Context Switching 등으로 인해 자주 커널 모드로 접근하기 때문에 매핑을 유지하면 TLB HIT으로 이득을 볼 수 있다. 단, 커널 스레드의 페이지 테이블 유저 공간의 주소가 매핑되어있지 않는데, 커널 스레드는 특정 유저 모드 프로세스와 관련이 없기 때문이다.

Meltdown과 Spectre의 영향

그럼 여기서 질문이 생긴다. 유저 모드 프로세스의 페이지 테이블에 커널 공간의 매핑이 존재하면 보안상 문제가 생기지 않을까?인데, 기존에는 페이징으로 인해 특정 페이지의 권한을 설정할 수 있었기 때문에, 유저 모드 프로세스에서는 커널 공간에 직접적으로 접근할 수 없으므로 큰 문제가 없었다.

 

그러나...

 

2017 ~ 2018년 즈음 Intel 계열 프로세스에서 Meltdown과 Spectre 취약점이 발견되었다. Meltdown과 Spectre를 간단하게 요약하면 프로세서의 하드웨어적인 취약점으로 인해 캐시에 커널 공간의 메모리가 들어있게 되고, 사용자 모드에서는 이 캐시에 접근하는 속도로 간접적으로 캐시에 들어있는 커널의 데이터에 접근할 수 있게 되었다. 자세한건 아래 글을 참고하자.

 

 

👻 CPU 보안 취약점을 공격하는 아주 구체적인 원리: 멜트다운, 스펙터 페이퍼 읽기

지난 5월 인텔 CPU의 새로운 보안 취약점이 보고됐다. MDS(Microarchitectural Data Sampling)라고 불리는 이 취약점은 2018년 초 보고된 멜트다운(Meltdown), 스펙터(Spectre) 취약점과 달리 CPU 내부 3개의 버퍼(Line

parksb.github.io

 

KPTI 적용 후

이러한 하드웨어 취약점으로 인해 사용자 모드일때와 커널 모드일때의 페이지 테이블을 2개로 분리해버렸다. 그게 사진의 우측, 즉 KPTI를 적용했을 때가 된다. 페이지 테이블을 말 그대로 '분리' 해버렸기 때문에 이름도 Kernel Page-Table Isolation인 것이다.

 

https://en.wikipedia.org/wiki/Kernel_page-table_isolation

 

사진의 우측을 보면 유저 모드에서는 커널 공간에 대한 매핑이 매우 작아졌는데, 이는 반드시 필요한 부분 (인터럽트 핸들러 같은건 사용자 공간에서도 반드시 접근 가능해야하므로)을 제외하고는 모든 매핑을 제거해버렸다.

 

그리고 커널 모드로 전환할 때는 페이지 테이블을 커널 모드의 페이지 테이블로 전환하고, (Intel 계열에선 레지스터의 값을 바꾸면 되는데, 다른 아키텍처를 잘 모르겠다.) 다시 돌아올 때는 유저 모드의 페이지 테이블로 돌아온다. 위에서 말했듯 페이지 테이블을 분리하는 이유는 TLB를 더 활용하기 위함인데, KPTI를 적용한 경우에는 성능상의 패널티가 생기게 된다.

Future of KPTI?

모든 프로세서가 Meltdown, Spectre와 같은 취약점을 갖는 건 아니기 때문에 현재로서 KPTI는 취약점이 존재하는 CPU에서만 작동한다. 따라서 취약점이 존재하지 않을 미래에는 KPTI 기능이 아예 사라질 수 있다. 반대로 KPTI가 보안적인 측면에서 좋으니까 유지하자는 사람도 있다. 어떻게 될지는 아직 모른다.

참고 문서

 

KAISER: hiding the kernel from user space [LWN.net]

Benefits for LWN subscribersThe primary benefit from subscribing to LWN is helping to keep us publishing, but, beyond that, subscribers get immediate access to all site content and access to a number of extra site features. Please sign up today! By Jonatha

lwn.net

 

The current state of kernel page-table isolation [LWN.net]

This article brought to you by LWN subscribersSubscribers to LWN.net made this article — and everything that surrounds it — possible. If you appreciate our content, please buy a subscription and make the next set of articles possible. By Jonathan Corbe

lwn.net

 

The effect of Meltdown and Spectre in our communities [LWN.net]

Benefits for LWN subscribersThe primary benefit from subscribing to LWN is helping to keep us publishing, but, beyond that, subscribers get immediate access to all site content and access to a number of extra site features. Please sign up today! By Jake Ed

lwn.net

 

p.s.

- KPTI의 이름은 원래 KAISER: Kernel Address Isolation to have side-channels Efficiently Removed였다.

 

댓글