init_pg_dir 도입 패치 분석

DEWH 2020.12.31 23:23 조회 수 : 233 추천:1

"이전에 해당 내용으로 글을 쓴 적이 있는데, 내용을 보완하여 공유합니다."
 

init_pg_dir 도입 패치 분석

Purpose

해당 패치의 목적은 KSMA(Kernel Space Mirroring Attack)을 어렵게 만드는 것이다.

 

 

Patch series

  1. arm64/mm: Separate boot-time page tables from swapper_pg_dir

  2. arm64/mm: use fixmap to modify swapper_pg_dir

  3. arm64/mm: move runtime pgds to rodata

 

KSMA

해당 공격 기법은 2018 Black hat에서 소개되었다. KSMA는 ARM MMU feature을 이용하고, EL0(user)에서 시스템 콜 없이 커널 이미지에 Read/Write 할 수 있게 된다.

 

Linux kernel은 아래 그림처럼 여러 단계의 변환을 통해 물리 주소로 변환된다.

d14fee_5cef9544047548e99bd1e3e81740c4d0~

ARM MMU의 각 단계의 변환 테이블들은 엔트리를 가지고 있다. 엔트리들은 3가지 타입으로 구성된다.

  1. Table descriptor

  2. Block descriptor

  3. Page descriptor

 

이 중에서 물리 메모리 주소를 저장하는 엔트리는 Block, Page descriptor이다. 이 두 엔트리들은 매핑된 메모리에 관한 속성들을 아래와 같이 저장한다.

 

d14fee_2a6cb3d2f73644029e317cc631427c3c~

 

 

 

그 중에서 AP 필드는 Read/Write 권한을 저장한다. AP가 가질 수 있는 값들은 아래의 테이블과 같다.

d14fee_601da94c3f8a4825bb7222276035273d~

이때 AP가 01일 때, Exception Level 0일 때도 Read/Write 할 수 있다.

 

따라서, pgd로 사용되는 swapper_pg_dir에 AP가 01로 설정된 block descriptor를 삽입하는 것이 핵심이다.

 

아래 그림은 swapper_pg_dir에 커널 이미지 영역을 매핑하는 block descriptor을 넣은 모습이다.

 

d14fee_2ce7f8963ba942cd9ade2db084bb070d~

물리 메모리 0x3002000에 접근할 때, Direct mapping된 가상 주소나 KSAM을 통한 가상 주소를 통해 접근할 수 있다.

 

Direct mapping

Virtual Addess: 0xFFFFFFC03002000 -> Physical Address: 0x3002000

EL1에서만 접근가능하다.

 

KSAM

Virtual Addess: 0xFFFFFFC23002000 -> Physical Address: 0x3002000

EL0에서도 Read/Write 가능하다.

 

 

Basic idea

공격의 대상이 되는 swapper_pg_dir을 rodata로 옮기자!

 

문제 : 불필요한 페이지들도 rodata로 묶인다.

해결 방안 : 부팅 단계의 페이지 테이블과 정규 페이지 테이블로 분리한다.

 

문제 : swapper_pg_dir에 값을 쓸 방법을 제공해야 한다.

해결 방안 : fixmap에 매핑한 다음 해당 주소를 사용한다.

 

결과:

 

1. 부팅 초기 단계에 수행했던 swapper_pg_dir의 역할은 init_pg_dir로 대체된다.

2. swapper_pg_dir은 한 페이지로 축소되며, rodata 섹션에 위치하게 된다.

3. init_pg_dir이 추가되어 page_init에서 새로운 pgd를 할당받지 않아도 된다.

4. swapper_pg_dir에 값을 쓰기 위해서는 fixmap에 매핑해야 한다.

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 강좌, 팁, 정보등에 대해 올리는 게시판입니다. woos 2016.04.09 246
67 (채용 특전) 제7회 롯데멤버스 빅데이터 경진대회 인공지능팩토리 2022.06.16 36
66 [Git] 특정 파일을 포함한 커밋 & 수정 카운트 필터링 [2] file 이파란 2021.08.22 343
65 [커널 프로그래밍] 열심히 공부한 커널 코어 서브시스템 활용! [2] 이파란 2022.05.16 246
64 [QEMU] 보드 없이 ARM64 리눅스 가상 환경 구성하기 이파란 2022.05.29 212
63 [오픈소스] 성당과 시장 : 우연한 혁명으로 일어난 리눅스와 오픈소스에 대한 생각 이파란 2022.05.29 61
62 [과기부,NIPA] 2022년 인공지능 온라인 경진대회 참가자 모집합니다. [1] file ai.nipa2022 2022.05.19 77
61 Linux Kernel Network 관련 포스팅중입니다. pr0gr4m 2021.07.25 907
60 [Linux Kernel] Kernel history archaeologist file 이파란 2021.07.11 252
59 스터디 모집 공고 언제올라오나요? [3] eubl 2021.04.07 282
58 짧은 책소개, The Art of Multiprocessor Programming 빵먹고싶다 2021.04.26 277
57 [Parallel Computing] 슈퍼 클러스터? 이파란 2021.04.18 134
56 [Git] 함수의 변천사 확인하기 [1] 이파란 2021.01.23 326
55 스터디 가입문의 드립니다. [1] h388lee 2021.03.30 124
54 IUP. RISC-V 컴퓨터 구조 및 SoC 교육 프로그램 및 자료 file AndyLee 2021.03.24 930
» init_pg_dir 도입 패치 분석 [2] DEWH 2020.12.31 233
52 Barrier 가 꼭 필요한지 질문드립니다. [7] 콤퓨타 2020.11.15 1722
51 스터디 모임 질문 [3] 살길바라냐 2019.10.25 1201
50 2020년 스터디 모집 기간 문의 [1] 흰둥흰둥 2019.11.02 741
49 VIM에서 CONFIG_ 설정 확인하기 [19] pororo 2013.07.18 8512
48 ARM Linux Kernel v4.0.5 head.S 분석자료 file 윤창호 2019.05.16 1026
XE Login