표제지
목차
국문요약 10
1. 서론 12
1.1. 연구 필요성 및 목적 12
1.2. 연구 방법 14
2. 배경지식 17
2.1. 모놀리식 커널과 마이크로 커널 17
2.2. RISC-V 19
2.2.1. RISC-V Instruction Set Architecture 19
2.2.2. RISC-V Rocket Chip Generator 23
2.2.3. Rocket Custom Co-processor 25
3. 선행 연구 28
3.1. 마이크로 커널 기반의 디바이스 드라이버 격리 29
3.2. 가상화 기반의 디바이스 드라이버 격리 30
3.3. 하드웨어 기반의 디바이스 드라이버 격리 30
4. 연구 방법 32
4.1. 하드웨어 모듈 분석 32
4.2. 확장 RoCC를 위한 커널 패치 35
4.3. 하드웨어 기반 디바이스 드라이버 격리 구현 38
5. 실험 결과 및 고찰 42
5.1. 실험 환경 및 시스템 구성 42
5.1.1. 하드웨어 모듈 환경 구성 42
5.1.2. RISC-V 프로세서 리눅스 부팅 44
5.2. 실험 방법 45
5.3. 하드웨어 모듈에서 제공한 예제 분석 46
5.3.1. Shadow Stack 예제 46
5.3.2. 가상 메모리 주소 기반 차단 예제 51
5.4. 실험 결과 54
5.4.1. 디바이스 드라이버 메모리 주소 격리 54
5.4.2. 패턴 비교를 통한 디바이스 드라이버 격리 56
5.5. 실험 고찰 63
5.5.1. 실험 결과 분석을 통한 실패 원인 분석 64
6. 결론 67
6.1. 연구의 의의 67
6.2. 연구의 한계와 향후 연구 방향 68
A. 개발환경 구축 69
참고문헌 75
ABSTRACT 79
표 1. 기본 ISA 및 표준 확장 목록 20
표 2. 디바이스 드라이버 격리에 관한 선행 연구 28
표 3. RISC-V 확장 기능에 대한 플래그 목록 36
표 4. Shadow stack 예제의 MU 모듈 설정 코드 48
표 5. call과 ret에 대한 어셈블리어 명령어 조합 48
표 6. jalr 어셈블리 명령어 비트 패턴 49
표 7. 메모리 주소 접근 차단을 위한 MU 모듈 설정 코드 51
표 8. 메모리 주소 접근 차단을 위한 예제 타겟 코드 53
표 9. 이상 행위 패턴 생성을 위해 작성한 코드 56
표 10. 어셈블리 명령어 패턴(addi sp, sp, ...) 탐지 코드 58
표 11. 탐지된 어셈블리 명령어 패턴 테스트를 위해 작성한 코드 59
표 12. 어셈블리 명령어 패턴(sd s3, ...) 탐지 코드 59
표 13. 어셈블리 명령어 패턴(jal, ra, ...) 탐지 코드 60
표 14. 어셈블리 명령어 패턴(ld s1, ...) 탐지 코드 60
표 15. 어셈블리 명령어 패턴(다중 패턴) 탐지 코드 62
그림 1. 모놀리식 커널과 마이크로 커널의 구조 비교 18
그림 2. RISC-V 프로세서의 기본 명령어 형식 22
그림 3. RISC-V Rocket Core 5단계 파이프라인 구조도 24
그림 4. Rocket Core와 RoCC 보조 프로세서 간 연동 구조도 25
그림 5. RoCC 명령어 형식 26
그림 6. RoCC Interface의 Command 서브 인터페이스 구조도 27
그림 7. RoCC Interface의 Response 서브 인터페이스 구조도 27
그림 8. Trace Unit 동작 구조도 33
그림 9. 확장 RoCC 내부 구조도 34
그림 10. RISC-V 리눅스 커널의 가상 메모리 레이아웃 39
그림 11. 어셈블리 명령어 패턴으로 변환된 objdump 예시 41
그림 12. Zedboard 보드 이미지와 ARM Linux 부팅 결과 화면 43
그림 13. FPGA에서 구동되는 제안한 RISC-V 시스템 구조도 43
그림 14. Shadow Stack 예제 확인을 위한 ls 명령 실행 화면 46
그림 15. Shadow Stack 예제 확인 결과 화면 47
그림 16. call과 jalr 명령어 비트 패턴(opcode) 비교 49
그림 17. ret과 jalr 명령어 비트 패턴(opcode) 비교 50
그림 18. objdump로 디스어셈블한 결과 화면 52
그림 19. 가상 메모리 주소 기반 차단 예제 실험 결과 53
그림 20. e1000 디바이스 드라이버 메모리 주소 확인(kallsyms 파일) 54
그림 21. e1000 디바이스 드라이버 메모리 주소 확인(modules 파일) 54
그림 22. 64bit 기반 리눅스 커널의 가상 메모리 레이아웃 55
그림 23. _IO_puts 함수로 대체된 printf 함수 57
그림 24. _IO_puts 함수의 어셈블리 명령어 패턴 58
그림 25. 어셈블리 명령어 패턴(addi sp, sp, ...) 탐지 테스트 결과 59
그림 26. 어셈블리 명령어 패턴(sd s3, ...) 탐지 테스트 결과 59
그림 27. 어셈블리 명령어 패턴(jal, ra, ...) 탐지 테스트 결과 60
그림 28. ld s1, ... 어셈블리 명령어 탐지 테스트 결과 61
그림 29. 어셈블리 명령어 패턴 탐지 실험 결과 62
그림 30. RISC-V 기본 ISA의 Opcode Map 65
그림 31. RISC-V Compressed ISA의 Opcode Map 65