1. PIE (Position Independent Executable)
- PIE는 패키지 빌드 단계에서 위치 독립 코드로 컴파일/링크된 실행 파일을 말한다. => 실행 파일 자체를 위치 독립적으로 만들어, 어느 메모리 주소에서도 실행 가능하게 함
- 소스 코드 컴파일 시 -fPIE 옵션 사용
- 링크 단계에서 -pie 옵션 사용
gcc -fPIE -02 main.c -o myprogram -pie
- 보안 강화 효과
1) ROP (Return-Oriented Programming 난이도 증대) => PIE는 코드 섹션의 베이스를 재배치 하므로 가젯의 절대 주소를 사전에 알 수 없게 됨
2) 고정 주소 기반 익스플로잇 차단 (하드 고딩된 절대 주소 의미 X)
3) ASLR(Address Space Layout Randomization) 실효성 향상 => 프로세스 메모리 영역의 시작 주소를 무작위로 배치 => PIE가 없으면 실행 파일의 코드 영역은 고정되어 ASLR의 효과가 제한된다. PIE와 ASLR을 함께 사용하면 코드 가젯의 주소를 예측하기 어렵게 되어 ROP 등 공격을 방지하는 데 더 효과적이다.
2. SCCOMP (secure computing)
- 리눅스 커널이 제공하는 보안 기능 => 프로세스가 호출할 수 있는 시스템 호출을 제한
- 초기 방식 Strict 모드 : read(),write(),_exit(), sigreturn() 네 가지 시스템콜만 허용
prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT)
- 현대 seccomp BPF 모드 : 프로세스가 syscall을 호출하면 BPF 필터를 먼저 검사하여 허용/차단을 결정 (seccompt_init(SCMP_ACT_KII) -> sccompt_rul_add() -> seccomp_load)
- 방어 가능한 공격 유형 및 보안 효과
1) 커널 익스플로잇 차단
2) 권한 상승 차단
3) 컨테이너 내부에서 host syscall 호출하는 것을 차단
4) 샌드박스 내 제한된 환경을 벗어나려 하면 허용된 syscall 호출 외는 프로세스 종료
3. Meltdown vulnerablility
- Meltdown은 CPU가 추측 실행하는 과정에서 커널의 비밀 데이터를 실수로 캐시에 남기고, 그 흔적을 통해 사용자 프로그램이 그 데이터를 훔쳐 볼 수 있게 하는 하드웨어 기반의 정보 유출 취약점
- 방어 기법
1) KPTI(Kernel Page-Table Isolation) : 사용자 공간의 페이지 테이블과 커널 전용 페이지 테이블을 분리 => 사용자가 커널 가상 주소를 읽으려고 하면 사용자용 테이블에는 매핑되어 있지 않으므로 실제 물리 메모리의 접근이 발생하지 않도록 한다.
2) CPU 마이크로코드 업데이트 : CPU 내부 동작을 제어하는 펌웨어를 갱신