적재 가능 커널 모듈
적재 가능 커널 모듈 (Loadable kernel module, LKM)은 운영 체제에서 실행 중인 커널을 확장하는 코드를 포함하는 목적 파일이다. LKM은 일반적으로 새로운 하드웨어(장치 드라이버)나 파일 시스템을 위한 지원 또는 시스템 호출을 추가하는데 사용한다. LKM에 의해 제공되는 기능이 더 이상 요구되지 않으면 메모리와 자원을 할당 해제하기 위해 언로드시킬 수 있다.
대부분의 현 유닉스 계열 운영 체제와 마이크로소프트 윈도우는 적재 가능 커널 모듈들을 지원하지만 FreeBSD의 경우 커널 적재 가능 모듈(kernel loadable module, kld), OS X의 경우 커널 확장(kernel extension, kext)[1], 윈도우 NT의 경우 커널 모드 드라이버(kernel-mode driver)[2]처럼 각기 다른 이름을 사용할 수 있다. 커널 적재 가능 모듈(Kernel Loadable Modules, KLM)이라고도 하며 간단히 커널 모듈(Kernel Modules, KMOD)로도 부른다.
비록 이들이 서로 다른 이름을 사용하고 있기는 하지만 대부분의 유닉스 계열 시스템들과 윈도우(커널-모드 드라이버)는 적재 가능 커널 모듈을 지원한다.
장점
[편집]적재 가능 커널 모듈 없이는, 운영 체제는 모든 가능한 예상되는 기능들을 기본 커널에 직접 포함해야 할 것이다. 이것들은 사용되지 않는 동안에도 메모리에 상주함으로써 메모리를 낭비하고 사용자의 리부팅 시간을 늘린다. 적재 가능 커널 모듈을 지원하는 대부분의 운영 체제들은 요구되는 기능들을 지원하기 위해 모듈들을 포함한다.
단점
[편집]모듈러 커널에 대한 비판으로써 일명 단편화 페널티가 있다. 베이스 커널은 항상 자신의 설치 루틴들에 의해 실제 인접한 메모리에 언팩되어 있다. 그래서 베이스 커널은 절대 단편화되지 않는다. 만약 모듈들이 삽입되면 새로운 커널 코드 삽입은 커널을 단편화시킬 수 있고 이것은 작은 성능 페널티를 유발할 수 있다.
운영 체제들에서의 구현
[편집]리눅스
[편집]리눅스에서 적재 가능 커널 모듈은 modprobe
명령어에 의해 적재되고 적재 해제된다. 이것들은 /lib/modules
에 위치하며 커널 버전 2.6부터는 확장자 .ko
("kernel object")를 갖는다.[3] lsmod
명령어는 적재된 커널 모듈들을 보여준다. 긴급 상황에서(시스템이 깨진 모듈들 때문에 부팅에 실패하는 경우 등) 특정한 모듈들은 커널 부트 파라미터 리스트를 수정함으로써 활성화되거나 비활성화될 수 있다. 예를 들면 GRUB을 사용하는 경우 시작 메뉴에서 'e'를 누르면 커널 파라미터 라인을 수정한다.
바이너리 호환성
[편집]리눅스는 커널 모듈들을 위한 안정적인 API나 ABI를 제공하지 않는다. 이것은 다른 커널 버전에서 다른 내부 구조가 존재한다는 것이고 호환성 문제를 유발한다. 이 문제를 해결하기 위해 심볼 버저닝 데이터가 적재 가능한 ELF 모듈들의 .modinfo
섹션 내에 위치한다. 이 버저닝 정보는 모듈을 로딩하기 전에 비교될 수 있다.
솔라리스, FreeBSD, OS X 그리고 윈도우 같은 다른 운영체제는 커널 API와 ABI를 상대적으로 안정적으로 유지해서 이 문제를 피한다.
보안
[편집]적재 가능 커널 모듈이 실행중인 커널을 수정하는 편리한 방식인 반면에 이것은 공격자에 의해 남용될 수 있다. 많은 루트킷들이 자신의 방식으로 LKM을 사용한다. LKM을 적재할 때 확장된 권한을 요구함으로써 대부분의 운영 체제 모듈들은 어떠한 방식으로도 권한 확대를 돕지 않는다는 점을 주의하자.[4]
리눅스
[편집]리눅스는 sysctl 옵션 /proc/sys/kernel/modules_disabled
을 통해 모듈 적재를 비활성화 한다.[5][6] initramfs 시스템은 부팅에 요구되는 특정한 모듈들을 로드하고 이후에는 모듈 로딩을 비활성화시킨다. 이것은 보안을 모놀리딕 커널과 매우 유사하게 만들어 준다. 만약 공격자가 initramfs를 변경할 수 있다면, 그들은 커널 바이너리를 변경할 수 있게 된다.
각주
[편집]- ↑ “Kernel Extension Programming Topics: Introduction”. 애플. 2010년 9월 1일. 2013년 5월 5일에 확인함.
- ↑ “What Determines When a Driver Is Loaded”. 《마이크로소프트 개발자 네트워크》. 마이크로소프트. 2012년 11월 21일. 2013년 5월 5일에 확인함.
- ↑ “The Linux Kernel Module Programming Guide, section 2.2 "Compiling Kernel Modules"”. 2011년 10월 14일에 확인함.
- ↑ Exploiting Loadable Kernel Modules
- ↑ “Sysctl/kernel.txt”. 2013년 1월 4일에 확인함.[깨진 링크(과거 내용 찾기)]
- ↑ Kees Cook (2012년 11월 28일). “Clean module disabling”. outflux.net. 2013년 12월 12일에 확인함.
외부 링크
[편집]- (영어) Anatomy of Linux loadable kernel modules, IBM DeveloperWorks, July 16, 2008, archived from the original on July 26, 2008
- (영어) Online kext database for OSX / Hackintosh Archived 2015년 12월 19일 - 웨이백 머신
- (영어) Ori Pomerantz, Linux Kernel Module Programming Guide
- (영어) Copyright Considerations With LKMs, 2008, archived from the original on June 20, 2008
- (영어) "Kernel Extension Programming Topics" document for OS X Archived 2010년 4월 9일 - 웨이백 머신