커널 익스플로잇에는 필요한 가젯, 커널 함수들의 주소 등의 정보가 필요하다.
커널에서는 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로 변경하면
일반 유저 권한으로 커널 심볼들의 주소를 확인 할 수 있다.
02.Debugging kernel and modules - TechNote - Lazenca.0x0
Excuse the ads! We need some help to keep our site up. List Debugging kernel and modules 커널을 디버깅하는 방법은 다양하게 존재하며, 여기에서는 VMware를 이용한 디버깅을 설명하겠습니다. Debug Symbol Packages 분석의
www.lazenca.net
'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 |