커널 익스플로잇에는 필요한 가젯, 커널 함수들의 주소 등의 정보가 필요하다.
커널에서는 KADR에 의해 커널 영역의 주소를 민감한 정보로 처리하고 있으며 일반 로컬 사용자에게 보이지 않는다.
즉, /boot/vmlinuz*, /boot/System.map*, /sys/kernel/debug/, /proc/slabinfo와 같은 것들은 루트만 읽을 수 있다.
Ubuntu 11.04부터 "/proc/sys/kernel/kptr_rr_rrestrict"는 알려진 커널 주소 출력을 차단하기 위해 "1"로 설정되어 있다.
다음과 같이 일반 유저로 "/proc/kallsyms" 파일을 읽으면
심볼의 주소가 0으로 덮여져서 출력되는 것을 확인할 수 있다.
반면, 루트 권한으로 해당 파일을 읽을 경우 각 심볼들의 주소 값이 출력된다.
KADR를 비활성화하기 위해선 "/proc/sys/kernel/kptr_rr_rrestrict"을 "0"으로 변경하면 된다.
하지만 다음과 같이 "kptr_restrict"의 값을 "0"으로 변경해도 일반 유저 권한으로 커널 심볼들의 주소를 확인 할 수 없다.
이유는 바로 "perf_event_paranoid" 때문이다.
"perf_event_paranoid"는 Performance counters(커널의 성능 모니터링)의 액세스 제한 권한을 관리하고 있다.
(음 대충 모니터링하면서 일반 유저에게 커널 민감정보 유출을 막는다는 의미인 듯)
value | description |
2 | 사용자 공간 측정만 허용(Linux 4.6 이후 기본값) |
1 | 커널과 사용자 측정을 모두 허용(Linux 4.6 이전 기본값) |
0 | 원시 추적점 샘플이 아닌 CPU별 데이터에 대한 액세스를 허용 |
-1 | 제한 없음 |
다음과 같이 "perf_event_paranoid"의 값을 1 또는 0, -1로 변경하면
일반 유저 권한으로 커널 심볼들의 주소를 확인 할 수 있다.
'background > linux kernel' 카테고리의 다른 글
Supervisor Mode Execution Prevention(SMEP)/Supervisor Mode Access Prevention(SMAP) (0) | 2024.05.02 |
---|---|
[Linux Kernel Exploit] ROP (with ret2usr) (0) | 2024.04.05 |
[Linux Kernel Exploit] ret2usr (0) | 2024.04.04 |
Kernel Address Space Layout Randomization (KASLR) (0) | 2024.04.03 |
Linux Kernel Debugging (with VMware) (1) | 2024.04.03 |