Posts Intra-process Memory Isolation in ARM64 Linux kernel
Post
Cancel

Intra-process Memory Isolation in ARM64 Linux kernel

Intra-process Memory Isolation in ARM64 Linux kernel

학과: 컴퓨터소프트웨어학부
지도교수: 조영필 교수님
산업체 멘토: 강남규(국민은행)
팀원: 이경훈, 전윤성

컴퓨터소프트웨어학부 4학년 졸업프로젝트의 일환으로 ARM64를 사용하는 Linux kernel에서 page table교체를 활용한 Domain Isolation 기능을 구현하는 프로젝트이다.

프로젝트 배경지식 및 활용

Domain Isolation

Domain Isolation이란 process를 여러 Domain으로 나눠서 각 Domain별로 허가되지 않은 접근을 차단하는것을 말한다.
대표적으로 Intel의 MPX, MPK와 ARM의 DACR이 있으며 논문으로는 Donky, Shreds, SEIMI등이 있다.
해당 프로젝트에서는 각각의 Domain마다 각각의 Page table을 생성해주고 필요한 주소공간만 등록해 줌으로써 Domain에 허가되지 않은 주소공간에 접근하는것을 막는것을 목표로 한다.


ARM64에서의 page table 특징

ARM64의 경우 page table을 user의 page table인 TTBR0와 kernel의 page table인 TTBR1으로 나눠서 관리하게 된다.
따라서 해당 프로젝트의 기능을 사용하는 user application의 경우 TTBR0를 변경하게 된다.
ARM64는 MMU에서 ASID(Address Space Identifier)를 추가로 기록하는데 virtual address에 대한 physical address를 검색할 때 ASID가 변경되지 않았다면 page table에 없더라도 기존의 주소변환 결과를 사용할 수 있게 된다.
따라서 domain에는 page table뿐만 아니라 asid를 추가로 할당해서 도메인 변경이 일어날 때 page table과 asid를 변경해주게 된다.


Trampoline page

ARM64에서는 Meltdown/Spectre 관련 취약점에 대응하기 위한 방법중 하나로 user application이 작동할 때 kernel page table을 해제하는 패치가 이루어졌다.
따라서 기존의 kernel page table이 아닌 trampoline page table이라는 kernel page table의 일부만이 들어있는 page table이 들어있다.
trampoline page table에는 exception vector table만이 할당되어 있으며 해당 exception vector table에서는 TTBR1에 trampoline이 아닌 kernel의 page table로 변경하는 코드가 들어가 있다.
해당 방법을 통해서 exception이 발생 시 user -> trampoline exception code -> kernel exception code 를 실행하게 된다.
해당 프로젝트에서는 trampoline page table에 도메인 변경 코드와 관련 정보를 저장해서 빠른 도메인 변경을 기획했다.


SVC #1, #2

기존의 intel x86_64에서는 system call을 호출 시 INT 0x80이 호출되지만 ARM64에서는 SVC #0가 호출이 된다.
ARM64에서는 SVC의 immediate 값으로 16bits가 할당되어있지만 linux kernel에서는 0만 사용되며 system call number가 stack에 들어가게 된다.
SVC #0이 실행되면 linux kernel에서는 kernel에 진입 후 register backup 이후 SVC instruction인지 판단하고 system call을 판단, 실행하고 register restore, kernel exit를 하게 되지만 프로젝트에서는 SVC #1에 domain change, SVC #2에 domain out을 구현하고 register backup 이전에 SVC #1, SVC #2인지 판단하는 부분을 집어넣어서 도메인 변경의 속도를 향상시켰다.

개발 도구 및 환경

tools: ARM DS-5, FVP
board: raspberry pi 4b (cortex-A72 , ARM64 bit SoC @ 1.5GHz)
kernel-version: linux kernel 5.4 (ARCH=arm64)

추가내용

아래 포스터와 영상에 나와있지 않는 내용.

  • 우선 raspberry pi의 경우 Cortex-A72로 Meltdown/Spectre 취약점 대상이 아니라서 (linux-kernel-dir)/arm64/kernel/cpufeature.c 의 “unmap_kernel_at_el0” 함수에서 제외하는 CPU에 포함되어있다.
    프로젝트의 검증 및 성능측정 보드로 라즈베리파이4를 사용할 예정이기 때문에 해당 부분을 주석처리 해 주어야만 trampoline page를 사용하게 된다.
  • kernel에서 user application주소공간을 건드리게 되므로 PAN(Previleged Access Never) 기능을 꺼줘야만 한다. (menuconfig에서 해제하면 된다.)
  • 해당 프로젝트는 VA/PA size 48bits, 4K pages를 사용하는 환경에 맞춰서 구현을 하였다. (menuconfig에서 해당 부분을 확인해야만 한다.)
  • 해당 프로젝트를 구현하는데 있어서 여러 방법들을 테스트해보기 위해서 github의 branch를 여러개 만들어서 사용했다. FVP에서는 svc_ver이며 rpi에서는 rpi_svc_ver이다.
  • github repository: https://github.com/Allist/IMI

포스터

포스터

발표영상

This post is licensed under CC BY 4.0 by the author.

Sleepy driving prevention system

i18n-language.js - Simple i18n language with Vanilla JS