kprobes를 이용한 커널 instrumentation
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
kprobes 에 대하여
kprobes는 linux kernel에 내장된 디버깅 API이며 프로세서의 디버그 기능을 기반으로 한다.
linux kernel 소스코드에는 kprobes.txt 문서가 있다.
현재 probe 에는 3가지 종류가 있다.
- kprobe: 커널의 거의 모든 명령어에 삽입할 수 있다.
- jprobe: 커널 함수의 진입점에 삽입되며 함수의 인자에 편리하게 접근할 수 있게 해준다.
- kretprobe: 지정한 함수가 반환될 때 동작한다.
이 정의를 보면 kprobes 인터페이스를 이용해 커널을 여러 흥미로운 방법으로 계측할 수 있다는 것을 상상할 수 있다.
보안을 강화하는 방향으로도 반대로 약화하는 방향으로도 사용할 수 있다.
kprobes 가 커널 자체에서 제공되는 인터페이스라는 점은 장점이지만 뒤에서 살펴볼 여러 제한도 존재한다.
즉, kprobes는 커널의 특정 부분을 패치하는 데 사용할 수 있지만 모든 것을 처리할 수 있는 것은 아니다.
그럼 언제, 어디서 커널의 동작을 수정할 수 있는지 살펴보자.
경우에 따라 다른 패치 방법과 함께 사용해야 할 수도 있다.
몇가지 기본적인 사실은
먼저 등록된 kprobe는 /sys/kernel/debug/kprobes/list에서 확인할 수 있다.
/sys/kerenl/debug/kprobes/enabled 파일에 0 또는 1을 기록하면 kprobes를 비활성화하거나 활성화할 수 있다.
kprobes 소스코드는 다음 위치에 있다.
/usr/src/linux/kernel/kprobes.c
/usr/src/linux/arch/x86/kernel/kprobes.c
jprobes와 kretprobes는 전적으로 kprobes를 기반으로 구현되어 있어 kprobes를 비활성화하면 kretprobe와 jprobe 역시 동작하지 않는다.
jprobe 예제
probe를 등록하거나 해제하는 여러 함수가 제공된다.
예를 들어 sys_mprotect 호출을 관찰하고 어떤 인자가 전달되는지 확인하고 싶다고 할 때
이 경우 sys_mprotect 에 jprobe를 등록할 수 있다.
syscall 에 jprobe를 설정하고 있으므로 handler를 asmlinkage 방식으로 선언하거나 레지스터에서 직접 인자를 얻어야한다.
여기서는 현재 task의 레지스터를 얻는 방법을 보여주기 위해 레지스터에서 직접 인자를 가져온다.
kretprobe 예제와 return probe patching 기법
kretprobe가 없다면 kprobes를 이용해 커널을 패치하는 일이 훨씬 어려워진다.
예를 들어 어떤 커널 함수에 jprobe
kprobes 구현
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
댓글
댓글 쓰기