init_pg_dir 도입 패치 분석

DEWH 2020.12.31 23:23 조회 수 : 234 추천: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
129 제3회 ETRI 휴먼이해 인공지능 논문경진대회 file 인공지능팩토리1 2024.04.22 19
128 KVM 소스코드를 수정하고자 합니다. [1] 두두 2024.04.20 31
127 [딥러닝러닝데이] AutoML을 활용한 모델 탐색-서호건 file 인공지능팩토리1 2024.01.11 92
126 [랭체인러닝데이] 개인 데이터셋을 통한 llama2 fine-tune - 최재혁 file 인공지능팩토리1 2024.01.05 63
125 [SD러닝데이] 광고에서의 생성 AI 활용 실무사례 모음집 file 인공지능팩토리1 2023.12.07 43
124 [챗GPT 러닝데이] 개발자에게 부탁하기 두려웠던 나머지...(더보기) file 인공지능팩토리1 2023.11.02 74
123 [2023 제3회 K-water AI 경진대회] 어종(魚種) 식별 및 분류 알고리즘 개발 file 인공지능팩토리1 2023.10.25 41
122 제4차 USG AI·데이터 문제해결 제조혁신 경진대회 file 인공지능팩토리1 2023.10.25 17
121 [SD러닝데이] 디자이너의 영상&3D에서의 AI 활용 실전 워크플로우 file 인공지능팩토리1 2023.10.17 17
120 [리눅스 커널 강의] 커널 코어 분석 공유 [1] 이파란 2023.10.11 137
119 [챗GPT 러닝데이 세미나] 사랑의 컨설턴트 챗GPT(챗GPT를 활용한 연애상담) file 인공지능팩토리1 2023.10.05 28
118 [Github] 경로 또는 이름이 바뀐 파일 추적 기능 공유 file 이파란 2023.08.23 60
117 무료세미나 음성 챗봇 만들기와 마이크로소프트 ISV 혜택 및 등록팁 방출! 인공지능팩토리 2023.07.26 23
116 2023 제1회 철도 인공지능 경진대회 인공지능팩토리 2023.07.24 22
115 제2회 통신망 안정성 확보를 위한 인공지능 해커톤 인공지능팩토리 2023.07.21 10
114 무료세미나 - [SD러닝데이] AI야 배경 좀 그려줘 인공지능팩토리 2023.07.13 29
113 [무료세미나] SAM(Segment Anything Model)과 친해지기 인공지능팩토리 2023.07.06 42
112 [경진대회] 2023 AI 대학원 챌린지 with kt 믿:음 ~ 7월 23일(일) 인공지능팩토리 2023.07.05 29
111 [무료세미나] - SD러닝데이 Knock Knock. "Stable Diffusion? 인공지능팩토리 2023.06.30 22
110 위성영상을 활용한 정유탱크·컨테이너 탐지 AI 경진대회 인공지능팩토리 2023.06.22 29
XE Login